次のHiveクエリがあります。
select count(distinct id) as total from mytable;
自動的に生成されます:
1408マッパー
1減速機
減速機の数を手動で設定する必要があり、次のことを試しました。
set mapred.reduce.tasks=50
set Hive.exec.reducers.max=50
しかし、これらの設定はどれも尊重されていないようです。クエリの実行には永遠に時間がかかります。レデューサーを手動で設定する方法や、クエリを書き換えてレデューサーを増やす方法はありますか?ありがとう!
次のようなHiveでクエリを記述します。
SELECT COUNT(DISTINCT id) ....
常に1つの減速機のみを使用することになります。あなたがすべき:
このコマンドを使用して、必要な数の減速機を設定します。
mapred.reduce.tasks = 50を設定します
クエリを次のように書き換えます。
SELECT COUNT(*)FROM(SELECT DISTINCT id FROM ...)t;
これにより、1つではなく2つのmap + reduceジョブが作成されますが、パフォーマンスは大幅に向上します。
レデューサーの数は、入力ファイルのサイズにも依存します
デフォルトでは1GB(1000000000バイト)です。プロパティHive.exec.reducers.bytes.per.reducerを設定することで変更できます:
hive-site.xmlを変更して
<property>
<name>Hive.exec.reducers.bytes.per.reducer</name>
<value>1000000</value>
</property>
またはセットを使用して
$ Hive -e "set Hive.exec.reducers.bytes.per.reducer=1000000"
conf/mapred-site.xml
構成ファイルでノードごとに生成されるリデューサーの数を設定できます。こちらをご覧ください: http://hadoop.Apache.org/common/docs/r0.20.0/cluster_setup.html .
特に、このプロパティを設定する必要があります。
mapred.tasktracker.reduce.tasks.maximum
マッパーは、ファイルの数、つまり入力分割として呼び出すことができるファイルのサイズに完全に依存します。スプリットは注目に値しますが、データの論理的なスプリットです。例:ファイルサイズは150MB、HDFSのデフォルトブロックは128MBです。 2つの分割、つまり2つのブロックを作成します。 2つのマッパーがこのジョブに割り当てられます。
Imp Note:分割サイズが50MBに指定されていると仮定すると、分割数に完全に依存するため、3 Mapperが起動します。
Imp Note:入力データの10TBが予想され、ブロックサイズが128MBの場合、82,000マップ、Configuration.set(MRJobConfig.NUM_MAPS、int)(フレームワークへのヒントのみを提供する)を使用してさらに高く設定しない限り。
注:分割サイズを指定していない場合、デフォルトのhdfsブロックサイズが分割サイズとして使用されます。
Reducerには3つの主要なフェーズがあります:shuffle、sort and reduce。
コマンド:
1]マップタスクの設定:-D mapred.map.tasks = 4
2]削減タスクの設定:-D mapred.reduce.tasks = 2