Hive Erstellen Multi-kleine Dateien, die für die einzelnen insert-HDFS
folgenden ist bereits erreicht
- Kafka Producer-Daten von twitter mit Spark Streaming.
- Kafka Verbraucher Einlesen von Daten in Externen Hive-Tabelle(HDFS).
während dies gut funktioniert, so weit.
es gibt nur ein Problem ich bin vor, während meine app einfügen von Daten in Hive-Tabelle, erstellt er kleine Datei, in der jede Zeile die Daten pro Datei.
unten ist der code
//Define which topics to read from
val topic = "topic_twitter"
val groupId = "group-1"
val consumer = KafkaConsumer(topic, groupId, "localhost:2181")
//Create SparkContext
val sparkContext = new SparkContext("local[2]", "KafkaConsumer")
//Create HiveContext
val hiveContext = new org.apache.spark.sql.hive.HiveContext(sparkContext)
hiveContext.sql("CREATE EXTERNAL TABLE IF NOT EXISTS twitter_data (tweetId BIGINT, tweetText STRING, userName STRING, tweetTimeStamp STRING, userLang STRING)")
hiveContext.sql("CREATE EXTERNAL TABLE IF NOT EXISTS demo (foo STRING)")
Hive demo-Tabelle bereits gefüllt mit einem einzelnen Datensatz.
Kafka Verbraucher loop-thru werden die Daten für Thema ="topic_twitter" in process jeder Zeile und füllen Sie in der Hive-Tabelle
val hiveSql = "INSERT INTO TABLE twitter_data SELECT STACK( 1," +
tweetID +"," +
tweetText +"," +
userName +"," +
tweetTimeStamp +"," +
userLang + ") FROM demo limit 1"
hiveContext.sql(hiveSql)
unten sind die Bilder von meinem Hadoop-Umgebung. twitter_data, demo
letzten 10 erstellten Dateien in HDFS
wie Sie sehen können ist die Dateigröße nicht mehr als 200KB, gibt es eine Möglichkeit, die ich Zusammenführen dieser Dateien in einer Datei?
Du musst angemeldet sein, um einen Kommentar abzugeben.
[2] OK, so kann man nicht richtig "streamen" von Daten in Hive. Aber Sie können eine periodische Verdichtung post-processing-job...
(role='collectA')
,(role='collectB')
,(role='archive')
(role='activeA')
(role='activeB')
dann dump jeden Datensatz, die Sie gesammelt haben, in die "A" - partition
in "Archiv", in der Hoffnung, dass Hive-default-config machen einen guten job der Begrenzung der Fragmentierung
INSERT INTO TABLE twitter_data PARTITION (role='archive')
SELECT ...
FROM twitter_data WHERE role='activeA'
;
TRUNCATE TABLE twitter_data PARTITION (role='activeA')
;
irgendwann, wechseln Sie zurück zu "A" usw.
Ein letztes Wort: wenn der Hive noch schafft zu viele Dateien auf jedem Verdichtung job, dann versuchen tweaken einiger Parameter in Ihrer Sitzung, kurz vor dem EINFÜGEN z.B.
Struktur wurde konzipiert für massive batch-Verarbeitung, nicht für Transaktionen. Das ist, warum Sie haben mindestens eine Daten-Datei für jeden LAST-oder INSERT-SELECT-Befehl. Und das ist auch der Grund, warum du keine EINFÜGEN-WERTE-Befehl, damit die lame-syntax angezeigt, die in Ihrem Beitrag als eine notwendige Abhilfe.
Gut... das stimmte auch, bis transaction support eingeführt wurde. In einer nussschale, die Sie brauchen (a) Hive-V0.14 und später (b) ein ORC Tabelle (c) Transaktionsunterstützung aktiviert, die auf die Tabelle (d.h. Schlösser, periodische hintergrund, Verdichtung, etc)
Wiki über Streaming-Daten-ingest in Hive könnte ein guter Anfang sein.
können Sie diese Optionen zusammen.
mit Transaktions-Eigenschaft.
durch das streaming oder einfach nur insert dml.