Pigからmysqlなどのデータベースに結果を直接エクスポートする方法はありますか?
5 に答える
Orangeoctopus が言ったことを念頭に置いて (DDOS に注意してください...)、DBStorageを調べましたか?
data = LOAD '...' AS (...);
...
STORE data INTO DBStorage('com.mysql.jdbc.Driver', 'dbc:mysql://host/db', 'INSERT ...');
私が見る主な問題は、各レデューサーが事実上ほぼ同時にデータベースに挿入されることです。
これが問題になると思わない場合は、JDBC (または同様のもの) を使用してデータベースに直接挿入し、HDFS には何も書き込まないカスタム Storage メソッドを作成することをお勧めします。
独自のデータベースで DDOS 攻撃を実行することを恐れている場合は、おそらく HDFS でデータを収集し、mysql への個別の一括ロードを実行する方がよいでしょう。
私は現在、PigServer.OpenIteratorと JDBC 接続を介して mysql に結果をロードする組み込みの豚アプリケーションを試しています。テストでは非常にうまく機能しましたが、まだ大規模には試していません。これは、既に提案されているカスタム ストレージ メソッドに似ていますが、単一のポイントから実行されるため、偶発的な DDOS 攻撃はありません。DBサーバーから負荷を実行しない場合、ネットワーク転送コストを効果的に2回支払うことになります(クラスター->ステージングマシン、ステージングマシン-> DBサーバー)(個人的には、DB自体をDBから実行する以外は何も実行しないことを好みます)サーバー)、しかし、それは「ファイルを書き出して一括ロードする」オプションと同じです。
Sqoopは良い方法かもしれませんが、これらすべてのHadoop関連プロジェクトとしてセットアップするのは難しいです(IMHO)...
Pig の DBStorage は正常に動作しています (少なくとも保存に関しては)。
PiggyBank と 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
呼び出しの例を次に示します。
-- 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 (?, ?)');
Sqoopを使用してみてください