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