在本地模式下运行Pig 0.14.0时使用S3链接?

时间:2017-04-29 23:35:43

标签: hadoop amazon-s3 apache-pig

我在本地模式下运行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链接也失败了。我可以确认LOADREGISTER引用的链接存在,STORE引用的链接不存在,正如Pig所期望的那样。

我已经解决了一些问题。例如,我将jets3t-0.7.1丢弃到$ PIG_HOME / lib中,由于存在S3链接,因此修复了运行时错误。另外,我提供了相关的AWS密钥,我可以确认这些密钥是否有效,因为我使用AWSCLI来完成相同的工作。

如果我使用awscli将文件复制到本地磁盘并重写链接以使用本地文件系统,一切正常。因此,我确信这个问题与S3有关。

如何说服Pig正确处理这些S3链接?

1 个答案:

答案 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.pigpig -x mapreduce -f script.pig

https://community.hortonworks.com/articles/25578/how-to-access-data-files-stored-in-aws-s3-buckets.html