从S3中的EMR集群读取问题

时间:2019-12-11 16:18:03

标签: java amazon-web-services apache-spark amazon-s3 amazon-emr

我正在使用Java Spark开发应用程序。生成.jar并将其成功加载到EMR集群。代码的一行显示为:

JsonReader jsonReader = new JsonReader(new FileReader("s3://naturgy-sabt-dev/QUERY/input.json"));

我100%确信:

  • 该文件确实存在。
  • 执行aws s3 cp s3://naturgy-sabt-dev/QUERY/input.json .时,我正确接收到.json文件。
  • 设置IAM策略,以便绑定的EMR角色具有读取,写入和列出的权限。
  • This post about how to read from S3 in EMR无济于事。

提交火花jar时,出现以下错误: (请注意,在调用上述put上面的Java语句之前,将立即读取要打印的路由)

...
...
...
19/12/11 15:55:46 INFO BlockManagerMaster: Registered BlockManager BlockManagerId(driver, 172.31.36.11, 35744, None)
19/12/11 15:55:46 INFO BlockManager: external shuffle service port = 7337
19/12/11 15:55:46 INFO BlockManager: Initialized BlockManager: BlockManagerId(driver, 172.31.36.11, 35744, None)
19/12/11 15:55:48 INFO EventLoggingListener: Logging events to hdfs:///var/log/spark/apps/local-1576079746613
19/12/11 15:55:48 INFO SharedState: Warehouse path is 'hdfs:///user/spark/warehouse'.
#########################################
I am going to read from s3://naturgy-sabt-dev/QUERY/input.json
#########################################
java.io.FileNotFoundException: s3:/naturgy-sabt-dev/QUERY/input.json (No such file or directory)
        at java.io.FileInputStream.open0(Native Method)
        at java.io.FileInputStream.open(FileInputStream.java:195)
        at java.io.FileInputStream.<init>(FileInputStream.java:138)
        at java.io.FileInputStream.<init>(FileInputStream.java:93)
        at java.io.FileReader.<init>(FileReader.java:58)
...
...
...

有人知道发生了什么事吗?

感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:1)

Java默认Filereader无法通过AWS s3加载文件。 只能使用3d方库读取它们。裸露的s3阅读器随附在java aws sdk中。 但是hadoop还具有从s3中读取的库。 Hadoop jar已预先安装在AWS Emr Spark群集上(实际上几乎在所有Spark安装上)。

Spark支持将数据从s3文件系统直接加载到spark数据帧,而无需任何手动步骤。所有读取器都可以通过全局模式读取一个文件或具有相同结构的多个文件。 json dataframe阅读器默认需要new-line delimited json。可以配置。

各种用法

# read single new-line delimited json file, each line is a record
spark.read.json("s3://path/input.json")

# read single serilized json object or array, spanning multiple lines.
spark.read.option("multiLine", true).json("s3://path/input.json")

# read multiple json files 
spark.read.json("s3://folder/*.json")