0

目前,我在 Amazon EMR 上运行 Pig 脚本以从 S3 加载一堆文件,然后我将进行过滤处理并将数据分组phone number(phonenumber:chararray, bag:{mydata:chararray}). 接下来,我必须将每个电话号码存储到不同的 S3 存储桶中(可能是我有权访问的不同账户中的存储桶)。似乎org.apache.pig.piggybank.storage.MultiStorage是这里最好的用途,但它不起作用,因为我面临两个问题:

  1. 有很多电话号码(大约 20,000 个),将每个电话号码存储到不同的 S3 存储桶中非常慢,甚至程序内存不足。
  2. 我无法查找我的查找表来决定存储桶的位置。

所以我想知道是否有人可以帮忙?第二个可能可以通过编写我自己的UDF存储函数来解决,但是对于第一个,如何解决呢?谢谢。

4

1 回答 1

0

S3每个账户限制为 100 个存储桶。不仅如此,桶的创建不是立即的,因为您需要等待桶准备好。

但是,您可以在存储桶中拥有任意数量的对象。您可以相对快速地将电话号码写为不同的对象。特别是如果您要注意对象的名称:S3 中的对象是按前缀存储的。如果您为所有对象提供相同的前缀,S3 将尝试将所有对象放在同一个“热”区域,从而降低性能。如果你选择前缀不同(通常只是简单地把 id 或 time 颠倒过来),你会显着改善它。

您还可以查看DynamoDB,它是 AWS 中的可扩展 NoSQL DB。您可以在构建索引时获得非常高的吞吐量。您也可以稍后使用 Hive over Elastic MapReduce 将其导出到 S3。

于 2013-01-04T16:27:20.030 回答