在本地模式下运行猪0.14.0时,请使用S3链接



我在本地模式下运行猪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有关。

我如何说服猪正确处理这些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.pigpig -x mapreduce -f script.pig

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

相关内容

最新更新