【问题标题】:Reading many small files from S3 very slow从 S3 读取许多小文件非常慢
【发布时间】:2015-08-19 02:20:02
【问题描述】:

通过 AWS EMR 上的 Hive 或 Pig 从 S3 存储桶将许多小文件(>200000,4kbyte)加载到 HDFS 非常慢。似乎只有一个映射器用于获取数据,但我无法准确确定瓶颈在哪里。

猪代码示例

data = load 's3://data-bucket/'  USING PigStorage(',') AS (line:chararray)

Hive 代码示例

CREATE EXTERNAL TABLE data (value STRING) LOCATION  's3://data-bucket/';

是否有任何已知设置可以加快处理速度或增加用于获取数据的映射器数量?

我尝试了以下没有任何明显效果:

  • 增加#Task 节点
  • 设置 hive.optimize.s3.query=true
  • 手动设置#mappers
  • 将实例类型从中等增加到 xlarge

我知道 s3distcp 会加快进程,但我只能通过进行大量调整(包括设置#workerThreads)来获得更好的性能,并且更喜欢直接在我的 PIG/Hive 脚本中更改参数。

【问题讨论】:

    标签: amazon-web-services amazon-s3 hive apache-pig elastic-map-reduce


    【解决方案1】:

    你可以:

    1. 在工作开始前使用 distcp 合并文件:http://snowplowanalytics.com/blog/2013/05/30/dealing-with-hadoops-small-files-problem/

    2. 有一个猪脚本会为你做一次。

    如果你想通过 PIG 来做,你需要知道生成了多少个映射器。您可以使用以下参数:

    //  to set mapper = nb block size. Set to true for one per file.
    SET pig.noSplitCombination false;
    // set size to have SUM(size) / X = wanted number of mappers
    SET pig.maxCombinedSplitSize 250000000;
    

    请提供这些案例的指标

    【讨论】:

    • 感谢您的回答,但我的问题中已经提到了您的两个选项。1)我知道 s3distcp 是一个选项,尽管我只能通过进行大量参数调整来获得这些“承诺”的性能提升,好像不是很优化,但还是不错的。 2)这正是我想要的,但似乎猪只运行一个地图作业来获取数据并且速度非常慢......
    猜你喜欢
    • 1970-01-01
    • 2021-10-12
    • 2021-03-16
    • 1970-01-01
    • 2019-04-30
    • 1970-01-01
    • 1970-01-01
    • 2017-07-23
    • 2012-06-05
    相关资源
    最近更新 更多