Запуск Custom JAR на Amazon EMR с ошибкой (ошибка файловой системы) с использованием ввода и вывода Amazon S3 Bucket

Я пытаюсь запустить пользовательский JAR-файл в кластере Amazon EMR, используя входные и выходные параметры пользовательского JAR-файла в виде сегментов S3 (-input s3n://s3_bucket_name/ldas/in -output s3n://s3_bucket_name/ldas/out)

Когда кластер запускает этот пользовательский JAR, возникает следующее исключение.

Exception in thread "main" java.lang.IllegalArgumentException: **Wrong FS: s3n://s3_bucket_name/ldas/out, expected: hdfs://10.214.245.187:9000**
    at org.apache.hadoop.fs.FileSystem.checkPath(FileSystem.java:644)
    at org.apache.hadoop.hdfs.DistributedFileSystem.getPathName(DistributedFileSystem.java:181)
    at org.apache.hadoop.hdfs.DistributedFileSystem.access$000(DistributedFileSystem.java:92)
    at org.apache.hadoop.hdfs.DistributedFileSystem$11.doCall(DistributedFileSystem.java:585)
    at org.apache.hadoop.hdfs.DistributedFileSystem$11.doCall(DistributedFileSystem.java:581)
    at org.apache.hadoop.fs.FileSystemLinkResolver.resolve(FileSystemLinkResolver.java:81)
    at org.apache.hadoop.hdfs.DistributedFileSystem.delete(DistributedFileSystem.java:581)
    at cc.mrlda.ParseCorpus.run(ParseCorpus.java:101)
    at cc.mrlda.ParseCorpus.run(ParseCorpus.java:77)
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
    at cc.mrlda.ParseCorpus.main(ParseCorpus.java:727)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.hadoop.util.RunJar.main(RunJar.java:212)

Как исправить эту ошибку? Как использовать корзину s3n в качестве файловой системы в Amazon EMR? Кроме того, я думаю, что изменить файловую систему по умолчанию на ведро s3 было бы неплохо, но я не уверен, как это сделать.


person ilam    schedule 28.04.2014    source источник


Ответы (1)


Я бы посоветовал проверить, что ваш jar использует тот же метод обработки параметров, что и здесь: http://java.dzone.com/articles/running-elastic-mapreduce-job

Конкретно,

FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));

В качестве альтернативы мне удалось добавить пользовательские шаги запуска скриптов для копирования файлов из s3 в hadoop или наоборот. В частности, если у вас есть несколько шагов потоковой передачи подряд, полезно хранить все на hdfs. Вы должны уметь создавать простые сценарии bash с чем-то вроде

hadoop fs -cp s3://s3_bucket_name/ldas/in hdfs:///ldas/in

и

hadoop fs -cp hdfs:///ldas/out s3://s3_bucket_name/ldas/out

Затем установите шаг потоковой передачи между hdfs:///ldas/in и hdfs:///ldas/out.

person MattyB    schedule 30.05.2014