2016-09-13 2 views
0

Ich habe eine Hive-Tabelle X, die mehrere Dateien auf HDFS hat. Der Speicherort der Tabelle X auf HDFS ist/data/hive/X. Dateien:Spark HiveContext: Tabellen mit mehreren Dateien auf HDFS

/data/hive/X/f1 
/data/hive/X/f2 
/data/hive/X/f3 ... 

Nun betreibe ich die folgenden Befehle:

df=hiveContext.sql("SELECT count(*) from X") 
df.show() 

Was intern passiert? Wird jede Datei als separate Partition betrachtet und von einem separaten Knoten verarbeitet, und werden die Ergebnisse sortiert?

Wenn ja, gibt es eine Möglichkeit, Spark anweisen, alle Dateien in 1 Partition zu laden und dann die Daten zu verarbeiten?

Vielen Dank im Voraus.

+0

Wie ist das Format der Dateien, nur CSV/TSV? Sie können auch die Spark-Benutzeroberfläche öffnen und die DAG-Visualisierung anzeigen. –

+0

Hallo Fokko - sie sind Pipe-getrennte Textdateien. – user3031097

Antwort

1

Spark wird sich mit Hive-Metastore in Verbindung setzen, um herauszufinden (a) Ort der Daten (b) Wie man die Daten liest. Auf niedriger Ebene erhält Spark Eingabeaufteilungen auf der Grundlage von Eingabeformaten, die in der Struktur zum Speichern der Daten verwendet werden. Sobald Splits entschieden sind, liest Spark die Daten 1 Split/Partition. In Spark kann ein physischer Knoten einen oder mehrere Executoren ausführen. Jeder Executor wird eine oder mehrere Partitionen haben. Sobald die Daten in den Speicher eingelesen sind, führt spark eine Zählung aus, die (a) lokal auf der Karte (b) global zählt nach einem Shuffle zählt. Dann wird es als Ergebnis an den Fahrer zurückgegeben.

+0

Das ist richtig. Aber wenn es auf HDFS ist, könnte es sein, dass eine einzelne Datei zu mehreren Partitionen wird. Dies geschieht nur, wenn Hadoop die Datei teilen kann. Dies ist für zeilenbasierte Formate wie CSV/TSV einfach, wird jedoch bei Verwendung der Komprimierung komplexer (http://stackoverflow.com/questions/14820450/best-splittable-compression-for-hadoop-input-bz2). Diese Splits werden auf HDFS-Blockgrößenebene durchgeführt. Wenn Sie also eine Datei mit 300 MB haben und die HDFS-Blockgröße auf 128 gesetzt ist, erhalten Sie 3 Blöcke von 128 MB, 128 MB bzw. 44 MB. –

+0

Danke Ayan und Fokko. Die Dateien, die ich habe, sind kleine Dateien, also wird es sicher 1 Datei/Partition sein. Können wir Spark trotzdem mitteilen, dass alle Dateien in 1 Partition partitioniert werden sollen? – user3031097

+1

rdd.repartition (1) –