将文件从s3://复制到本地文件系统

时间:2013-06-08 19:06:17

标签: hadoop amazon-web-services amazon-s3 apache-pig hdfs

我是一个新手。我创建了一个集群并ssh到主节点。当我尝试将文件从s3:// my-bucket-name /复制到pig中的本地文件:// home / hadoop文件夹时使用:

cp s3://my-bucket-name/path/to/file file://home/hadoop

我收到错误:

  

2013-06-08 18:59:00,267 [main] ERROR org.apache.pig.tools.grunt.Grunt    - ERROR 29 99:意外的内部错误。必须将AWS Access Key ID和Secret Access Key指定为用户名或密码   (分别)s3 URL,或者设置fs.s3.awsAccessKeyId或   fs.s3.awsSecretAccessKey属性(分别)。

我甚至不能进入我的s3桶。我没有成功设置AWS_ACCESS_KEY和AWS_SECRET_KEY。另外,我无法找到pig的配置文件来设置相应的字段。

请帮忙吗?

编辑: 我尝试使用完整的s3n:// uri

在pig中加载文件
grunt> raw_logs = LOAD 's3://XXXXX/input/access_log_1' USING TextLoader a
s (line:chararray);
grunt> illustrate raw_logs;

我收到以下错误:

  

2013-06-08 19:28:33,342 [主要] INFO   org.apache.pig.backend.hadoop.executionengi ne.HExecutionEngine -   连接到hadoop文件系统:file:/// 2013-06-08 19:28:33,404   [主要] INFO org.apache.pig.backend.hadoop.executionengi   ne.mapReduceLayer.MRCompiler - 文件级联阈值:100   乐观? fal se 2013-06-08 19:28:33,404 [main] INFO   org.apache.pig.backend.hadoop.executionengi   ne.mapReduceLayer.MultiQueryOptimizer - 之前的MR计划大小   优化:1 2013-06-08 19:28:33,405 [主要]信息   org.apache.pig.backend.hadoop.executionengi   ne.mapReduceLayer.MultiQueryOptimizer - 之后的MR计划大小   优化:1 2013-06-08 19:28:33,405 [主要]信息   org.apache.pig.tools.pigstats.ScriptState - Pig脚本设置   加入工作2013-06-08 19:28:33,429 [主要] INFO   org.apache.pig.backend.hadoop.executionengi   ne.mapReduceLayer.JobControlCompiler -   mapred.job.reduce.markreset.buffer.percen t未设置,设置为默认值   0.3 2013-06-08 19:28:33,430 [main] ERROR org.apache.pig.pen.ExampleGenerator - 读取数据时出错。内部   创建作业配置时出错。 java.lang.RuntimeException:内部   创建作业配置时出错。           at org.apache.pig.pen.ExampleGenerator.getExamples(ExampleGenerator.java   :160)           在org.apache.pig.PigServer.getExamples(PigServer.java:1244)           在org.apache.pig.tools.grunt.GruntParser.processIllustrate(GruntParser。   Java的:722)           在org.apache.pig.tools.pigscript.parser.PigScriptParser.Illustrate(PigS   criptParser.java:591)           at org.apache.pig.tools.pigscript.parser.PigScriptParser.parse(PigScript   Parser.java:306)           在org.apache.pig.tools.grunt.GruntParser.parseStopOnError(GruntParser.j)   AVA:189)           在org.apache.pig.tools.grunt.GruntParser.parseStopOnError(GruntParser.j)   AVA:165)           在org.apache.pig.tools.grunt.Grunt.run(Grunt.java:69)           在org.apache.pig.Main.run(Main.java:500)           在org.apache.pig.Main.main(Main.java:114)           at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)           at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl。   Java的:39)           at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces   sorImpl.java:25)           在java.lang.reflect.Method.invoke(Method.java:597)           在org.apache.hadoop.util.RunJar.main(RunJar.java:187)2013-06-08 19:28:33,432 [main] ERROR org.apache.pig.tools.grunt.Grunt    - ERROR 29 97:遇到IOException。例外:创建作业配置的内部错误。日志文件的详细信息:   /home/hadoop/pig_1370719069857.log

3 个答案:

答案 0 :(得分:7)

首先,您应该使用s3n协议(除非您使用s3协议将文件存储在s3上) - s3用于块存储(即类似于hdfs,仅用于s3),s3n用于本机s3文件系统(即你得到你在那里看到的东西)。

您可以使用scp中的distcp或简单的猪负载。您可以提供访问权限和在您获得的异常中指定的hadoop-site.xml中的秘密(有关详细信息,请参阅此处:http://wiki.apache.org/hadoop/AmazonS3),或者您可以将它们添加到uri:

raw_logs = LOAD 's3n://access:secret@XXXXX/input/access_log_1' USING TextLoader AS (line:chararray);

确保你的秘密不包含反斜杠 - 否则它将无效。

答案 1 :(得分:3)

中的

cp

cp s3://my-bucket-name/path/to/file file://home/hadoop

不知道S3。

您可能想要使用:

s3cmd get s3://some-s3-bucket/some-s3-folder/local_file.ext ~/local_dir/ 

不确定为什么s3cmd cp ...没有做它需要做的事情,但s3cmd get ...有效。 而且man s3cmd有:

   s3cmd get s3://BUCKET/OBJECT LOCAL_FILE
          Get file from bucket

答案 2 :(得分:1)

我遇到了这个完全相同的错误,最后点击了解决方案。但是,我一次改变了两件事,所以我不确定两者是否都是必需的(当然其中之一是)。

首先,我确保我的S3数据和我的EMR系统位于同一区域。当我遇到这个问题时,我的数据在美国东部,EMR在美国西部。我标准化了美国东部(弗吉尼亚州),a.k.a。us-east-1,a.k.a美国标准,a.k.a。DEFAULT,a.k.a。N. Virginia。这可能不是必需的,但并没有受到伤害。

其次,当我收到错误时,我按照其中一个视频中的步骤启动了猪,并给它一个“-x local”选项。事实证明,“-x local”似乎可以防止访问s3(见下文)。

解决方案是没有参数的启动猪。

我希望这会有所帮助。

吉尔


hadoop@domU-12-31-39-09-24-66:~$ pig -x local
2013-07-03 00:27:15,321 [main] INFO  org.apache.pig.Main - Apache Pig version 0.11.1-amzn (rexported) compiled Jun 24 2013, 18:37:44
2013-07-03 00:27:15,321 [main] INFO  org.apache.pig.Main - Logging error messages to: /home/hadoop/pig_1372811235317.log
2013-07-03 00:27:15,379 [main] INFO  org.apache.pig.impl.util.Utils - Default bootup file /home/hadoop/.pigbootup not found
2013-07-03 00:27:15,793 [main] INFO  org.apache.pig.backend.hadoop.executionengine.HExecutionEngine - 
Connecting to hadoop file system at: file:///

grunt>  ls s3://xxxxxx.xx.rawdata
2013-07-03 00:27:23,463 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 2999: Unexpected internal error. AWS Access Key ID and
Secret Access Key must be specified as the username or password (respectively) of a s3 URL, or by setting the fs.s3.awsAccessKeyId
or fs.s3.awsSecretAccessKey properties (respectively).
Details at logfile: /home/hadoop/pig_1372811235317.log

grunt> quit

hadoop@domU-12-31-39-09-24-66:~$ pig
2013-07-03 00:28:04,769 [main] INFO  org.apache.pig.Main - Apache Pig version 0.11.1-amzn (rexported) compiled Jun 24 2013, 18:37:44
2013-07-03 00:28:04,771 [main] INFO  org.apache.pig.Main - Logging error messages to: /home/hadoop/pig_1372811284764.log
2013-07-03 00:28:04,873 [main] INFO  org.apache.pig.impl.util.Utils - Default bootup file /home/hadoop/.pigbootup not found
2013-07-03 00:28:05,639 [main] INFO  org.apache.pig.backend.hadoop.executionengine.HExecutionEngine - 
Connecting to hadoop file system at: hdfs://10.210.43.148:9000
2013-07-03 00:28:08,765 [main] INFO  org.apache.pig.backend.hadoop.executionengine.HExecutionEngine - Connecting to map-reduce job tracker at: 10.210.43.148:9001

grunt>  ls s3://xxxxxx.xx.rawdata
s3://xxxxxx.xx.rawdata/rawdata<r 1>  19813
s3://xxxxxx.xx.rawdata/rawdata.csv<r 1> 19813
grunt>