我正在使用hdfs -put将大型20GB文件加载到hdfs中。目前该流程运行@ 4分钟。我正在尝试改善将数据加载到hdfs的写入时间。我尝试使用不同的块大小来提高写入速度,但得到了以下结果:
512M blocksize = 4mins;
256M blocksize = 4mins;
128M blocksize = 4mins;
64M blocksize = 4mins;
有谁知道瓶颈可能是什么以及我可以探索的其他选项来提高-put cmd的性能?
答案 0 :(得分:14)
20GB / 4分钟,大约85MB /秒。对于具有HDFS协议和网络所有开销的单个驱动器而言,这是非常合理的吞吐量。我敢打赌这是你的瓶颈。在不改变摄取过程的情况下,你无法让神奇的速度更快。
核心问题是20GB是一个相当数量的数据,并且数据作为单个流被推入HDFS。您受到磁盘I / O的限制,考虑到Hadoop集群中有大量磁盘,这是非常蹩脚的。您需要一段时间才能使10GigE网络饱和(也可能是1GigE)。
正如您所见,更改块大小不应更改此行为。它仍然是从磁盘到HDFS的相同数据量。
我建议您将文件拆分为1GB文件并将其分散到多个磁盘上,然后将-put
并行推送它们。如果网络成为瓶颈,您甚至可能希望考虑在多个节点上拆分这些文件。您是否可以更改接收数据的方式以加快速度?明显拆分文件并移动它也需要时间。
答案 1 :(得分:10)
这在很大程度上取决于您的设置细节。首先,要知道4分钟内 20GB是80MBps 。
瓶颈很可能是本地计算机的硬件或以太网连接。我怀疑使用块大小会大大提高您的吞吐量。
如果您的本地计算机具有典型的7200rpm硬盘,其磁盘到缓冲区的传输速率大约是 128MBps ,这意味着它可以在大约2:35将该20BG文件加载到内存中,假设您有20GB备用。但是,您不只是将其复制到内存中,而是将其从内存流式传输到网络数据包,因此您可以理解为处理这些任务会产生额外的开销。
另请参阅wire speed上的维基百科条目,该条目将快速以太网设置为100Mbit / s(~12MB / s)。请注意,在这种情况下,快速以太网是特定的以太网标准组的术语。你显然比这更快。线速是一个很好的衡量标准,因为它可以解决本地计算机上的所有因素。
因此,让我们分解本地计算机上流式处理的不同步骤:
如果不了解有关本地计算机的更多信息,很难指定哪些组件是瓶颈。但是,这些是开始调查比特率的地方。
答案 2 :(得分:2)
您可能想要使用distcp hadoop distcp -Ddfs.block.size = $ [256 * 1024 * 1024] / path / to / inputdata / path / to / outputdata 执行并行复制