Esiste un modo per esportare i risultati da Pig direttamente in un database come mysql?Un modo per esportare i risultati da Pig a un database
risposta
Tenendo presente ciò che ha detto orangeoctopus (attenzione al DDOS ...) hai dato un'occhiata a DBStorage?
data = LOAD '...' AS (...);
...
STORE data INTO DBStorage('com.mysql.jdbc.Driver', 'dbc:mysql://host/db', 'INSERT ...');
Il problema principale che vedo è che ogni riduttore verrà effettivamente inserito nel database nello stesso momento.
Se non si pensi che questo sarà un problema, vi consiglio di scrivere un custom Storage method che utilizza JDBC (o qualcosa di simile) per inserire nel database direttamente e scrivere nulla fuori di HDFS.
Se si ha paura di eseguire un attacco DDOS nel proprio database, sarebbe forse meglio raccogliere i dati su HDFS ed eseguire un caricamento di massa separato in mysql.
Attualmente sto sperimentando un'applicazione per maiali incorporati che carica i risultati in mysql tramite PigServer.OpenIterator e una connessione JDBC. Ha funzionato molto bene nei test, ma non l'ho ancora provato su scala. Questo è simile al metodo di archiviazione personalizzato già suggerito, ma viene eseguito da un singolo punto, quindi nessun attacco DDOS accidentale. Si finisce per pagare il costo del trasferimento di rete due volte (cluster -> staging machine, staging machine -> server DB) se non si esegue il caricamento dal server DB (personalmente preferisco non eseguire nient'altro che il DB stesso dal DB server), ma non è diverso dall'opzione "scrivi il file e lo carica in blocco".
Sqoop può essere il buon modo per andare, ma è difficile da set-up (secondo me) come tutti questi progetti Hadoop relativi ...
di maiale DBStorage è funzionante bene (almeno per la conservazione).
Non dimenticare di registrare il PiggyBank e il driver di MySQL:
-- 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
Ecco un esempio di richiamo:
-- 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 (?, ?)');
Sembra che ci sia alcun modo per aggirare la scrittura di un UDF che utilizza JDBC. .Grazie! – Christoph