在我的 Hadoop 流作业的第一步,我的性能非常糟糕:在我看来,映射器从 S3 读取大约 40KB/s - 50KB/s。
从 S3 读取约 100MB 的数据需要一个多小时!
数据的存储方式:S3 存储桶中有数千个 ~5-10KB GZip 文件。
我最近解压了一个 100MB 样本数据集的所有文件,并将其作为单个 GZip 文件上传到同一个 S3 存储桶中,我的任务在 3 分钟内完成(对比之前的 1 小时运行)
受到鼓舞,我解压了一个 2GB 样本数据集的所有文件,并将其作为单个 GZip 文件上传到同一个 S3 存储桶中,我的任务再次花费了 1 个多小时:之后我终止了任务强>.
我还没有玩过 mapred.min.split.size
和 mapred.max.split.size
,但我需要一些样本值来开始玩.
不过,从我在互联网上阅读的帖子来看,就从 S3 读取数据而言,使用 GZip 输入文件为 Hadoop 流任务处理数 GB 的数据似乎不会产生很多损失。
你能分享一下吗:
- 您存储在 S3 上的文件的“blob 大小”以及
- 您在每个任务中处理了多少个
- 处理这些需要多长时间?
我猜测调整 mapred.min.split.size
和 mapred.max.split.size
并保持以上 3 个值对 S3 的最佳考虑将使作业执行时间发生了很大变化。
最佳答案
无法并行读取 gzip 文件。通过将所有文件连接成一个巨大的文件并对其进行 gzip 压缩,您造成了瓶颈。通过以压缩文件大小大致相同、不小于 128Mb 且文件数量等于 Hadoop 集群上的缩减器数量的方式连接和单独 gzip 文件,您可以获得最佳性能。
关于optimization - 为 Hadoop 使用 GZip 输入文件时如何优化 S3 的读取性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11316389/