Ошибка потоковой сортировки Hadoop

Я пытаюсь отсортировать файл с помощью потоковой передачи Hadoop.

Формат файла следующий

<ID> <TextID> <Offset> <Text> - where ID is alpha numeric, TextID is alpha numeric and Offset is numeric

Я хочу сделать что-то вроде ORDER BY ID, TextID, Offset ASC

Я использую следующую команду потоковой передачи Hadoop:

 hadoop jar /apollo/env/SEOHadoopClient/lib/hadoop-streaming-0.20.205.0.jar \                           
-D mapred.output.key.comparator.class=org.apache.hadoop.mapred.lib.KeyFieldBasedComparator \
-D stream.num.map.output.key.fields=3 \
-D mapred.text.key.comparator.options="-k1 -k2 -k3n" \
-D mapred.text.key.partitioner.options=-k1,1 \
-input /user/sakul/hadoop-streaming-sort/output \
-output /user/sakul/hadoop-streaming-sort/sort-output \
-mapper org.apache.hadoop.mapred.lib.IdentityMapper \
-reducer org.apache.hadoop.mapred.lib.IdentityReducer \
-partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner

Но я получаю следующее исключение в картографах:

   java.io.IOException: Type mismatch in key from map: expected org.apache.hadoop.io.Text, recieved org.apache.hadoop.io.LongWritable
        at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.collect(MapTask.java:1014)
        at org.apache.hadoop.mapred.MapTask$OldOutputCollector.collect(MapTask.java:592)
        at org.apache.hadoop.mapred.lib.IdentityMapper.map(IdentityMapper.java:38)
        at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:50)
        at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:436)
        at org.apache.hadoop.mapred.MapTask.run(MapTask.java:372)
        at org.apache.hadoop.mapred.Child$4.run(Child.java:255)
        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.Child.main(Child.java:249)

Что я здесь делаю неправильно?


person Sachin Kulkarni    schedule 21.10.2013    source источник


Ответы (1)


Я размещаю это здесь в надежде, что это поможет вам, даже спустя столько времени, а также потому, что я уже несколько раз забывал решение этой проблемы.

Как вы могли понять из исключения, IdentityMapper ожидает <K,V> в формате Text,Text>. Формат ввода по умолчанию (org.apache.hadoop.mapred.TextInputFormat) предоставляет <LongWriteable, Text>, поэтому его необходимо изменить с помощью параметра -inputformat:

hadoop jar /apollo/env/SEOHadoopClient/lib/hadoop-streaming-0.20.205.0.jar \                           
-D mapred.output.key.comparator.class=org.apache.hadoop.mapred.lib.KeyFieldBasedComparator \
-D stream.num.map.output.key.fields=3 \
-D mapred.text.key.comparator.options="-k1 -k2 -k3n" \
-D mapred.text.key.partitioner.options=-k1,1 \
-input /user/sakul/hadoop-streaming-sort/output \
-output /user/sakul/hadoop-streaming-sort/sort-output \
-mapper org.apache.hadoop.mapred.lib.IdentityMapper \
-reducer org.apache.hadoop.mapred.lib.IdentityReducer \
-partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner \
-inputformat org.apache.hadoop.mapred.KeyValueTextInputFormat

Я использую org.apache.hadoop.mapred.KeyValueTextInputFormat, который разбивает информацию на первой вкладке или «Если такого байта не существует, ключом будет вся строка, а значение будет пустым». Поскольку это своего рода, это похоже на поведение, которое вы хотите, хотя я, возможно, неправильно вас понял.

person offbyone    schedule 31.10.2013
comment
Спасибо. Я работал, используя -mapper=cat -reducer=sort -k1 и т.д. - person Sachin Kulkarni; 02.11.2013