2011-01-10 64 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 (?, ?)'); 
相关问题