2015-10-25 3 views
2

У меня есть файл python для подсчета bigrams с использованием mrjob up на Hadoop (версия 2.6.0), но я не получаю вывод, который я надеюсь и у меня возникли проблемы с расшифровкой вывода в моем терминале, где я ошибаюсь.«Счетчики с шага 1: нет счетчиков найдено» с использованием Hadoop и mrjob

Мой код:

regex_for_words = re.compile(r"\b[\w']+\b") 

class BiCo(MRJob): 
    OUTPUT_PROTOCOL = mrjob.protocol.RawProtocol 

    def mapper(self, _, line): 
    words = regex_for_words.findall(line) 
    wordsinline = list() 
    for word in words: 
     wordsinline.append(word.lower()) 
    wordscounter = 0 
    totalwords = len(wordsinline) 
    for word in wordsinline: 
     if wordscounter < (totalwords - 1): 
      nextword_pos = wordscounter+1 
      nextword = wordsinline[nextword_pos] 
      bigram = word, nextword 
      wordscounter +=1 
      yield (bigram, 1) 

    def combiner(self, bigram, counts): 
    yield (bigram, sum(counts)) 

    def reducer(self, bigram, counts): 
    yield (bigram, str(sum(counts))) 

if __name__ == '__main__': 
    BiCo.run() 

Я написал код в моей функции картографа (в основном, все вверх по линии «выход») на моей локальной машине, чтобы убедиться, что мой код был захват биграмм, как задумано, так Я думаю, что это должно работать нормально ... но, конечно, что-то не так.

Когда я запускаю код на сервере Hadoop, я получаю следующий вывод (извинения, если это больше, чем это необходимо), экран выводит тонну информации, и я еще не уверен, что будет полезно для хонингования в на проблемной области):

HADOOP: 2015-10-25 17:00:46,992 INFO [main] mapreduce.Job (Job.java:monitorAndPrintJob(1355)) - Running job: job_1438612881113_6410 
HADOOP: 2015-10-25 17:00:52,110 INFO [main] mapreduce.Job (Job.java:monitorAndPrintJob(1376)) - Job job_1438612881113_6410 running in uber mode : false 
HADOOP: 2015-10-25 17:00:52,111 INFO [main] mapreduce.Job (Job.java:monitorAndPrintJob(1383)) - map 0% reduce 0% 
HADOOP: 2015-10-25 17:00:58,171 INFO [main] mapreduce.Job (Job.java:monitorAndPrintJob(1383)) - map 33% reduce 0% 
HADOOP: 2015-10-25 17:01:00,184 INFO [main] mapreduce.Job (Job.java:monitorAndPrintJob(1383)) - map 100% reduce 0% 
HADOOP: 2015-10-25 17:01:07,222 INFO [main] mapreduce.Job (Job.java:monitorAndPrintJob(1383)) - map 100% reduce 100% 
HADOOP: 2015-10-25 17:01:08,239 INFO [main] mapreduce.Job (Job.java:monitorAndPrintJob(1394)) - Job job_1438612881113_6410 completed successfully 
HADOOP: 2015-10-25 17:01:08,321 INFO [main] mapreduce.Job (Job.java:monitorAndPrintJob(1401)) - Counters: 51 
HADOOP:   File System Counters 
HADOOP:     FILE: Number of bytes read=2007840 
HADOOP:     FILE: Number of bytes written=4485245 
HADOOP:     FILE: Number of read operations=0 
HADOOP:     FILE: Number of large read operations=0 
HADOOP:     FILE: Number of write operations=0 
HADOOP:     HDFS: Number of bytes read=1013129 
HADOOP:     HDFS: Number of bytes written=0 
HADOOP:     HDFS: Number of read operations=12 
HADOOP:     HDFS: Number of large read operations=0 
HADOOP:     HDFS: Number of write operations=2 
HADOOP:   Job Counters 
HADOOP:     Killed map tasks=1 
HADOOP:     Launched map tasks=4 
HADOOP:     Launched reduce tasks=1 
HADOOP:     Rack-local map tasks=4 
HADOOP:     Total time spent by all maps in occupied slots (ms)=33282 
HADOOP:     Total time spent by all reduces in occupied slots (ms)=12358 
HADOOP:     Total time spent by all map tasks (ms)=16641 
HADOOP:     Total time spent by all reduce tasks (ms)=6179 
HADOOP:     Total vcore-seconds taken by all map tasks=16641 
HADOOP:     Total vcore-seconds taken by all reduce tasks=6179 
HADOOP:     Total megabyte-seconds taken by all map tasks=51121152 
HADOOP:     Total megabyte-seconds taken by all reduce tasks=18981888 
HADOOP:   Map-Reduce Framework 
HADOOP:     Map input records=28214 
HADOOP:     Map output records=133627 
HADOOP:     Map output bytes=2613219 
HADOOP:     Map output materialized bytes=2007852 
HADOOP:     Input split bytes=304 
HADOOP:     Combine input records=133627 
HADOOP:     Combine output records=90382 
HADOOP:     Reduce input groups=79518 
HADOOP:     Reduce shuffle bytes=2007852 
HADOOP:     Reduce input records=90382 
HADOOP:     Reduce output records=0 
HADOOP:     Spilled Records=180764 
HADOOP:     Shuffled Maps =3 
HADOOP:     Failed Shuffles=0 
HADOOP:     Merged Map outputs=3 
HADOOP:     GC time elapsed (ms)=93 
HADOOP:     CPU time spent (ms)=7940 
HADOOP:     Physical memory (bytes) snapshot=1343377408 
HADOOP:     Virtual memory (bytes) snapshot=14458105856 
HADOOP:     Total committed heap usage (bytes)=4045406208 
HADOOP:   Shuffle Errors 
HADOOP:     BAD_ID=0 
HADOOP:     CONNECTION=0 
HADOOP:     IO_ERROR=0 
HADOOP:     WRONG_LENGTH=0 
HADOOP:     WRONG_MAP=0 
HADOOP:     WRONG_REDUCE=0 
HADOOP:   Unencodable output 
HADOOP:     TypeError=79518 
HADOOP:   File Input Format Counters 
HADOOP:     Bytes Read=1012825 
HADOOP:   File Output Format Counters 
HADOOP:     Bytes Written=0 
HADOOP: 2015-10-25 17:01:08,321 INFO [main] streaming.StreamJob (StreamJob.java:submitAndMonitorJob(1022)) - Output directory: hdfs:///user/andersaa/si601f15lab5_output 
Counters from step 1: 
    (no counters found) 

Я смущенный, почему нет счетчиков не будет найдено, начиная с шага 1 (то, что я предполагаю, что картограф часть моего кода, который может быть ложным предположением) , Если я правильно читаю любой из выходных данных Hadoop, похоже, что это делает его, по крайней мере, на стадии уменьшения (поскольку есть группы «Уменьшить вход»), и он не находит ошибок перепутывания. Я думаю, что могут быть некоторые ответы на то, что происходит не так в «Unencodable output: TypeError = 79518», но никакое количество поисковых запросов Google, которые я сделал, не помогло понять, что это за ошибка.

Любая помощь или понимание очень ценятся.

ответ

0

Одна из проблем заключается в кодировании bigram преобразователя. Так оно кодируется выше, биграмм типа питона «Кортеж»:

>>> word = 'the' 
>>> word2 = 'boy' 
>>> bigram = word, word2 
>>> type(bigram) 
<type 'tuple'> 

Обычно простые строки используются в качестве ключей. Поэтому вместо этого создайте bigram как строку. Один из способов, вы можете сделать это:

bigram = '-'.join((word, nextword)) 

Когда я внести изменения в вашей программе, то я вижу выхода, как это:

automatic-translation 1 
automatic-vs 1 
automatically-focus 1 
automatically-learn 1 
automatically-learning 1 
automatically-translate 1 
available-including 1 
available-without 1 

Еще одна подсказка: попробуйте -q на командной строке в тишине все промежуточные шумы hadoop. Иногда это мешает.

HTH.