2016-05-13 4 views
1

Stack: Installierte HDP-2.3.2.0-2950 Ambari mit 2,1Sqoop Import: Composite Primärschlüssel und Textprimärschlüssel

Die Quelle DB-Schema auf dem SQL Server und es enthält mehrere Tabellen, die entweder Primärschlüssel als:

  • VARCHAR
  • Verbund - zwei Spalten VARCHAR oder ein VARCHAR + int eine Spalte oder Spalten zwei Int. Es gibt einen großen Tisch mit? Zeilen, die in der PK ein int + zwei varchar-Spalten

Gemäß der Sqoop Dokumentation drei Spalten:

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. 

Die erste Frage ist: Was ist mit zu erwarten ist ‚eine Spaltsäule manuell auswählen‘ - Wie kann ich das PK opfern und nur eine Spalte verwenden oder fehlt mir ein Konzept?

Die SQL-Server-Tabelle ist (nur zwei Spalten und sie bilden einen zusammengesetzten Primärschlüssel):

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

I mit dem Import vorgegangen, die Quelltabelle hat 7.909.097 Datensätze:

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 

Die besorgniserregenden Warnungen und die falschen Mapper-Eingaben und Aufzeichnungen:

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. 

Erstellt Tabelle:

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'; 

Awful Ergebnis (ohne Fehler) --PROBLEM: 15818167 vs 7.909.097 (SQL Server) Datensätze:

> 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 

Überraschenderweise bekam ich entweder richtig oder eine Nichtübereinstimmung von weniger als 10 Datensätze, wenn der zusammengesetzte Schlüssel aus einem int bestand (was zum Teilen benutzt wurde), aber ich bin immer noch besorgt über diese!

Wie soll ich fortfahren?

+0

Hallo, Was ich von Ihrer Anforderung verstehe ist, dass Sie nur den Inhalt von ChassiECU zu Hive für eine Tabelle mit einem Multi-Typ-Verbundschlüssel verschieben möchten. Anstelle von '--table

option' können Sie' --query select * aus ChassiECU where \ $ CONDITIONS '' verwenden und eine der Schlüsselspalten (vorzugsweise die mit der niedrigsten Kardinalität) in '--split-by auswählen 'option .Auch überprüfen Sie bitte Ihre Spaltenbegrenzer im shoop-Import und die im Hive-DDL verwendete – Kfactor21

+0

Eine der anderen Optionen wäre, eine Sicht, wenn möglich, über Ihrer Tabelle mit einer neuen Schlüsselspalte zu erstellen, die verkettete Werte enthält von allen Ihren Schlüsselspalten in eine einzelne Spalte.Dies kann dann im scooop-Import verwendet werden – Kfactor21

+0

Die Tabelle Info hinzugefügt, ich bin unsicher, ob die Vorschläge, die Sie für die Tabelle gelten, können Sie überprüfen? –

Antwort

0

Split-Spalte manuell angeben. Split-Spalte ist nicht unbedingt gleich PK. Sie können komplexe PK- und einige int Split-Spalten haben. Sie können jede Ganzzahlspalte oder sogar einfache Funktion (einige einfache Funktionen wie Teilzeichenfolge oder Umwandlung, nicht Aggregation oder Analyse) angeben. Split-Spalte sollte vorzugsweise gleichmäßig verteilt sein.

Zum Beispiel, wenn Ihre Split-Spalte enthält einige Zeilen mit dem Wert -1 und 10M Reihen mit Werten 10.000-10.000.000 und num-Mapper = 8, dann wird Sqoop den Datensatz zwischen Mapper aufgeteilt nicht gleichmäßig:

  • 1. Mapper erhalten wenige Zeilen mit -1 wird
  • 2. bis 7. Mapper 0 Zeilen erhalten wird,
  • 8. Mapper fast 10M Reihen bekommen,

, die in Daten führen Verkanten und 8. Mapper wird r un für immer oder sogar scheitern. Und ich habe auch Duplikate, wenn nicht ganzzahlige Split-Spalte mit MS-SQL verwendet. Verwenden Sie also Integer Split-Column. In Ihrem Fall mit Tabelle mit nur zwei varchar-Spalten können Sie entweder

(1) hinzufügen Surrogat int PK und es verwenden, auch als Split oder

(2) teilen Sie Ihre Daten manuell benutzerdefinierte Abfrage mit WHERE-Klausel und laufen Sqoop einige Male mit num-Mapper = 1 oder

(3) gelten einige determinis Integer nicht-Aggregation Funktion Sie varchar Spalte, zum Beispiel Guss (substr (...) als int) als Split -Säule.

Verwandte Themen