在考虑目标文件大小,内存使用和执行时间时,这是我完善的方法 . 这些文件还包括snappy压缩和字典编码 .
我的HDFS Blocksize是128兆(128 * 1024 * 1024):
dfs.blocksize
134217728
这是我最后的镶木地板文件,它们都非常接近hdfs块大小 .
133916650 2018-07-06 07:05 /year=2018/month=01/HoldingDetail_201801_0001.parquet
133459404 2018-07-06 07:05 /year=2018/month=01/HoldingDetail_201801_0002.parquet
133668445 2018-07-06 07:05 /year=2018/month=01/HoldingDetail_201801_0003.parquet
134004329 2018-07-06 07:06 /year=2018/month=01/HoldingDetail_201801_0004.parquet
134015650 2018-07-06 07:06 /year=2018/month=01/HoldingDetail_201801_0005.parquet
132053162 2018-07-06 07:06 /year=2018/month=01/HoldingDetail_201801_0006.parquet
132917851 2018-07-06 07:06 /year=2018/month=01/HoldingDetail_201801_0007.parquet
122594040 2018-07-06 07:06 /year=2018/month=01/HoldingDetail_201801_0008.parquet
这就是我这样做的方式..
A.想出大量的行来生成一堆大约10兆左右的SMALL镶木地板文件 . 就我而言,我选择了200,000条记录 . 许多较小的镶木地板文件比一个大型镶木地板文件更节省空间,因为如果单个文件中的数据具有更多种类,则字典编码和其他压缩技术将被放弃 . 一次写出大约10兆也会释放内存 .
您的文件将如下所示:
07916650 2018-07-06 07:05 /year=2018/month=01/HoldingDetail_201801_0001.parquet
12259404 2018-07-06 07:05 /year=2018/month=01/HoldingDetail_201801_0002.parquet
11368445 2018-07-06 07:05 /year=2018/month=01/HoldingDetail_201801_0003.parquet
07044329 2018-07-06 07:06 /year=2018/month=01/HoldingDetail_201801_0004.parquet
13145650 2018-07-06 07:06 /year=2018/month=01/HoldingDetail_201801_0005.parquet
08534162 2018-07-06 07:06 /year=2018/month=01/HoldingDetail_201801_0006.parquet
12178451 2018-07-06 07:06 /year=2018/month=01/HoldingDetail_201801_0007.parquet
11940440 2018-07-06 07:06 /year=2018/month=01/HoldingDetail_201801_0008.parquet
09166540 2018-07-06 07:05 /year=2018/month=01/HoldingDetail_201801_0009.parquet
12594044 2018-07-06 07:05 /year=2018/month=01/HoldingDetail_201801_0010.parquet
11684245 2018-07-06 07:05 /year=2018/month=01/HoldingDetail_201801_0011.parquet
07043129 2018-07-06 07:06 /year=2018/month=01/HoldingDetail_201801_0012.parquet
13153650 2018-07-06 07:06 /year=2018/month=01/HoldingDetail_201801_0013.parquet
08533162 2018-07-06 07:06 /year=2018/month=01/HoldingDetail_201801_0014.parquet
12137851 2018-07-06 07:06 /year=2018/month=01/HoldingDetail_201801_0015.parquet
11943040 2018-07-06 07:06 /year=2018/month=01/HoldingDetail_201801_0016.parquet
B.创建一个包含文件大小的所有较小的镶木地板文件的列表,当它们一起添加时不超过您的HDFS块大小 . 在上面的例子中:
/year=2018/month=01/HoldingDetail_201801_0001.parquet
to
/year=2018/month=01/HoldingDetail_201801_0012.parquet
plus
/year=2018/month=01/HoldingDetail_201801_0014.parquet
占用133,408,651字节 .
C.打开一个名为HoldingDetail_201801_temp.parquet的新文件
一次读取列表中的所有较小文件,并将它们写入临时文件作为镶木地板ROW GROUP . 将每个文件作为一个行组写入是非常重要的,它保留了压缩编码并保证写入的字节数(减去模式元数据)与原始文件大小相同 .
删除列表中的所有较小文件 . 将临时文件重命名为HoldingDetail_201801_0001.parquet .
对剩余的较小文件重复步骤B和C以创建* _0002.parquet,* _0003.parquet,* _0004.parquet等,它们将是大小刚好在hdfs块大小之下的目标文件 .
(我还添加一个检查,如果文件大小的总和> 0.95 * dfs.blocksize然后继续并合并找到的文件)