복붙노트

[HADOOP] 줄 바꿈하기 전에 너무 많은 바이트 : 스파크지도 / 필터 때 java.io.IOException를 던졌습니다 2147483648

HADOOP

줄 바꿈하기 전에 너무 많은 바이트 : 스파크지도 / 필터 때 java.io.IOException를 던졌습니다 2147483648

I는 각각의 라인에 의해 분리 된 두 개의 열에 포함되는 크기 7기가바이트 간단한 파일 데 |이 파일 .I이 작성한 RDD을하지만이 RDD에지도 또는 필터 변환을 사용할 때 너무 많은 바이트 예외를 얻는다.

아래에있는 내 파일의 샘플 데이터입니다.

116010100000000007|33448

116010100000000014|13520

116010100000000021|97132

116010100000000049|82891

116010100000000049|82890

116010100000000056|93014

116010100000000063|43434

116010100000000063|43434

여기에 코드입니다

val input = sparkContext.textFile("hdfsfilePath");

input.filter(x=>x.split("|")(1).toInt > 15000).saveAsTextFile("hdfs://output file path")

아래는 내가 점점 오전 예외입니다.

java.io.IOException: Too many bytes before newline: 2147483648
at org.apache.hadoop.util.LineReader.readDefaultLine(LineReader.java:249)
at org.apache.hadoop.util.LineReader.readLine(LineReader.java:174)
at org.apache.hadoop.mapreduce.lib.input.UncompressedSplitLineReader.readLine(UncompressedSplitLineReader.java:94)
at org.apache.hadoop.mapred.LineRecordReader.<init>(LineRecordReader.java:136)

해결법

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

    1.파이프 구분과 분할 선이, 내가 코드를 변경하고 지금은 작동하는 동안 문제는 내 스칼라 코드로했다. 아래의 변경된 코드입니다.

    파이프 구분과 분할 선이, 내가 코드를 변경하고 지금은 작동하는 동안 문제는 내 스칼라 코드로했다. 아래의 변경된 코드입니다.

              val input = sparkContext.textFile("hdfsfilePath");
    
              input.filter(x=>x.split('|')(1).toInt > 15000).saveAsTextFile("hdfs://output file path")
    

    "|"대신 '|'나는를 사용하도록 neeed 또는 "\\ |" 분할 방법이다.

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

    2.나는 최근에이 문제를 가지고 있었다.

    나는 최근에이 문제를 가지고 있었다.

    나를 위해,이 메모리 문제 또는 스칼라 코드 문제가 아니었다.

    그것은 불완전한 / 잘못된 CSV, 즉 CSV 파일의 마지막 행이 짧은 절단으로 밝혀졌다.

    이 문제를 해결하려면 내가 수동으로 사용하여 마지막 줄을 제거

    sed -i '$d' /fileName
    

    하지만이 공통의 문제하다면, databricks 스파크-CSV 패키지를 사용하는 것이 더있을 수 있습니다 : https://github.com/databricks/spark-csv

    DROPMALFORMED : 그것은 포함하는 스키마와 일치하지 않는 많거나 적은 예상보다 토큰 또는 토큰이 줄을 삭제. 어떤 내 경우에 유용 할 것으로 보인다.

  3. from https://stackoverflow.com/questions/41213879/spark-map-filter-throws-java-io-ioexception-too-many-bytes-before-newline-2147 by cc-by-sa and MIT license