Hive と SparkSQL は、書き込むファイルの数をどのように決定しますか?

Both Hive owns and Spark provide SQL support for Hive, and use SQL to operation the underlying HDFS files of Hive. ファイルを書き込むとき、2 つの方法にはいくつかの違いがあります。

1.ハイブ

1.1 シャッフルなし

次の例に示すように、Hive は MapReduce タスクを介して SQL を介してファイルを書き込みます。

hive> insert into table temp.czc_hive_test_write values ('col1_value', 1),('col1_value', 2);

テーブルにデータを挿入した後、保存されたファイルは hdfs の対応するパスにあります。

$ hadoop fs -ls /user/hive/warehouse/temp.db/czc_hive_test_write/part_date=2018-12-12           
Found 2 items
-rwxrwxrwx   3 hadoop supergroup         26 2019-12-20 15:56 hdfs://sdg/user/hive/warehouse/temp.db/czc_hive_test_write/part_date=2018-12-12/000000_0

各挿入ステートメントが MapReduce タスクを個別に開始し、1 つの MapReduce タスクが 1 つの結果ファイルに対応するため、挿入によって 1 つのファイルが生成されることがわかります。

1.2 シャッフルあり

挿入プロセスにシャッフルがある場合:

hive> insert into table temp.czc_hive_game select count(*), game_id from temp.source_table group by game_id;
...
Hadoop job information for Stage-1: number of mappers: 62; number of reducers: 1
...

Hive で group by を実装するプロセスから、group bygroup byの際にフィールド、つまり上記の例では game_id フィールドをキーとしてシャッフルが実行されることがわかります。実行ログを見ると、タスク全体で62個のマッパーと1個のリデューサーが有効になっていることがわかります.最終データの書き込みプロセスはリデューサーで完了するため、最終書き込みデータのファイル数も1つだけになるはずです.

$ hadoop fs -ls  /user/hive/warehouse/temp.db/czc_hive_game
Found 1 items
-rwxrwxrwx   3 hadoop supergroup        268 2019-12-20 16:31 /user/hive/warehouse/temp.db/czc_hive_game/000000_0

注: レデューサーの数を制御するための Hive のルールは次のとおりです。

Hive がレデューサーの数を決定する方法
: レデューサーの数の設定は、タスク実行の効率に大きく影響します. レデューサーの数が指定されていない場合、Hive は次の 2 つの設定に基づいてレデューサーの数を推測して決定します:
hive .exec.reducers .bytes.per.reducer (各 reduce タスクによって処理されるデータの量、デフォルトは 1G)
hive.exec.reducers.max
つまり、reduce 入力 (map 出力) の合計サイズが1G を超えると、レデューサー タスクは 1 つだけになります。

スパーク SQL

2.1 シャッフルなし

Spark SQL はファイルを操作し、ハイブでコマンドを実行することもできます

spark.sql("insert into table temp.czc_spark_test_write values ('col1_value', 1),('col1_value', 2)")

Hdfs でのファイルのストレージは次のとおりです。

$ hadoop fs -ls  /user/hive/warehouse/temp.db/czc_spark_test_write
Found 2 items
-rwxrwxrwx   3 hadoop supergroup         13 2019-12-20 17:01 /user/hive/warehouse/temp.db/czc_spark_test_write/part-00000-0db5ce49-fb85-4c15-bac8-fa2213a03203-c000
-rwxrwxrwx   3 hadoop supergroup         13 2019-12-20 17:01 /user/hive/warehouse/temp.db/czc_spark_test_write/part-00001-0db5ce49-fb85-4c15-bac8-fa2213a03203-c000

$ hadoop fs -cat /user/hive/warehouse/temp.db/czc_spark_test_write/part-00000-0db5ce49-fb85-4c15-bac8-fa2213a03203-c000
col1_value      1

$ hadoop fs -cat /user/hive/warehouse/temp.db/czc_spark_test_write/part-00001-0db5ce49-fb85-4c15-bac8-fa2213a03203-c000
col1_value      2

同じステートメントでも、spark は 2 つのタスク領域を開始してファイルを並行して書き込み、最終的に 2 つのファイル結果を生成することがわかります。

2.2 シャッフルあり

同様の SQL は、例として Spark でも使用されます。

scala>  spark.sql("insert into table temp.czc_spark_game select count(*), game_id from temp.source_table  group by game_id");
res1: org.apache.spark.sql.DataFrame = []

Hive とは異なり、Spark がシャッフル プロセスを実行すると、シャッフル キーごとにデータを書き込むタスクが開始されます. game_id上記の例のソース データ source_table 内のキーの分布は、合計 26 個の異なるキーです。

hive> select count(distinct game_id) from temp.source_table;
OK
26

したがって、spark はデータを書き込むために 26 のタスクを開始し、最終的な結果ファイルにも 26 個のファイルがあるはずです。

$ hadoop fs -ls hdfs://sdg/user/hive/warehouse/temp.db/czc_spark_game
Found 26 items
-rwxrwxrwx   3 hadoop supergroup          0 2019-12-20 14:46 hdfs://sdg/user/hive/warehouse/temp.db/czc_spark_game/part-00000-2f2213b2-a5b7-4c20-83da-dd25c4b018b9-c000
-rwxrwxrwx   3 hadoop supergroup          8 2019-12-20 14:46 hdfs://sdg/user/hive/warehouse/temp.db/czc_spark_game/part-00007-2f2213b2-a5b7-4c20-83da-dd25c4b018b9-c000
-rwxrwxrwx   3 hadoop supergroup          7 2019-12-20 14:46 hdfs://sdg/user/hive/warehouse/temp.db/czc_spark_game/part-00010-2f2213b2-a5b7-4c20-83da-dd25c4b018b9-c000
-rwxrwxrwx   3 hadoop supergroup          9 2019-12-20 14:46 hdfs://sdg/user/hive/warehouse/temp.db/czc_spark_game/part-00011-2f2213b2-a5b7-4c20-83da-dd25c4b018b9-c000
-rwxrwxrwx   3 hadoop supergroup          9 2019-12-20 14:46 hdfs://sdg/user/hive/warehouse/temp.db/czc_spark_game/part-00012-2f2213b2-a5b7-4c20-83da-dd25c4b018b9-c000
-rwxrwxrwx   3 hadoop supergroup          9 2019-12-20 14:46 hdfs://sdg/user/hive/warehouse/temp.db/czc_spark_game/part-00032-2f2213b2-a5b7-4c20-83da-dd25c4b018b9-c000
-rwxrwxrwx   3 hadoop supergroup         14 2019-12-20 14:46 hdfs://sdg/user/hive/warehouse/temp.db/czc_spark_game/part-00036-2f2213b2-a5b7-4c20-83da-dd25c4b018b9-c000
-rwxrwxrwx   3 hadoop supergroup          9 2019-12-20 14:46 hdfs://sdg/user/hive/warehouse/temp.db/czc_spark_game/part-00043-2f2213b2-a5b7-4c20-83da-dd25c4b018b9-c000
-rwxrwxrwx   3 hadoop supergroup          8 2019-12-20 14:46 hdfs://sdg/user/hive/warehouse/temp.db/czc_spark_game/part-00048-2f2213b2-a5b7-4c20-83da-dd25c4b018b9-c000
-rwxrwxrwx   3 hadoop supergroup         24 2019-12-20 14:46 hdfs://sdg/user/hive/warehouse/temp.db/czc_spark_game/part-00065-2f2213b2-a5b7-4c20-83da-dd25c4b018b9-c000
-rwxrwxrwx   3 hadoop supergroup          9 2019-12-20 14:46 hdfs://sdg/user/hive/warehouse/temp.db/czc_spark_game/part-00066-2f2213b2-a5b7-4c20-83da-dd25c4b018b9-c000
-rwxrwxrwx   3 hadoop supergroup         16 2019-12-20 14:46 hdfs://sdg/user/hive/warehouse/temp.db/czc_spark_game/part-00083-2f2213b2-a5b7-4c20-83da-dd25c4b018b9-c000
-rwxrwxrwx   3 hadoop supergroup          8 2019-12-20 14:46 hdfs://sdg/user/hive/warehouse/temp.db/czc_spark_game/part-00086-2f2213b2-a5b7-4c20-83da-dd25c4b018b9-c000
-rwxrwxrwx   3 hadoop supergroup         16 2019-12-20 14:46 hdfs://sdg/user/hive/warehouse/temp.db/czc_spark_game/part-00101-2f2213b2-a5b7-4c20-83da-dd25c4b018b9-c000
-rwxrwxrwx   3 hadoop supergroup          9 2019-12-20 14:46 hdfs://sdg/user/hive/warehouse/temp.db/czc_spark_game/part-00102-2f2213b2-a5b7-4c20-83da-dd25c4b018b9-c000
-rwxrwxrwx   3 hadoop supergroup          9 2019-12-20 14:46 hdfs://sdg/user/hive/warehouse/temp.db/czc_spark_game/part-00105-2f2213b2-a5b7-4c20-83da-dd25c4b018b9-c000
-rwxrwxrwx   3 hadoop supergroup         14 2019-12-20 14:46 hdfs://sdg/user/hive/warehouse/temp.db/czc_spark_game/part-00111-2f2213b2-a5b7-4c20-83da-dd25c4b018b9-c000
-rwxrwxrwx   3 hadoop supergroup         12 2019-12-20 14:46 hdfs://sdg/user/hive/warehouse/temp.db/czc_spark_game/part-00123-2f2213b2-a5b7-4c20-83da-dd25c4b018b9-c000
-rwxrwxrwx   3 hadoop supergroup          9 2019-12-20 14:46 hdfs://sdg/user/hive/warehouse/temp.db/czc_spark_game/part-00124-2f2213b2-a5b7-4c20-83da-dd25c4b018b9-c000
-rwxrwxrwx   3 hadoop supergroup          8 2019-12-20 14:46 hdfs://sdg/user/hive/warehouse/temp.db/czc_spark_game/part-00136-2f2213b2-a5b7-4c20-83da-dd25c4b018b9-c000
-rwxrwxrwx   3 hadoop supergroup          9 2019-12-20 14:46 hdfs://sdg/user/hive/warehouse/temp.db/czc_spark_game/part-00162-2f2213b2-a5b7-4c20-83da-dd25c4b018b9-c000
-rwxrwxrwx   3 hadoop supergroup          8 2019-12-20 14:46 hdfs://sdg/user/hive/warehouse/temp.db/czc_spark_game/part-00163-2f2213b2-a5b7-4c20-83da-dd25c4b018b9-c000
-rwxrwxrwx   3 hadoop supergroup         10 2019-12-20 14:46 hdfs://sdg/user/hive/warehouse/temp.db/czc_spark_game/part-00165-2f2213b2-a5b7-4c20-83da-dd25c4b018b9-c000
-rwxrwxrwx   3 hadoop supergroup          8 2019-12-20 14:46 hdfs://sdg/user/hive/warehouse/temp.db/czc_spark_game/part-00174-2f2213b2-a5b7-4c20-83da-dd25c4b018b9-c000
-rwxrwxrwx   3 hadoop supergroup         17 2019-12-20 14:46 hdfs://sdg/user/hive/warehouse/temp.db/czc_spark_game/part-00176-2f2213b2-a5b7-4c20-83da-dd25c4b018b9-c000
-rwxrwxrwx   3 hadoop supergroup          9 2019-12-20 14:46 hdfs://sdg/user/hive/warehouse/temp.db/czc_spark_game/part-00199-2f2213b2-a5b7-4c20-83da-dd25c4b018b9-c000

2.3 小さなファイルの問題を解決する

spark のファイルの書き方のせいで、小さいファイルがたくさん生成されて NameNode に圧力がかかり、読み書きのパフォーマンスが低下します. この小さいファイルの問題を解決するために、spark の新しいバージョン (筆者はバージョン 2.4.1 を使用しています.シャッフル プロセスを動的に計画するには、spark.sql.adaptive.enabled プロパティを構成する必要があります。

scala> spark.sql("set spark.sql.adaptive.enabled=true")
scala> spark.sql("insert into table temp.czc_spark_game select count(*), game_id from temp.source_table group by game_id")

spark.sql.adaptive.enabled プロパティを true に設定した後、spark によるファイルへの書き込みの結果は次のようになります。

$ hadoop fs -ls hdfs://sdg/user/hive/warehouse/temp.db/czc_spark_game
Found 1 items
-rwxr-xr-x   3 hadoop supergroup        268 2019-12-20 20:55 hdfs://sdg/user/hive/warehouse/temp.db/czc_spark_game/part-00000-a293e3b3-3136-4f57-bf66-f0ee2d4f8dbb-c000

この結果から、動的計画法の影響でファイルが 1 つしかなく、ファイルの書き込み時に 1 つのタスクしか起動されないことがわかります。動的プログラミングの詳細については、適応実行を参照して、Spark SQL をより効率的かつインテリジェントにします。

おすすめ

転載: blog.csdn.net/ytp552200ytp/article/details/126364208