【问题标题】:How to limit parquet file dimension for a parquet table in hive?如何限制 hive 中镶木地板表的镶木地板文件尺寸?
【发布时间】:2015-12-04 06:45:46
【问题描述】:

我正在尝试在 hive 中创建一个镶木地板表。 我可以创建它,但是当我运行分析表 mytable 计算统计信息时; 我得到了这个结果:

numfiles=800, numrows=10000000, totalSize=18909876 rawDataSize=40000000

为什么表由 800 个文件组成,只有 180 Mb? 还有一个为什么要设置文件数? 我尝试使用 SET parquet.block.size=134217728 但结果是一样的

【问题讨论】:

  • 问题:创建表的作业中有多少个 Mapper / Reducer?如果你有 800 个 Mapper 而没有 Reducer 并且属性 hive.merge.***files 不是 True 那么你将有 800 个物理文件。故事结束。
  • 问题:您检查表中不同INPUT__FILE__NAME 的数量了吗?以及表使用的文件夹中 HDFS 文件的数量(可能因为空数据文件而更高)?
  • 你是如何加载表格的?
  • @ruby @ Samson Scharfrichter 我正在使用带有 spark 的 JavaHiveContext,我在其中放置了 hiveql 查询。我使用“创建表 myTable(.....) 存储为 parquetfile”创建表,然后创建了几个放入 RDD 的对象。我将这个 RDD 保存为 tmp 表,然后我调用 INSERT INTO。
  • @SamsonScharfrichter 我有 800 个不同的 INPUT__FILE__NAME。如何查看表使用的文件夹中 HDFS 文件的数量?

标签: hadoop hive parquet


【解决方案1】:

reducer 的数量决定 parquet 文件的数量。

检查mapred.reduce.tasks参数。

例如您可能有一个仅生成 100 行的 map-reduce 作业,但如果 mapred.reduce.tasks 设置为 800(显式或隐式),您将有 800 个 parquet 文件作为输出(大多数 parquet 文件只有标题,没有实际数据)。

【讨论】:

  • 是的。在我提交我的 spark 应用程序之前,每个 8 核上有 6 个执行程序,它产生了 800 个工作。现在我尝试在驱动程序上只使用一个核心,我只得到 10 个文件(和 10 个作业)。没关系,但我怎样才能使用我所有的资源只获得 10 个文件?
  • 所以可以选为正确答案。每个 reducer 都必须生成自己的输出(parquet)文件。您仍然可以拥有所需数量的映射器并使用减速器数量来查看创建 parquet 文件的时间和读取它的时间之间的良好平衡,具体取决于您的情况更重要的是什么。
【解决方案2】:

您还需要设置 set dfs.blocksize=134217728 以及 SET parquet.block.size=134217728 在进行 hive 插入时,应同时设置块大小。

【讨论】:

  • 我试了,结果还是一样
猜你喜欢
  • 1970-01-01
  • 2019-09-23
  • 1970-01-01
  • 2018-07-01
  • 2015-06-29
  • 2019-06-02
  • 1970-01-01
  • 2019-11-20
  • 2021-09-14
相关资源
最近更新 更多