从S3读取许多小文件非常慢

时间:2015-06-04 12:53:07

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

在AWS EMR上通过Hive或Pig从S3 Bucket加载许多小文件(> 200000,4kbyte)到HDFS非常慢。似乎只使用一个映射器来获取数据,但我无法确切地找出瓶颈所在。

Pig Code Sample

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

Hive代码示例

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

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

我尝试了以下操作而没有任何明显的影响:

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

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

1 个答案:

答案 0 :(得分:2)

你可以:

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

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

  3. 如果你想通过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;
    

    请提供有关案件的指标