有没有办法将结果从 Pig 直接导出到 mysql 之类的数据库?
5 回答
在记住 orangeoctopus 所说的(提防 DDOS ......)的同时,您是否看过DBStorage?
data = LOAD '...' AS (...);
...
STORE data INTO DBStorage('com.mysql.jdbc.Driver', 'dbc:mysql://host/db', 'INSERT ...');
我看到的主要问题是每个reducer 都会在同一时间有效地插入数据库。
如果您认为这不会成为问题,我建议您编写一个自定义存储方法,该方法使用 JDBC(或类似的东西)直接插入数据库,而不向 HDFS 写入任何内容。
如果您害怕对自己的数据库执行 DDOS 攻击,也许在 HDFS 上收集数据并单独批量加载到 mysql 中会更好。
我目前正在试验一个嵌入式 pig 应用程序,它通过PigServer.OpenIterator和 JDBC 连接将结果加载到 mysql 中。它在测试中效果很好,但我还没有大规模尝试过。这类似于已经建议的自定义存储方法,但从单点运行,因此不会发生意外的 DDOS 攻击。如果您不从数据库服务器上运行负载(我个人更喜欢从数据库中运行除数据库本身之外的任何东西),那么您实际上最终会支付两次网络传输成本(集群 -> 登台机器,登台机器 -> 数据库服务器)服务器),但这与“写出文件并批量加载”选项没有什么不同。
Sqoop 可能是不错的选择,但很难设置(恕我直言),因为所有这些 Hadoop 相关项目......
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