我想从外部源复制文本文件到HDFS。让我们假设我可以根据它们的大小来组合和分割文件,那么文本文件的大小应该是多少才能获得最佳的自定义Map Reduce作业性能。
HDFS的设计是支持非常大的文件,而不是小文件。与HDFS兼容的应用是那些处理大型数据集的应用。这些应用程序只写入一次数据,但读取一次或多次,并要求这些读取满足流速度。HDFS支持文件的写一次读多语义。在HDFS架构中有一个块的概念。HDFS使用的典型块大小为64mb。当我们将一个大文件放入HDFS时,它被分割成64 MB的块(基于块的默认配置),假设您有一个1GB的文件并且你想要将该文件放在HDFS中,那么将会有1GB/64MB = 16个split/block,这些block将分布在数据节点上文件分割的目的是并行处理和数据的故障转移。这些块/块将驻留在不同的DataNode上集群配置。
映射器如何分配
映射器的数量由MapReduce作业中数据的分割数量决定。在典型的InputFormat中,它与文件数量和文件大小成正比。假设您的HDFS块配置配置为64MB(默认大小),并且您有一个大小为100MB的文件然后会有2个分裂,它将占用2个块,然后2个映射器将被分配基于块,但假设如果你有两个30MB大小的文件(每个文件),那么每个文件将占用一个块,映射器将基于此分配。
所以你不需要拆分大文件,但是如果你处理的是非常小的文件,那么合并它们是值得的。
这个链接将有助于理解小文件的问题。
请参考下面的链接以获得更多关于HDFS设计的详细信息。
http://hadoop.apache.org/docs/r1.2.1/hdfs_design.html