2011-01-10 1 views

Antwort

7

Während Sie daran denken, was Orangeoctopus gesagt hat (Vorsicht vor DDOS ...), haben Sie einen Blick auf DBStorage geworfen?

data = LOAD '...' AS (...); 
... 
STORE data INTO DBStorage('com.mysql.jdbc.Driver', 'dbc:mysql://host/db', 'INSERT ...'); 
4

Das Hauptproblem, das ich sehe, ist, dass jeder Reducer ungefähr zur gleichen Zeit effektiv in die Datenbank eingefügt wird.

Wenn Sie nicht denken, dass dies ein Problem sein wird, schlage ich vor, schreiben Sie eine custom Storage method, die JDBC (oder etwas ähnliches) verwendet, um direkt in die Datenbank einfügen und nichts in HDFS schreiben.

Wenn Sie Angst davor haben, eine DDOS-Attacke auf Ihre eigene Datenbank durchzuführen, wäre es vielleicht besser, die Daten auf HDFS zu sammeln und eine separate Massenladung in MySQL durchzuführen.

+0

Scheint, als ob es keine Möglichkeit gibt um ist eine UDF zu schreiben, die JDBC verwendet. .Vielen Dank! – Christoph

2

Ich experimentiere gerade mit einer eingebetteten Pig-Anwendung, die Ergebnisse in mysql über PigServer.OpenIterator und eine JDBC-Verbindung lädt. Es hat beim Testen sehr gut funktioniert, aber ich habe es noch nicht im Maßstab getestet. Dies ist ähnlich der bereits vorgeschlagenen benutzerdefinierten Speichermethode, läuft aber von einem einzigen Punkt aus, also kein zufälliger DDOS-Angriff. Sie zahlen effektiv die Netzwerktransferkosten zweimal (Cluster -> Staging-Maschine, Staging-Maschine -> DB-Server), wenn Sie die Last nicht vom DB-Server ausführen (ich persönlich bevorzuge nichts außer der DB selbst von der DB) Server), aber das ist nicht anders als die Option "schreibe die Datei aus und lade sie".

1

Versuchen Sie es mit Sqoop

+1

Während dies theoretisch die Frage beantworten könnte, [wäre es vorzuziehen] (http://meta.stackexchange.com/q/8259), hier die wesentlichen Teile der Antwort aufzunehmen und den Link als Referenz bereitzustellen. – Kev

2

Sqoop kann der gute Weg zu gehen, aber es ist schwierig, Set-up (IMHO), da diese alle Hadoop Projekte ...

Schweine DBStorage ist funktioniert gut (zumindest zum Speichern).

Vergessen Sie nicht, die Piggybank und Ihre MySQL-Treiber zu registrieren:

-- Register Piggy bank 
REGISTER /opt/cmr/pig/pig-0.10.0/lib/piggybank.jar; 

-- Register MySQL driver 
REGISTER /opt/cmr/mysql/drivers/mysql-connector-java-5.1.15-bin.jar 

Hier ist ein Beispielaufruf:

-- Store a relation into a SQL table 
STORE relation INTO 'unused' USING org.apache.pig.piggybank.storage.DBStorage('com.mysql.jdbc.Driver', 'jdbc:mysql://<mysqlserver>/<database>', '<login>', '<password>', 'REPLACE INTO <table> (<column1>, <column2>) VALUES (?, ?)'); 
Verwandte Themen