Счетчик строк отдельных файлов в каталоге HDFS

Я хочу подсчитать количество строк отдельных файлов (вместе с именами файлов) каталога в HDFS, результат должен быть примерно таким:

4 filename_1.txt
20 filename_2.txt
8 filename_3.txt

В настоящее время я использую

hadoop fs -cat /user/TMM/ | туалет -л

который дает общее количество каталогов. (В данном случае, например: 32)

Есть какой-либо способ сделать это?


person Danish Zahid Malik    schedule 08.09.2015    source источник


Ответы (2)


Вы можете сделать это с помощью сценария оболочки, пожалуйста, обратитесь к приведенному ниже фрагменту, который может вам помочь.

for i in $( hadoop fs -ls <hdfs-path> | tr -s ' ' | grep '/' | awk '{print$8}');
   do
      echo $i `hadoop fs -cat $i | wc -l`;
   done;

Это напечатает каждый файл под hdfs-path вместе с количеством строк.

[Примечание: имя файла было напечатано с индексом 8 в выводе hadoop fs -ls из моей версии Hadoop, проверьте его в своей среде соответственно]

person suresiva    schedule 08.09.2015

Если ваш объем данных достаточно мал, вы можете сделать это, но этот подход подразумевает передачу всех данных из вашего кластера HDFS на клиентскую машину. Фигово.

Альтернативой является создание задания MapReduce. Получите имя файла из контекста (getInputSplit) и эммитируйте одно событие для каждой строки ввода, где ключ может быть именем файла, а значение может быть 1. Лучше, если вы создадите локальную агрегацию в карте, чтобы избежать переноса большого количества объектов в редуктор. В редукторе завершите агрегацию и запишите вывод в файл в HDFS.

person RojoSam    schedule 12.09.2015