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

Posted

技术标签:

【中文标题】将文件从 s3:// 复制到本地文件系统【英文标题】:Copying file from s3:// to local file system 【发布时间】:2013-06-08 19:06:16 【问题描述】:

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

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

我得到了错误:

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

我什至无法进入我的 s3 存储桶。我设置了 AWS_ACCESS_KEY 和 AWS_SECRET_KEY 没有成功。我也找不到猪的配置文件来设置适当的字段。

有什么帮助吗?

编辑: 我尝试使用完整的 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 [主要] 信息 org.apache.pig.backend.hadoop.executionengine.HExecutionEngine - 在以下位置连接到 hadoop 文件系统:file:/// 2013-06-08 19:28:33,404 [主] 信息 org.apache.pig.backend.hadoop.executionengi ne.mapReduceLayer.MRCompiler - 文件连接阈值:100 乐观的?假 2013-06-08 19:28:33,404 [主要] 信息 org.apache.pig.backend.hadoop.executionengi ne.mapReduceLayer.MultiQueryOptimizer - 之前的 MR 计划大小 优化:1 2013-06-08 19:28:33,405 [main] INFO org.apache.pig.backend.hadoop.executionengi ne.mapReduceLayer.MultiQueryOptimizer - 之后的 MR 计划大小 优化:1 2013-06-08 19:28:33,405 [main] INFO org.apache.pig.tools.pigstats.ScriptState - Pig 脚本设置是 添加到工作 2013-06-08 19:28:33,429 [main] INFO org.apache.pig.backend.hadoop.executionengi ne.mapReduceLayer.JobControlCompiler - mapred.job.reduce.markreset.buffer.percent 未设置,设置为默认值 0.3 2013-06-08 19:28:33,430 [main] 错误 org.apache.pig.pen.ExampleGenerator - 读取数据时出错。内部的 创建作业配置时出错。 java.lang.RuntimeException:内部 创建作业配置时出错。 在 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。 爪哇:722) 在 org.apache.pig.tools.pigscript.parser.PigScriptParser.Illustrate(PigS criptParser.java:591) 在 org.apache.pig.tools.pigscript.parser.PigScriptParser.parse(PigScript Parser.java:306) 在 org.apache.pig.tools.grunt.GruntParser.parseStopOnError(GruntParser.j 艾娃:189) 在 org.apache.pig.tools.grunt.GruntParser.parseStopOnError(GruntParser.j 艾娃: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) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl。 爪哇:39) 在 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] 错误 org.apache.pig.tools.grunt.Grunt - 错误 29 97:遇到 IOException。例外:创建作业配置的内部错误。日志文件中的详细信息: /home/hadoop/pig_1370719069857.log

【问题讨论】:

【参考方案1】:

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

您可以使用 distcp 或 s3n 中的简单 pig 加载。您可以在 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);

确保您的密钥不包含反斜杠 - 否则它将不起作用。

【讨论】:

另外,每次创建新集群时是否需要编辑 hadoop-site.xml? 我可以将 s3n 文件公开,然后不使用密钥直接复制吗? 当您在 EMR 中创建工作流时,它上面已经有您的凭据。如果您使用 EC2 的角色,则凭据由 InstanceController 处理(我认为这就是它的名称)。如果您使用的是根账户或 IAM 用户,这些凭证应该已经在 site.xml 中。【参考方案2】:

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

【讨论】:

【参考方案3】:

我遇到了同样的错误,最终找到了解决方案。但是,我一次更改了两件事,所以我不确定两者是否都需要(当然是其中之一)。

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

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

解决办法是不带参数启动pig。

我希望这会有所帮助。

吉尔


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>

【讨论】:

以上是关于将文件从 s3:// 复制到本地文件系统的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5:如何将文件从Amazon S3复制(流)到FTP?

AWS S3在两个存储桶之间复制文件和文件夹

将文件/块从 HDFS 复制到从节点的本地文件系统

如何将文件从 HDFS 复制到本地文件系统

如何将文件从 kubernetes Pod 复制到本地系统

text 用于将S3存储桶同步到本地文件系统的Python脚本