Spark镶木地板不均匀块状

时间:2018-03-16 14:48:57

标签: hadoop apache-spark apache-spark-sql hadoop2 parquet

由于Out of Memory Errors,我检查了始终是喙的火花作业的输出镶木地板文件。 我在Spark 1.6.0

上使用Cloudera 5.13.1

我注意到镶木地板组的尺寸不均匀。 第一行和最后一行是巨大的。其余的都很小......

镶木地板工具RC = row countTS = total size的缩短输出:

row group 1:                RC:5740100 TS:566954562 OFFSET:4  
row group 2:                RC:33769 TS:2904145 OFFSET:117971092  
row group 3:                RC:31822 TS:2772650 OFFSET:118905225  
row group 4:                RC:29854 TS:2704127 OFFSET:119793188  
row group 5:                RC:28050 TS:2356729 OFFSET:120660675  
row group 6:                RC:26507 TS:2111983 OFFSET:121406541  
row group 7:                RC:25143 TS:1967731 OFFSET:122069351  
row group 8:                RC:23876 TS:1991238 OFFSET:122682160  
row group 9:                RC:22584 TS:2069463 OFFSET:123303246  
row group 10:               RC:21225 TS:1955748 OFFSET:123960700  
row group 11:               RC:19960 TS:1931889 OFFSET:124575333  
row group 12:               RC:18806 TS:1725871 OFFSET:125132862  
row group 13:               RC:17719 TS:1653309 OFFSET:125668057  
row group 14:               RC:1617743 TS:157973949 OFFSET:134217728

这是一个已知的错误吗?如何在Spark中设置镶木地板块大小(行组大小)?

修改
Spark应用程序的作用是:它读取一个大的AVRO文件,然后通过两个分区键分配行(在select中使用distribute by <part_keys>),然后使用以下内容为每个分区写一个镶木地板文件:
DF.write.partitionBy(<part_keys>).parquet(<path>)

2 个答案:

答案 0 :(得分:1)

您的RDD可能分区不均匀。每个块中的行数与RDD的不同分区的大小相关。

创建RDD时,每个分区包含大致相同数量的数据(由于HashPartitioner)。在处理Spark作业之后,一个分区可能包含比另一个分区更多的数据,可能是过滤器转换从一个分区移除了多于另一个分区的行。在编写镶木地板文件之前,可以重新调整分区,调用repartition

编辑:如果问题与分区无关,可能会减少行组的大小可能有所帮助:

sc.hadoopConfiguration.setInt( "parquet.block.size", blockSize ) 

答案 1 :(得分:1)

有一个已知的错误: PARQUET-1337