实木复合地板分区和HDFS文件大小
我的数据是用Parquet文件(平均为< 1mb)编写的相对较小的Avro记录的形式。实木复合地板分区和HDFS文件大小
到目前为止,我用我的本地文件系统来做一些Spark测试。
我使用目录分层结构对数据进行分区。
我不知道是不是更好地“建立”分配到Avro记录和积累更大的文件......然而我想象分区的Parquet文件将“映射”到HDFS分区文件中。
哪种方法最好?
编辑(澄清基于评论):
“建立分区到的Avro记录”:想象我的目录结构是P1 = /P2 = /file.avro并且Avro公司记录包含字段F1和F2。我可以将所有这些保存在包含字段P1,P2,F1和F2的单个Avro文件中。即没有需要与目录的分区结构,因为它全部在Avro记录中存在
关于Parquet分区和HDFS分区:HDFS会在不同的机器上拆分一个大的Parquet文件,这将对应于不同的Parquet分区? (我不知道这是否澄清我的问题 - 如果不是这意味着我真的不明白)
背后使用的文件夹级别划分的主要理由是,当星火例如读取数据,并分区列上有一个过滤器(只要格式为path/partitionName = value,就从文件夹名中提取),它只会读取所需的文件夹(而不是读取所有内容,然后应用过滤器)。所以如果你想使用这种机制在你的文件夹结构中使用层次结构(我经常使用它)。
一般来说,我会建议避免与小数据的许多文件夹在其中(不知道这里的情况)
约星火输入划分(同字不同的含义),从HDFS星火读取时会尝试读取文件,以便分区与HDFS上的文件相匹配(防止混洗),因此如果数据由HDFS分区,则spark会匹配相同的分区。据我所知,HDFS不会对文件进行分区,而是复制它们(以提高可靠性),所以我认为一个大型的parquet文件将转化为HDFS上的单个文件,除非您重新分区或定义分区数量阅读时(根据Spark版本有几种方式,请参见this)
我完全不明白你在问什么(你是指“在Avro记录上建立分区”和“分区Parquet文件将映射到HDFS分区文件“),但我会尝试回答。一般来说,从我的观点来看,处理大文件总是更好(我通常使用每个文件100M-1G的大小)。分区时也应该避免使用少量数据创建文件夹。如果你想创建更大的parquet文件,使用coalesce()。最后当从HDFS实验室读取分区时会匹配输入文件,所以如果你问的是那么是的。 –
@TalJoffe谢谢你的回答,我会考虑一下。我澄清了我的问题,是更好的?我不知道'coalesce()',那可能是我应该看的地方。 –
o.k.大。我看到了你的编辑,所以我给出了一个答案,试试和帮助。我知道这是否回答了你的问题 –