我需要在地图阶段访问一些数据。它是一个静态文件,我需要从中读取一些数据。
我已将数据文件上传到S3。
如何在EMR中运行作业时访问该数据?
如果我只是将文件路径指定为:
s3n://<bucket-name>/path
代码中的会起作用吗?
谢谢
答案 0 :(得分:1)
S3n:// url用于Hadoop读取s3文件。如果要在地图程序中读取s3文件,则需要使用处理s3:// URL格式的库(例如jets3t - https://jets3t.s3.amazonaws.com/toolkit/toolkit.html)或通过HTTP访问S3对象。
快速搜索示例程序会显示此链接。 https://gist.github.com/lucastex/917988
您还可以通过HTTP或HTTPS访问S3对象。这可能需要公开对象或配置其他安全性。然后,您可以使用java本身支持的HTTP url包访问它。
另一个不错的选择是使用s3dist副本作为引导步骤,在Map步骤开始之前将S3文件复制到HDFS。 http://docs.aws.amazon.com/ElasticMapReduce/latest/DeveloperGuide/UsingEMR_s3distcp.html
答案 1 :(得分:0)
我最终做了什么:
1)写了一个小文件,将我的文件从s3复制到集群
hadoop fs -copyToLocal s3n://$SOURCE_S3_BUCKET/path/file.txt $DESTINATION_DIR_ON_HOST
2)为我的EMR作业创建了引导步骤,该步骤在1)中运行脚本。
这种方法并不需要公开S3数据。