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

Reading many small files from S3 very slow

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

Pig 代码示例

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

Hive 代码示例

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

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

我尝试了以下方法,但没有任何明显效果:

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

您可以:

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

  2. 有一个 pig 脚本可以为您完成一次。

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

请提供这些案例的指标