通过 AWS CLI 提交 pig 程序时指定 S3 文件位置的位置

where to specify S3 file locations when submitting pig program via AWS CLI

我正在创建集群并通过 AWS CLI 提交 Pig 步骤。 PIG 脚本和脚本的输入文件都存储在 S3 存储桶中。

示例猪脚本:

REGISTER file:/usr/lib/pig/lib/piggybank.jar;
DEFINE XPath org.apache.pig.piggybank.evaluation.xml.XPath();
A = LOAD 's3://my-group/myfolder/somedata.xml' USING org.apache.pig.piggybank.storage.XMLLoader('item') AS (x:chararray);
B = FOREACH A GENERATE XPath(x, 'detail');
STORE B INTO 's3://my-group/myfolder/somedetails';

示例 CLI:

aws emr create-cluster \
--steps Type=PIG,Name='Pig program',ActionOnFailure=CONTINUE, \
Args=[-f,s3://my-group/myfolder/some_script.pig, \
-p,INPUT=s3://my-group/myfolder,-p,OUTPUT=s3://my-group/myfolder] \
--applications Name=Pig --enable-debugging \
--log-uri s3://my-group/myfolder --release-label emr-5.2.0 \
--instance-groups \
InstanceGroupType=MASTER,InstanceCount=1,InstanceType=m3.2xlarge \
InstanceGroupType=CORE,InstanceCount=5,InstanceType=c1.medium \
--name "Test cluster" --ec2-attributes KeyName=ClusterKeyPair

这似乎有效(至少没有失败)...

但是 s3://my-group/myfolder 是否有必要在两个位置都指定?如果不是,写这个的首选方式是什么?

事实证明,在 Pig 脚本中,我可以使用 EMR 作业流程参数 $INPUT$OUTPUT,而不是对位置进行硬编码,如:

A = LOAD '$INPUT' USING org.apache.pig.piggybank.storage.XMLLoader('item') AS (x:chararray);
B = FOREACH A GENERATE XPath(x, 'detail');
STORE B INTO '$OUTPUT';

来源:Programming Elastic Mapreduce, ch. 4