2011-01-10 58 views

回答

7

在記住orangeoctopus所說的內容(提防DDOS ...)的時候,你看看DBStorage

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

我看到的主要問題是每個reducer實際上都會在同一時間插入到數據庫中。

如果您不認爲這會是一個問題,我建議您編寫custom Storage method,它使用JDBC(或類似的東西)直接插入到數據庫中,並且不向HDFS寫任何內容。

如果您害怕在您自己的數據庫上執行DDOS攻擊,可能收集HDFS上的數據並對MySQL執行單獨的批量加載會更好。

+0

好像有沒有辦法解決編寫使用JDBC一個UDF。 。謝謝! – Christoph 2011-01-11 09:52:26

2

我目前正在試驗一個嵌入式豬應用程序,它通過PigServer.OpenIterator和JDBC連接將結果加載到mysql中。它在測試中工作得很好,但我還沒有嘗試過。這與已經建議的自定義存儲方法類似,但是從單點開始運行,所以不會發生意外的DDOS攻擊。如果不從數據庫服務器運行負載(我個人更喜歡除了數據庫本身之外什麼都不運行),那麼實際上最終會支付兩次網絡傳輸成本(羣集 - >分段計算機,分段計算機 - >數據庫服務器)服務器),但這與「寫出文件並批量加載」選項沒有區別。

1

嘗試使用Sqoop

+1

雖然這可能會在理論上回答這個問題,[這將是更可取的](http://meta.stackexchange.com/q/8259)在這裏包括答案的基本部分,並提供供參考的鏈接。 – Kev 2011-09-11 23:04:34

2

Sqoop可能是要走的好方法,但它是很難建立(恕我直言)作爲所有這些的Hadoop相關的項目...

豬的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 (?, ?)'); 
相關問題