我有一个大约13gb大小的大文本文件。我想用hadoop处理这个文件。我知道hadoop使用fileinputformat来创建分配给mapper任务的inputsplit。我想知道hadoop是按顺序还是并行创建这些inputspilt。我的意思是,它是在单个主机上按顺序读取大文本文件并创建拆分文件,然后分发到datanodes,还是并行读取50mb的数据块?hadoop是否在拆分大文件之前在多个主机上复制它?
建议我将文件分成50mb的块以加快处理速度吗?对于Map器任务的适当拆分大小有很多问题,但具体的拆分过程本身却没有。
谢谢
3条答案
按热度按时间snz8szmq1#
首先让我们了解什么是输入分割。
当您的文本文件被hdfs分割成128mb大小的块(默认值)时,假设文件的第10行被分割,文件的前一半在第一块,另一半在第二块。但是当您提交一个map程序时,hadoop知道第一个块的最后一行(这里变成input split)是不完整的。所以它把第10行的后半部分带到第一个输入split。这意味着,
1) 第一次输入分割=第1块+第2块第10行的第2部分
2) 第二次输入分割=第二块-第二块第10行的第二部分。
这是hadoop的内置过程,您不能更改或设置输入拆分的大小。默认情况下,hadoopv2的块大小是128mb。在安装过程中可以增加,但不能减少。
wgx48brx2#
inputsplits是在客户端创建的,它只是文件的一种逻辑表示,从某种意义上说,它只包含文件路径、开始和结束偏移量值(从linerecordreader initialize函数计算)。因此,计算这个逻辑表示不会花费太多时间,因此需要分割块真正的执行发生在Map器端,在Map器端以并行方式执行。然后,客户机将inputsplits放入hdfs中,jobtracker从中获取它,并根据这些splits分配tasktracker。现在这里一个Map器的执行并不依赖于另一个。第二个Map器非常清楚必须从何处开始处理分割,因此Map器的执行是并行的。
f8rj6qna3#
我想你想用
MapReduce
不是hadoop。hadoop是一个提供处理和存储大数据工具的平台。当您将文件存储在hdfs(hadoop文件系统)中时,它会将文件分割成多个块。块的大小在中定义
hdfs-site.xml
文件为dfs.block.size
. 例如,如果dfs.block.size=128
然后您的输入文件将被分割成128mb的块。这就是hdfs在内部存储数据的方式。对于用户来说,它总是作为单个文件。当您将输入文件(存储在hdfs中)提供给mapreduce时,它将为文件的每个块/分割启动mapper任务。这是默认行为。
您不需要将文件分割成块,只需将文件存储在hdfs中,它就会满足您的需要。