我有一个大小约为13gb的大文本文件。我想使用Hadoop处理该文件。我知道hadoop使用FileInputFormat来创建分配给映射器任务的InputSplits。我想知道hadoop是顺序还是并行创建这些InputSplits。我的意思是它是在单个主机上顺序读取大文本文件并创建拆分文件然后分发到datanode,还是并行读取50mb的块? hadoop在分割之前是否在多个主机上复制大文件?
建议我将文件拆分为50mb块以加快处理速度吗?关于映射器任务的适当拆分大小有很多问题,但不是精确的拆分过程本身。
由于
答案 0 :(得分:0)
我想你想使用MapReduce
而不是Hadoop来处理文件。 Hadoop是一个提供处理和存储大型数据的工具的平台。
hdfs-site.xml
文件中定义为dfs.block.size
。例如,如果dfs.block.size=128
,那么您的输入文件将被拆分为128MB块。这就是HDFS在内部存储数据的方式。对于用户来说,它始终是一个文件。答案 1 :(得分:0)
InputSplits是在客户端创建的,它只是文件的逻辑表示,因为它只包含文件路径,开始和结束偏移值(从linerecordreader初始化函数计算)。所以计算这个逻辑代表。不会花费太多时间,所以需要分割你的块,真正的执行发生在mapper端,执行以并行方式完成。然后客户端将inputsplits放入hdfs,jobtracker从那里获取它,并根据分配它分配一个tasktracker。现在这里一个映射器执行不依赖于另一个。第二个映射器非常清楚它必须开始处理该分裂的位置,因此映射器执行是并行完成的。
答案 2 :(得分:0)
首先让我们了解输入拆分的含义。
当你的文本文件被hdfs划分为128 MB大小(默认)的块时,假设文件的第10行被分割,前半部分在第一个块中,另一半在第二个块中。但是当你提交一个Map程序时,hadoop知道第一个程序段的最后一行(在这里成为输入分割)是不完整的。所以它将第10行的后半部分带到第一个输入分割。这意味着,
1)第1输入分割=第1块+第2块第10行的第2部分
2)第2输入分割=第2块 - 第2块第10行的第2部分。
这是hadoop的内置过程,您无法更改或设置输入拆分的大小。 hadoop v2的块大小默认为128 MB。您可以在安装期间增加但不能减少它。