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