Проблемы с чтением из кластера EMR в S3 - PullRequest
0 голосов
/ 11 декабря 2019

Я занимаюсь разработкой приложения на 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 были права на чтение, запись и список.
  • Этот пост о том, какчтение из S3 в EMR не помогает.

При отправке искры jar я получаю следующую ошибку: (Обратите внимание на печать маршрута, которым он будетпрочитайте прямо перед вызовом приведенного выше выражения 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 Ответ

1 голос
/ 11 декабря 2019

Java по умолчанию Filereader не может загружать файлы из aws s3. Их можно читать только с помощью сторонних библиотек. Голый читатель s3 поставляется в java aws sdk. Однако у hadoop есть и библиотеки для чтения из s3. Jar-файлы Hadoop предустановлены на спарк-кластере aws emr (фактически, почти на всех спарк-инсталляциях).

Spark поддерживает загрузку данных из файловой системы s3 в фрейм искровых данных напрямую, без каких-либо ручных действий. Все читатели могут читать либо один файл, либо несколько файлов с одинаковой структурой через шаблон глобуса. Читатель json dataframe ожидает по умолчанию 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")
...