Hive:通过 Hue 插入表格产生的文件数量与 pyspark 不同
Posted
技术标签:
【中文标题】Hive:通过 Hue 插入表格产生的文件数量与 pyspark 不同【英文标题】:Hive: insert into table by Hue produces different number of files than pyspark 【发布时间】:2018-02-27 03:38:45 【问题描述】:我有一个 Cloudera 集群,我在一个存储为 Parquet 的 Hive 表中累积大量数据。该表按整数batch_id
进行分区。我插入新一批行的工作流程是首先将行插入到临时表中,然后插入到大型累积表中。我正在使用本地模式 Python Pyspark 脚本来执行此操作。脚本本质上是:
sc = pyspark.SparkContext()
hc = pyspark.HiveContext(sc)
hc.sql(
"""
INSERT INTO largeAccumulatorTable
PARTITION (batch_id = 0)
SELECT * FROM stagingBatchId0
"""
.format(batch_id)
)
我使用这个 shell 脚本执行它:
#!/bin/bash
spark-submit \
--master local[*] \
--num-executors 8 \
--executor-cores 1 \
--executor-memory 2G \
spark_insert.py
我注意到大型累积表中生成的 Parquet 文件非常小(有些只有几 KB)而且数量众多。我想避免这种情况。我希望 Parquet 文件大而少。我尝试在 Pyspark 运行时设置不同的 Hive 配置值无济于事:
设置hive.input.format = org.apache.hadoop.hive.ql.io.CombineHiveInputFormat
将mapred.map.tasks
设置为一个小数字
将num-executors
设置为一个小数字
使用local[1]
master 而不是local[*]
将mapreduce.input.fileinputformat.split.minsize
和mapreduce.input.fileinputformat.split.maxsize
设置为高值
这些更改都不会对 Parquet 文件的数量或大小产生任何影响。但是,当我打开 Cloudera Hue 并输入以下简单语句时:
INSERT INTO largeAccumulatorTable
PARTITION (batch_id = XXX)
SELECT * FROM stagingBatchIdXXX
它的工作方式与我希望的完全一样,生成了少量的 Parquet 文件,大约 100 MB。
我在 Pyspark 中做错了什么?我怎样才能使它达到与 Hue 相同的结果?谢谢!
【问题讨论】:
【参考方案1】:spark 默认随机分区为 200。根据数据大小尝试减少或增加配置值。 sqlContext.sql("set spark.sql.shuffle.partitions=20");
【讨论】:
我通过添加hc.sql("set spark.sql.shuffle.partitions=20")
行进行了尝试,但没有观察到创建的 Parquet 文件数量有任何变化。 :(以上是关于Hive:通过 Hue 插入表格产生的文件数量与 pyspark 不同的主要内容,如果未能解决你的问题,请参考以下文章