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.CombineHiveInputFormatmapred.map.tasks设置为一个小数字 将num-executors设置为一个小数字 使用local[1] master 而不是local[*]mapreduce.input.fileinputformat.split.minsizemapreduce.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 不同的主要内容,如果未能解决你的问题,请参考以下文章

hive-staging文件产生的原因和解决方案

Hive小文件问题:如何产生造成影响解放办法

Hive/Spark小文件解决方案(企业级实战)

大数据之Hive:hive的小文件如何处理

新闻实时分析系统Hive与HBase集成进行数据分析 Cloudera HUE大数据可视化分析

Hive 查询 cli 有效,同样通过 hue 失败