12

I'm using hdfs -put to load a large 20GB file into hdfs. Currently the process runs @ 4mins. I'm trying to improve the write time of loading data into hdfs. I tried utilizing different block sizes to improve write speed but got the below results:

512M blocksize = 4mins;
256M blocksize = 4mins;
128M blocksize = 4mins;
64M blocksize = 4mins;

Does anyone know what the bottleneck could be and other options I could explore to improve performance of the -put cmd?

4

3 回答 3

14

20GB / 4 分钟约 85MB/秒。对于具有 HDFS 协议和网络的所有开销的单个驱动器而言,这是相当合理的吞吐量。我打赌那是你的瓶颈。如果不更改摄取过程,您将无法神奇地加快速度。

核心问题是 20GB 是相当大的数据量,并且这些数据作为单个流被推送到 HDFS。考虑到 Hadoop 集群中有大量磁盘,您受到磁盘 I/O 的限制。您需要一段时间才能使 10GigE 网络(也可能是 1GigE)饱和。

如您所见,更改块大小不应更改此行为。它仍然是从磁盘到 HDFS 的相同数量的数据。

我建议您将文件拆分为 1GB 文件并将它们分布在多个磁盘上,然后将它们-put并行推送。如果网络成为瓶颈,您甚至可能想要考虑将这些文件拆分到多个节点上。您能否更改接收数据的方式以加快速度?显然拆分文件并移动它也需要时间。

于 2013-10-24T17:34:35.450 回答
10

这在很大程度上取决于您的设置细节。首先,要知道20GB 在 4 分钟内是 80MBps

瓶颈很可能是您本地机器的硬件或其以太网连接。我怀疑使用块大小会大大提高您的吞吐量。

如果你的本地机器有一个典型的 7200rpm 硬盘驱动器,它的磁盘到缓冲区的传输速率约为128MBps,这意味着它可以在大约 2:35 将那个 20BG 的文件加载到内存中,假设你有 20GB 的空闲空间。但是,您不只是将其复制到内存,而是将其从内存流式传输到网络数据包,因此处理这些任务会产生额外的开销是可以理解的。

另请参阅有关线速的维基百科条目,该条目将快速以太网设置为 100Mbit/s (~12MB/s)。请注意,在这种情况下,快速以太网是一组特定以太网标准的术语。你显然得到了比这更快的速度。线速是一个很好的衡量标准,因为它考虑了本地计算机上的所有因素。

因此,让我们分解本地计算机上流式处理过程中的不同步骤:

  • 从文件中读取一个块并将其加载到内存中。组件:硬盘、内存
  • 将该块拆分并转换为数据包。最后我听说 Hadoop 不使用开箱即用的DMA功能,因此这些操作将由您的 CPU 而不是 NIC 执行。 组件:内存、CPU
  • 将数据包传输到 hadoop 文件服务器。组件:网卡、网络

如果不了解更多关于本地机器的信息,就很难指定这些组件中的哪一个是瓶颈。但是,这些是开始研究比特率的地方。

于 2013-10-24T19:27:55.567 回答
2

您可能想使用 distcp hadoop distcp -Ddfs.block.size=$[256*1024*1024] /path/to/inputdata /path/to/outputdata 执行并行复制

于 2013-10-30T11:29:33.800 回答