복붙노트

[HADOOP] 명령 줄을 사용하여 hdfs 분산 파일에서 총 줄 수 찾기

HADOOP

명령 줄을 사용하여 hdfs 분산 파일에서 총 줄 수 찾기

나는 데이터 집합이 분산 방식으로 hdfs에 보관되는 클러스터에서 작업하고 있습니다. 여기에 내가 가진 것이있다.

[hmi@bdadev-5 ~]$ hadoop fs -ls /bdatest/clm/data/
Found 1840 items
-rw-r--r--   3 bda supergroup          0 2015-08-11 00:32 /bdatest/clm/data/_SUCCESS
-rw-r--r--   3 bda supergroup   34404390 2015-08-11 00:32 /bdatest/clm/data/part-00000
-rw-r--r--   3 bda supergroup   34404062 2015-08-11 00:32 /bdatest/clm/data/part-00001
-rw-r--r--   3 bda supergroup   34404259 2015-08-11 00:32 /bdatest/clm/data/part-00002
....
....

데이터 형식은 다음과 같습니다.

[hmi@bdadev-5 ~]$ hadoop fs -cat /bdatest/clm/data/part-00000|head
V|485715986|1|8ca217a3d75d8236|Y|Y|Y|Y/1X||Trimode|SAMSUNG|1x/Trimode|High|Phone|N|Y|Y|Y|N|Basic|Basic|Basic|Basic|N|N|N|N|Y|N|Basic-Communicator|Y|Basic|N|Y|1X|Basic|1X|||SAM|Other|SCH-A870|SCH-A870|N|N|M2MC|

그래서, 원래 데이터 파일 데이터의 총 라인 수를 세고 싶습니다. Part-00000, part-00001 등의 분산 된 덩어리가 겹쳐 있다는 것을 이해합니다. 따라서 part-xxxx 파일의 줄 수를 계산하고 합하면 작동하지 않습니다. 또한 원본 데이터 세트의 데이터 크기는 ~ 70GB입니다. 총 줄 수를 효율적으로 찾는 방법은 무엇입니까?

해결법

  1. ==============================

    1.보다 효율적으로 - 스파크를 사용하여 아니오를 계산할 수 있습니다. 줄의. 다음 코드 스 니펫은 행 수를 계산하는 데 도움이됩니다.

    보다 효율적으로 - 스파크를 사용하여 아니오를 계산할 수 있습니다. 줄의. 다음 코드 스 니펫은 행 수를 계산하는 데 도움이됩니다.

    text_file = spark.textFile("hdfs://...")
    count = text_file.count();
    count.dump();
    

    아니오의 수를 표시합니다. 줄의.

    참고 : 서로 다른 부품 파일의 데이터는 겹치지 않습니다.

    hdfs 사용 dfs -cat / bdatest / clm / data / part- * | wc -l은 출력을 제공하지만 모든 데이터를 로컬 시스템으로 덤프하고 더 오랜 시간이 걸립니다.

    가장 좋은 해결책은 MapReduce 또는 스파크를 사용하는 것입니다. MapReduce는 개발 및 실행에 더 많은 시간이 소요됩니다. 스파크가 설치되어있는 경우 이것이 최고의 선택입니다.

  2. ==============================

    2.데이터의 행 수를 찾아야하는 경우 다음 명령을 사용할 수 있습니다.

    데이터의 행 수를 찾아야하는 경우 다음 명령을 사용할 수 있습니다.

    hdfs dfs -cat /bdatest/clm/data/part-* | wc -l
    

    또한 입력을 출력으로내는 신원 매퍼로 간단한 mapreduce 프로그램을 작성할 수 있습니다. 그런 다음 카운터를 확인하고 매퍼에 대한 입력 레코드를 찾습니다. 데이터의 줄 수입니다.

  3. ==============================

    3.하둡 원 라이너 :

    하둡 원 라이너 :

    hadoop fs -cat /bdatest/clm/data/part-* | wc -l
    

    출처 : http://www.sasanalysis.com/2014/04/10-popular-linux-commands-for-hadoop.html

    또 다른 방법은 매퍼가 각 줄마다 1을 내고 감속기가 값을 합산하는지도 축소 작업을 만드는 것입니다. 솔루션에 대한 레코드 수 계산을위한 MApreduce 코드 작성의 대답을 참조하십시오.

  4. ==============================

    4.JSON 또는 로그 항목을 상상해 보면 거의 동일한 파일 내용을 가진 매우 큰 파일을 가지고 있고 정밀도에 신경 쓰지 않으면 계산할 수 있습니다.

    JSON 또는 로그 항목을 상상해 보면 거의 동일한 파일 내용을 가진 매우 큰 파일을 가지고 있고 정밀도에 신경 쓰지 않으면 계산할 수 있습니다.

    예 : 원시 JSON을 파일에 저장합니다.

    파일 크기 : 750Mo 첫 줄의 크기 : 752 자 (==> 752 옥텟)

    선 => 약 1.020.091

    러닝 캐너 | wc -l은 1.018.932를 준다.

    나쁘지 않아. ^^

  5. ==============================

    5.이것은 "wc -l"명령을 수행하는 하나의 기계로 모든 컨텐츠를 스트리밍하지 않도록하기 위해 fs에 서브 명령 (예 : hadoop fs -wc -l inputdir)이있는 것이 바람직한 일반적인 작업입니다.

    이것은 "wc -l"명령을 수행하는 하나의 기계로 모든 컨텐츠를 스트리밍하지 않도록하기 위해 fs에 서브 명령 (예 : hadoop fs -wc -l inputdir)이있는 것이 바람직한 일반적인 작업입니다.

    효율적으로 라인을 계산하기 위해 다음과 같이 hadoop 스트리밍 및 유닉스 명령어를 사용합니다.

    hadoop jar ${HADOOP_HOME}/hadoop-streaming.jar \
      -Dmapred.reduce.tasks=1 \
      -input inputdir \
      -output outputdir \
      -mapper "bash -c 'paste <(echo "count") <(wc -l)'" \
      -reducer "bash -c 'cut -f2 | paste -sd+ | bc'" 
    

    모든 매퍼는 부품에 "wc -l"을 실행 한 다음 단일 감속기가 모든 매퍼의 수를 합산합니다.

  6. ==============================

    6.이 문제에 대해 hadoop 스트리밍을 사용할 수 있습니다.

    이 문제에 대해 hadoop 스트리밍을 사용할 수 있습니다.

    이것은 당신이 그것을 실행하는 방법입니다 :

    hadoop jar /opt/cloudera/parcels/CDH/lib/hadoop-mapreduce/hadoop-streaming-2.6.0-cdh5.11.0.jar -input <dir> -output <dir> counter_mapper.py -reducer counter_reducery -file counter_mapper.py -file counter_reducer.py
    

    counter_mapper.py

    #!/usr/bin/env python
    
    import sys
    count = 0
    
    for line in sys.stdin:
        count = count + 1
    
    print count
    

    counter_reducer.py

    #!/usr/bin/env python
    
    import sys
    count = 0
    
    for line in sys.stdin:
        count = count +int(line)
    
    print count
    
  7. from https://stackoverflow.com/questions/32079372/finding-total-number-of-lines-in-hdfs-distributed-file-using-command-line by cc-by-sa and MIT license