2016-04-15 42 views
2

我在S3中创建了一个外部Hive(EMR中为1.0)表。我可以成功地使用Hive将记录插入到此表中,并将它们查询回来,然后直接从S3存储桶中提取文件作为验证。到现在为止还挺好。猪通过HCatStorer()向S3写入“成功”,写入0字节

我希望能够使用Pig(v0.14,同样在EMR上)来读写这个逻辑表。使用HCatLoader()加载工作正常,转储/解释确认我的数据和模式符合预期。

但是,当我尝试使用HCatStorer()编写代码时,我遇到了问题。猪报告成功,N记录,,但0字节,写。我在日志中看不到任何与相关或指示问题相关的内容,并且没有数据写入表/桶。

a = load 'myfile' as (foo: int, bar: chararray); // Just assume that this works. 
dump a; // Records are there 
describe a; // Correct schema, as specified above 
store a into 'mytable' using org.apache.hive.hcatalog.pig.HCatStorer(); 

输出(同样包含的,我可以看到问题,并没有其他指示)的结尾是:

Success! 

... 

Input(s): 
Successfully read 2 records (24235 bytes) from: "myfile" 

Output(s): 
Successfully stored 2 records in: "mytable" 

Counters: 
Total records written : 2 
Total bytes written : 0 
Spillable Memory Manager spill count : 0 
Total bags proactively spilled: 0 
Total records proactively spilled: 0 

值得注意的是:

  • 这工作在相同的环境,如果表格位置在HDFS而不是S3中 - 对于外部和内部表格,以及来自Hive或Pig。
  • 我可以直接成功地用S3存储到S3。 store a into 's3n://mybucket/output' using PigStorage(',');
  • 通过Hive shell插入到相同的查询工作正常。

所以这似乎是Pig/HCatalog/S3作为堆栈的相互作用的问题;其中任何两个似乎都很好。

鉴于我在猪日志中没有看到任何非常有用的东西,我还应该看些什么来调试呢?我应该关注这些技术的任何特定配置参数吗?

+0

哎...! 你已经提到,即使数据被“成功存储”,你仍然无法将数据存储在配置表格中,你能否检查HDFS并找到“mytable”的路径并查看是否有数据? – Pratik

+0

@Pratik在错误的情况下,“mytable”存在于S3中,而不是HDFS ......这就是挑战的症结所在!当我在HDFS中找到“mytable”的版本时,它工作正常,数据按预期显示。 – Greg

+0

@Greg你有没有找到一种解决方案,而不是在emr中进行升级?我需要使用猪来加载s3上的蜂巢表。考虑使用刚刚登陆文件夹中的数据的解决方法,并使用lambda函数将分区添加到配置单元中,但希望全猪解决方案 – TaylerJones

回答

2

我认为在使用HCatalog从猪写入S3时存在一个问题。 由于最终输出数据正被写入_temporary文件,并且永远不会被复制/移动到原始位置。这种奇怪的行为仅在S3上遇到。

在我的情况下输出应写入到S3:// X/Y /,但数据被写入 S3:// X/Y/_temporary/attempt_1466700620679_0019_r_000000_0 /部分-R-00000

解决方法是将HCatalog的输出写入HDFS,然后写入S3。

您可以参考张贴在AWS论坛下面的链接: https://forums.aws.amazon.com/thread.jspa?threadID=230544

+0

是的,谢谢... AWS论坛帖子和解决方法是我的! :-)仍为链接+1 - 有助于追踪此答案的不同线索。 – Greg