2016-04-27 5 views
0

Ich versuche, in HBase (Version 1.1.X) einige XML-Dateien lokal gespeichert.Richtige Möglichkeiten zum Einfügen von XML in HBase

Mein Ziel ist es, den Inhalt dieser XML-Dateien in meiner HBase-Tabelle als Zeichenfolge mit MapReduce (keine Stufe) zu speichern, ohne sie in HDFS zu laden.

Hier ist mein Pseudo-Code:

fetchXMLs(path); 
XML2OneLineFile(); 
configureHBase(); // + establishing connection 
Map(input, output); //input: one XML file in one line; output : is the Put() of HBase; 
closeConnection(); 

Ist auf diese Weise das Problem richtig anzugehen, oder gibt es bessere Möglichkeiten, es zu tun?

ps: Ich möchte keine Daten aus meinem XML analysieren oder extrahieren, sondern nur speichern.

Vielen Dank im Voraus

Antwort

1

Hbase ist nicht wirklich gemacht für großes Objekt speichern. Abhängig von der Größe Ihres XML ist HBase möglicherweise nicht die Lösung, nach der Sie suchen.

In diesem Moment arbeite ich an einer Datenbank, bestehend aus mehreren Dateitypen einschließlich XML. Was ich für gut hielt, war die Speicherung aller Dateien unter 1Mo nach HBase und der Rest nach Hadoop, wobei Metadaten entweder in SQL oder in HBase gepflegt wurden.

Es hängt viel davon ab, was Sie mit diesen Daten erreichen wollen.

+0

tatsächlich sind meine XMLs nicht groß, aber zahlreich; In anderen Worten, ich werde eine Menge kleiner XML-Dateien (etwa 90.000 Dateien, die von 80 KB bis 500 KB variieren) in kurzer Zeit speichern müssen. – mttb12

+1

dann sollte Hbase in Ordnung sein, wenn Sie den Inhalt dieser Dateien nicht scannen müssen, ist es in Ordnung, den Inhalt nur in Spaltenattributen auszugeben. Es wird jedoch Ihre Scans verlangsamen (da es den gesamten Inhalt jeder Datei scannen muss). Wie müssen Sie auf die Daten zugreifen? – Whitefret

+0

Daten werden von gezielten Zugriffen auf bestimmte (selten alle) Datensätze in meiner Hbase-Tabelle abgerufen. Ist die Idee, Dateien in HDFS zu laden, immer noch korrekt? – mttb12

2

Anstatt die XML-Zeichenfolge in Hbase zu speichern, können Sie sie als Byte [] speichern und Sie können sie mithilfe der Deserialisierung als Objekt (vom serialisierten Typ) abrufen.

Sie können das unten mit Apache commons API tun.

Für Ex:

byte[] xmlInBytes = org.apache.commons.lang.SerializationUtils.serialize(Serializable obj) 

für Deserialisieren, können Sie dies tun

static Object deserialize(byte[] objectData) 

wenn Object w3c Dokument sein kann, sollte Objekt w3c Dokument typecasted werden.

Ich habe bereits mit vielen Arten von Objekten nicht nur XML getestet. Es sollte auf die gleiche Weise funktionieren. Hoffe das hilft.