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?
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
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
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
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:
, 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.
Quelle
2016-05-23 10:56:35 leftjoin
Verwandte Themen