我在本地模式下运行Pig 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有关。
如何说服Pig正确处理这些S3链接?
答案 0 :(得分:0)
AFAIK,Pig从S3读取的方式是通过HDFS。此外,为了使Pig能够访问HDFS,Pig不能在本地运行。为了方便地设置非本地猪,我建议您启动一个EMR cluster(我试过这个)。
首先,您需要正确设置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
如果没有错误,那么您现在可以在Pig中使用S3路径。在MapReduce或Tez模式下运行Pig:
pig -x tez -f script.pig
或pig -x mapreduce -f script.pig
。