Использование s3distcp с Amazon EMR для копирования одного файла

Я хочу скопировать только один файл в HDFS, используя s3distcp. Я попытался использовать аргумент srcPattern, но это не помогло, и он продолжает вызывать исключение java.lang.Runtime. Возможно, виновато регулярное выражение, которое я использую, пожалуйста, помогите.

Мой код выглядит следующим образом:

elastic-mapreduce -j $jobflow --jar s3://us-east-1.elasticmapreduce/libs/s3distcp/1.latest/s3distcp.jar --args '--src,s3://<mybucket>/<path>' --args '--dest,hdfs:///output' --arg --srcPattern --arg '(filename)'

Выброшено исключение:

Exception in thread "main" java.lang.RuntimeException: Error running job at com.amazon.external.elasticmapreduce.s3distcp.S3DistCp.run(S3DistCp.java:586) at com.amazon.external.elasticmapreduce.s3distcp.S3DistCp.run(S3DistCp.java:216) at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:65) at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:79) at com.amazon.external.elasticmapreduce.s3distcp.Main.main(Main.java:12) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.apache.hadoop.util.RunJar.main(RunJar.java:156) Caused by: org.apache.hadoop.mapred.InvalidInputException: Input path does not exist: hdfs:/tmp/a088f00d-a67e-4239-bb0d-32b3a6ef0105/files at org.apache.hadoop.mapred.FileInputFormat.listStatus(FileInputFormat.java:197) at org.apache.hadoop.mapred.SequenceFileInputFormat.listStatus(SequenceFileInputFormat.java:40) at org.apache.hadoop.mapred.FileInputFormat.getSplits(FileInputFormat.java:208) at org.apache.hadoop.mapred.JobClient.writeOldSplits(JobClient.java:1036) at org.apache.hadoop.mapred.JobClient.writeSplits(JobClient.java:1028) at org.apache.hadoop.mapred.JobClient.access$700(JobClient.java:172) at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:944) at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:897) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:396) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1059) at org.apache.hadoop.mapred.JobClient.submitJobInternal(JobClient.java:897) at org.apache.hadoop.mapred.JobClient.submitJob(JobClient.java:871) at org.apache.hadoop.mapred.JobClient.runJob(JobClient.java:1308) at com.amazon.external.elasticmapreduce.s3distcp.S3DistCp.run(S3DistCp.java:568) ... 9 more

person Amar    schedule 21.11.2012    source источник
comment
Кто бы ни проголосовал за это, могу ли я узнать причину этого?   -  person Amar    schedule 14.12.2012
comment
Что делать, если у вас есть много файлов размером 15 ГБ в заданном месте в s3, но вашей работе нужен только один из них, и вы хотите, чтобы этот файл был в ваших локальных hdfs через s3distcp!   -  person Amar    schedule 14.12.2012


Ответы (2)


DistCp предназначен для копирования множества файлов с использованием множества машин. DistCp не подходит, если вы хотите скопировать только один файл.

На главном узле Hadoop вы можете скопировать один файл, используя

hadoop fs -cp s3://<mybucket>/<path> hdfs:///output

person prestomation    schedule 10.06.2013
comment
Спасибо. Хотя это может быть и не так, но вы, безусловно, можете скопировать его с помощью S3distcp. Рассмотрим сценарий, когда у вас есть автоматический запуск конвейера, в котором запускается кластер и добавляются шаги, в этих сценариях пригодится s3distcp. Теперь предположим, что у меня есть ОДИН gzip-файл размером 20 ГБ, что соответствует одному мапперу, работающему в течение нескольких часов (около 10 часов в нашем случае); используя его с опцией '--outputCodec none' s3distcp, он не только копирует файлы в HDFS, но и распаковывает файл, позволяя Hadoop создавать разбиение ввода, что позволяет нам использовать более одного преобразователя (время сокращается до 2 часов). - person Amar; 18.06.2013
comment
Я должен добавить, что s3distcp не работает, когда я пытаюсь скопировать один файл с s3. Я должен указать префикс, а затем шаблон, чтобы получить нужный мне файл. Совершенно не очевидно из документации. - person Tim; 02.04.2016

Регулярное выражение, которое я использовал, действительно было виновником. Скажем, имена файлов имеют даты, например, файлы похожи на abcd-2013-06-12.gz , тогда для копирования ТОЛЬКО этого файла должна выполняться следующая команда emr:

elastic-mapreduce -j $jobflow --jar s3://us-east-1.elasticmapreduce/libs/s3distcp/1.latest/s3distcp.jar --args '--src,s3:///' --args '--dest,hdfs:///output' --arg --srcPattern --arg '.*2013-06-12.gz'

Если я правильно помню, мое регулярное выражение изначально было *2013-06-12.gz, а не .*2013-06-12.gz. Поэтому нужна была точка в начале.

person Amar    schedule 18.06.2013