我在本地模式下运行猪0.14。我正在通过S3中的数据运行简单的脚本。我想在这些脚本中直接引用这些文件,例如:
x = LOAD 's3://bucket/path/to/file1.json' AS (...);
// Magic happens
STORE x INTO 's3://bucket/path/to/file2.json';
但是,当我使用以下命令行时:
$PIG_HOME/bin/pig -x local -P $HOME/credentials.properties -f $HOME/script.pig
我有以下错误:
Failed Jobs:
JobId Alias Feature Message Outputs
N/A mainplinks MAP_ONLY Message: org.apache.pig.backend.executionengine.ExecException: ERROR 2118: Input path does not exist: s3://bucket/path/to/file.json
at org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.PigInputFormat.getSplits(PigInputFormat.java:279)
at org.apache.hadoop.mapred.JobClient.writeNewSplits(JobClient.java:962)
at org.apache.hadoop.mapred.JobClient.writeSplits(JobClient.java:979)
at org.apache.hadoop.mapred.JobClient.access$600(JobClient.java:174)
at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:897)
at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:850)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:422)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1121)
at org.apache.hadoop.mapred.JobClient.submitJobInternal(JobClient.java:850)
at org.apache.hadoop.mapred.JobClient.submitJob(JobClient.java:824)
at org.apache.hadoop.mapred.jobcontrol.Job.submit(Job.java:378)
at org.apache.hadoop.mapred.jobcontrol.JobControl.startReadyJobs(JobControl.java:247)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.pig.backend.hadoop20.PigJobControl.mainLoopAction(PigJobControl.java:157)
at org.apache.pig.backend.hadoop20.PigJobControl.run(PigJobControl.java:134)
at java.lang.Thread.run(Thread.java:748)
at org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher$1.run(MapReduceLauncher.java:276)
Caused by: org.apache.hadoop.mapreduce.lib.input.InvalidInputException: Input path does not exist: s3://com.w2ogroup.analytics.soma.prod/airy/fb25b5c6/data/mainplinks.json
at org.apache.hadoop.mapreduce.lib.input.FileInputFormat.listStatus(FileInputFormat.java:235)
at org.apache.hadoop.mapreduce.lib.input.FileInputFormat.getSplits(FileInputFormat.java:252)
at org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.PigInputFormat.getSplits(PigInputFormat.java:265)
... 20 more
file:/tmp/temp-948194340/tmp-48450066,
我可以确认LOAD
失败;我怀疑STORE
也会失败。REGISTER
S3链接也失败。我可以确认存在LOAD
和REGISTER
所引用的链接,并且STORE
所指的链接不如Pig所期望的。
我已经解决了一些问题。例如,我将JETS3T-0.7.1删除到$ pig_home/lib中,由于S3链接的存在,该错误固定了运行时错误。此外,我还提供了相关的AWS键,我可以确认这些键有效,因为我使用它们AWSCLI进行相同的工作。
如果我使用AWSCLI将文件复制到本地磁盘并重写链接以使用本地文件系统,则一切正常。因此,我坚信该问题与S3有关。
我如何说服猪正确处理这些S3链接?
afaik,猪从S3读取的方式是通过HDFS。此外,为了猪能够进入HDF,猪必须在本地不得运行。为了轻松设置非本地猪,我建议您旋转EMR簇(我已经尝试过(。
因此,首先您需要正确设置HDFS才能从S3访问数据。在您的hdfs-site.xml
配置上,请确保为fs.s3a
键设置值:
<property>
<name>fs.s3a.access.key</name>
<value>{YOUR_ACCESS_KEY}</value>
<description>AWS access key ID. Omit for Role-based authentication.</description>
</property>
<property>
<name>fs.s3a.secret.key</name>
<value>{YOUR_SECRET_KEY}</value>
<description>AWS secret key. Omit for Role-based authentication.</description>
</property>
不需要重新启动HDFS服务,但是这样做没有害处。要重新启动服务,请运行initctl list
,然后运行sudo stop <service name according to initctl output>
。
验证您可以通过运行(注意S3A协议(从HDFS访问S3:
$ hdfs dfs -ls s3a://bucket/path/to/file
如果您没有错误,那么您现在可以使用猪中的S3路径。在MapReduce或Tez模式下运行Pig:
pig -x tez -f script.pig
或pig -x mapreduce -f script.pig
。
https://community.hortonworks.com/articles/25578/how-to-to-cescess-data-files-stored-in--in-aws-s3-buckets.html