에러 상황1)

sqoop export --connect.. --table mysql 타겟 테이블 --export-dir hdfs://nameservice1... 시 

export dir hive 테이블이 ORC 테이블이여서.. export 에러가 났다.

 

관련 개념)

Hive 테이블 생성 종류

CREATE TABLE IF NOT EXISTS 테이블명 (

..

)

PARTITIONED BY (column_name datatype)

ROW FORMAT DELIMITED

FIELDS TERMINATED BY '\001'

LINES TERMINATED BY '\n'

 

1) 로우 포맷, ROW FORMAT DELIMITED

- 행과 특정 행의 필드가 저장된 방식을 지시한다.

- 기본 행 문자는 아스키 제어 코드의 ctrl A (^A) 문자다.

- FIELDS TERMINATED BY '\001'는 하이브가 필드 구분자를 ^A character로 사용하겠다는 것.

- LINES TERMINATED BY '\n'는 라인을 \n (아스키 코드)로 구분하겠다는 것.

 

2) 바이너리 저장 포맷, STORED AS ORC

바이너리 포맷은 행의 형식이 특정 바이너리 포맷에 따라 결정되므로 ROW FORMAT을 지정하지 않아도 된다.

CREATE TABLE IF NOT EXISTS 테이블명 (

..

)

PARTITIONED BY (column_name datatype)

STORED AS ORC

TBLPROBERTIES ('ORC.COMPRESS' = 'SNAPPY')

- The TBLPROPERTIES clause allows you to tag the table definition with your own metadata key/value pairs

- SNAPPY는 codec이다. snappy is fast data compression and decompression library written in C++.......

 

에러 상황2)

sqoop export --connect.. --table mysql 타겟 테이블 --export-dir hdfs://nameservice1... 시 

export-dir인 hive 경로 테이블 컬럼에 null값이 있는 경우 sqoop이 되지 않고 에러가 발생한다.

 

에러 확인:

hadoop application 로그를 보면,,

Caused by: java.lang.RuntimeException: Can't parse input data: '\n'로 에러 로그를 확인할 수 있다.

 

해결 방법:

export 출처 hive 디렉토리 테이블에서 어떤 필드가 null값을 가지는지 확인하고 쿼리에서 제외처리해준다.

 

더나아가서..

무조건 null값은 제외해주는게 맞는 방법인가싶다.

시스템에서 수집되는 값이 널이거나, 중간에 전처리 과정에서 조인이 되지 않아 null인 경우도 있는데

근본적으로 데이터가 제대로 들어오지 않은 원인을 찾는게 중요할 것같다.

 

'Hadoop > 수집: Sqoop' 카테고리의 다른 글

sqoop error fixed: Directory could not be cleaned up  (0) 2022.01.05

Jupyter notebook에서 pyspark를 실행하려고 했는데, 아래와 같이 에러가 뜨면서 잘 돌아가던 코드가 돌아가지 않게 됨.

RuntimeError: Java gateway process exited before sending its port number jupyter notebook pyspark

 

anaconda package를 통해서 모든 라이브러리를 사용하고 있었기 때문에, java sdk도 conda에서 제공해주는 것으로 재설치했다.

설치 명령어: conda install -c cyclus java-jdk

 

콘다가 지원해주는 방식으로 설치하면 아래 경로에 자동으로 java-sdk 버전이 변경되는 것을 볼 수 있었다.

 

  environment location: /Users/kelly/opt/anaconda3

  added / updated specs:
    - java-jdk

The following packages will be downloaded:

    package                    |            build
    ---------------------------|-----------------
    java-jdk-8.25.17           |                0       351.1 MB  cyclus
    ------------------------------------------------------------
                                           Total:       351.1 MB

The following packages will be UPDATED:

  java-jdk                      bioconda::java-jdk-7.0.91-1 --> cyclus::java-jdk-8.25.17-0

 

설치하기 전에는 java -version으로 확인했을 때, java version이 1.7.* 버전이었는데

재설치를 하니 1.8.* 버전으로 업데이트 됨을 확인할 수 있었다.

 

이렇게 conda install로 jdk 재설치를 하니, 에러가 해결되고 pyspark 모듈이 잘 불러와짐을 확인했다.

 

참고: https://anaconda.org/cyclus/java-jdk

 

 

스파크가 잡을 실행하는 방법

1. 잡제출

스파크 잡은 RDD에 count()와 같은 액션이 호출될 때 자동으로 제출된다.

스케쥴러는 두 부분으로 구성이 되어있다.

DAG 스케쥴러는 잡을 스테이지의 DAG로 구분한다.

테스크 스케쥴러는 각 스테이지의 관련 테스크를 클러스터에 제출한다 (?)

 

DAG 구성

job이 stage로 구분되는 방법을 이해하려면 먼저 stage에서 실행되는 테스크의 종류를 알아야함.

- shuffle map task, result task가 있다.

- shuffle map task는 RDD partition 당 하나의 계산을 실행하고 그 결과를 새로운 파티션 집합에 저장함.

저장된 새로운 파티션의 데이터는 다음 스테이지에서 사용된다.

- result task는 count() 액션 결과처럼 그 결과를 사용자에게 돌려주는 마지막 스테이지에서 실행된다.

result task는 RDD partition에서 계산을 수행하고 그 결과를 드라이버에 돌려준다.

드라이버는 각 파티션 결과를 하나로 모아서 최종 결과를 saveAsTextFile() 액션을 통해 만든다).

 

 아래 연산이 spark job으로 어떤 순서로 수행하는지 보자.

 

+ Recent posts