[HADOOP] Sqoop 가져 오기 : 복합 기본 키 및 텍스트 기본 키
HADOOPSqoop 가져 오기 : 복합 기본 키 및 텍스트 기본 키
스택 : 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.수동으로 분할 열을 지정하십시오. 분할 열이 반드시 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) 등.
from https://stackoverflow.com/questions/37206232/sqoop-import-composite-primary-key-and-textual-primary-key by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] 네임 노드가 시작되지 않음 (0) | 2019.05.30 |
---|---|
[HADOOP] 스파크가 강제로 코드를 실행하도록하려면 어떻게해야합니까? (0) | 2019.05.29 |
[HADOOP] 감속기에서 매퍼 카운터에 액세스 (0) | 2019.05.29 |
[HADOOP] 값을 두 번 반복 (MapReduce) (0) | 2019.05.29 |
[HADOOP] hadoop의 MultipleOutputFormat (0) | 2019.05.29 |