Hadoop put 性能 - 大文件 (20GB)



我正在使用hdfs -put将一个20GB的大文件加载到hdfs中。目前该过程运行@ 4分钟。我正在尝试缩短将数据加载到 hdfs 中的写入时间。我尝试利用不同的块大小来提高写入速度,但得到以下结果:

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

有谁知道瓶颈可能是什么以及我可以探索的其他选项来提高 -put cmd 的性能?

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

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

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

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

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

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

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

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

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

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

如果不了解有关本地计算机的更多信息,则很难指定这些组件中的哪些是瓶颈。 但是,这些是开始调查比特率的地方。

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

最新更新