복붙노트

[HADOOP] Sqoop 가져 오기 : 복합 기본 키 및 텍스트 기본 키

HADOOP

Sqoop 가져 오기 : 복합 기본 키 및 텍스트 기본 키

스택 : Ambari 2.1을 사용하여 HDP-2.3.2.0-2950 설치

원본 DB 스키마는 SQL Server에 있으며 다음과 같은 기본 키가있는 여러 테이블을 포함합니다.

Sqoop 문서에 따라 :

Sqoop cannot currently split on multi-column indices. If your table has no index column, or has a multi-column key, then you must also manually choose a splitting column.

첫 번째 질문은 '수동으로 분할 열 선택'으로 예상되는 것입니다. 어떻게하면 Pk를 희생하고 하나의 열만 사용하거나 개념이 누락 될 수 있습니까?

SQL Server 테이블은 두 개의 열로 구성되며 복합 기본 키를 형성합니다.

ChassiNo    varchar(8)  Unchecked
ECU_Name    nvarchar(15)    Unchecked

나는 가져 오기를 진행했고, 소스 테이블에는 7909097 개의 레코드가있다.

sqoop import --connect 'jdbc:sqlserver://somedbserver;database=somedb' --username someusname --password somepass --as-textfile --fields-terminated-by '|&|'  --table ChassiECU --num-mappers 8  --warehouse-dir /dataload/tohdfs/reio/odpdw/may2016 --verbose

걱정스러운 경고와 잘못된 매퍼 입력 및 기록 :

16/05/13 10:59:04 WARN manager.CatalogQueryManager: The table ChassiECU contains a multi-column primary key. Sqoop will default to the column ChassiNo only for this job.
16/05/13 10:59:08 WARN db.TextSplitter: Generating splits for a textual index column.
16/05/13 10:59:08 WARN db.TextSplitter: If your database sorts in a case-insensitive order, this may result in a partial import or duplicate records.
16/05/13 10:59:08 WARN db.TextSplitter: You are strongly encouraged to choose an integral split column.
16/05/13 10:59:38 INFO mapreduce.Job: Counters: 30
        File System Counters
                FILE: Number of bytes read=0
                FILE: Number of bytes written=1168400
                FILE: Number of read operations=0
                FILE: Number of large read operations=0
                FILE: Number of write operations=0
                HDFS: Number of bytes read=1128
                HDFS: Number of bytes written=209961941
                HDFS: Number of read operations=32
                HDFS: Number of large read operations=0
                HDFS: Number of write operations=16
        Job Counters
                Launched map tasks=8
                Other local map tasks=8
                Total time spent by all maps in occupied slots (ms)=62785
                Total time spent by all reduces in occupied slots (ms)=0
                Total time spent by all map tasks (ms)=62785
                Total vcore-seconds taken by all map tasks=62785
                Total megabyte-seconds taken by all map tasks=128583680
        Map-Reduce Framework
                Map input records=15818167
                Map output records=15818167
                Input split bytes=1128
                Spilled Records=0
                Failed Shuffles=0
                Merged Map outputs=0
                GC time elapsed (ms)=780
                CPU time spent (ms)=45280
                Physical memory (bytes) snapshot=2219433984
                Virtual memory (bytes) snapshot=20014182400
                Total committed heap usage (bytes)=9394716672
        File Input Format Counters
                Bytes Read=0
        File Output Format Counters
                Bytes Written=209961941
16/05/13 10:59:38 INFO mapreduce.ImportJobBase: Transferred 200.2353 MB in 32.6994 seconds (6.1235 MB/sec)
16/05/13 10:59:38 INFO mapreduce.ImportJobBase: Retrieved 15818167 records.

생성 된 테이블 :

CREATE EXTERNAL TABLE IF NOT EXISTS ChassiECU(`ChassiNo` varchar(8),
`ECU_Name` varchar(15)) ROW FORMAT DELIMITED FIELDS TERMINATED BY '|'  LOCATION '/dataload/tohdfs/reio/odpdw/may2016/ChassiECU';

(오류없이) 결과 - PROBLEM : 15818167 대 7909097 (SQL 서버) 레코드 :

 > select count(1) from ChassiECU;
Query ID = hive_20160513110313_8e294d83-78aa-4e52-b90f-b5640268b8ac
Total jobs = 1
Launching Job 1 out of 1
Tez session was closed. Reopening...
Session re-established.
Status: Running (Executing on YARN cluster with App id application_1446726117927_0059)
--------------------------------------------------------------------------------
        VERTICES      STATUS  TOTAL  COMPLETED  RUNNING  PENDING  FAILED  KILLED
--------------------------------------------------------------------------------
Map 1 ..........   SUCCEEDED     14         14        0        0       0       0
Reducer 2 ......   SUCCEEDED      1          1        0        0       0       0
--------------------------------------------------------------------------------
VERTICES: 02/02  [==========================>>] 100%  ELAPSED TIME: 6.12 s
--------------------------------------------------------------------------------
OK
_c0
15818167

놀랍게도 합성 키가 int (분할에 사용됨)로 구성되어있는 경우 정확하지 않거나 10 개 미만의 레코드가 일치하지 않는 경우에도 여전히 그 레코드에 대해 불안합니다.

어떻게해야합니까?

해결법

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

    1.수동으로 분할 열을 지정하십시오. 분할 열이 반드시 PK와 같지는 않습니다. 당신은 복잡한 PK 및 일부 int 분할 열을 가질 수 있습니다. 정수 열 또는 간단한 함수 (일부 간단한 함수 (하위 문자열 또는 캐스트, 집계 또는 분석이 아닌)를 지정할 수 있습니다. 분할 열은 균등하게 분산 된 정수 여야합니다.

    수동으로 분할 열을 지정하십시오. 분할 열이 반드시 PK와 같지는 않습니다. 당신은 복잡한 PK 및 일부 int 분할 열을 가질 수 있습니다. 정수 열 또는 간단한 함수 (일부 간단한 함수 (하위 문자열 또는 캐스트, 집계 또는 분석이 아닌)를 지정할 수 있습니다. 분할 열은 균등하게 분산 된 정수 여야합니다.

    예를 들어, 분할 된 열에 값 -1 및 10M 행에 10000 - 10000000 및 num-mappers = 8 값이있는 몇 개의 행이 포함되어 있으면 sqoop은 데이터 집합을 매퍼간에 균등하게 분할하지 않습니다.

    그러면 데이터가 비뚤어지고 8 번째 매퍼가 영원히 또는    심지어 실패합니다. 또한 정수가 아닌 정수를 사용할 때 중복 된 값이 있습니다.    분할 열 MS-SQL. 따라서 integer split-column을 사용하십시오. 귀하의 경우    두 개의 varchar 열만있는 테이블을 사용하면

    (1) surrogate int PK를 추가하여 분할 또는

    (2) WHERE 절을 사용하여 사용자 지정 쿼리를 사용하여 데이터를 수동으로 분할하고 sq-op를 num-mappers = 1로 몇 번 실행하거나

    (3) split-column과 같은 일부 결정 론적 Integer 비 집계 함수를 varchar 열에 적용합니다 (예 : cast (substr (...) as int) 또는 second (timestamp_col) 또는 datepart (second, date) 등.

  2. from https://stackoverflow.com/questions/37206232/sqoop-import-composite-primary-key-and-textual-primary-key by cc-by-sa and MIT license