数据库连接应该在Reducer还是Master中进行?

时间:2014-01-22 23:56:39

标签: java mysql jdbc hadoop mapreduce

我在Hadoop中运行MapReduce作业。我简化的reducer函数输出键和键的出现次数。

我的管道中的下一步是将这些数据发送到MySQL数据库(特别是RDS实例),但是我遇到了试图访问jdbc驱动程序的reducers的问题。这可能是因为驱动程序没有被发送到所有Reducer并且只包装在我的jar中。

对于这个程序,我相信不是试图调试reducer,而是更容易找到另一个程序,它只是从hdfs中获取数据并一行一行地发送到数据库。

让每个Reducer连接到数据库是否通过我期望的并行化改进了这个过程?在这种情况下,是否值得花时间与Reducers jdbc驱动程序搏斗?

示例输出: HDFS:///用户/ hadoop的输入/输出/部分-R-0000

Key1     150
Key2     214

2 个答案:

答案 0 :(得分:0)

我认为问题在于与同一数据库的并行连接。我不确定。 我建议将输出作为一个合并文件,使用: hadoop dfs -getmerge /HDFS_path /local_path
然后将文件批量加载到数据库中,而不是逐个写入记录。批量加载要快得多。

答案 1 :(得分:0)

从reducer加载数据库应该没有问题。你是对的,如果你的数据库允许的话,这种方法可以提高吞吐量,而且有时这样做。

如果您的作业jar正确打包(就像Hadoop所期望的那样)那么应该没有问题。 Hadoop作业jar应该包含像往常一样解压缩的应用程序类,并且所有依赖项(包括JDBC驱动程序)都应该在/ lib文件夹中并且应该打包。

然后工作罐的内容如下:

...
org/yourdomain/package/YourClass.class
org/yourdomain/package/AnotherClass.class
lib/httpcore-4.1.2.jar
lib/mysql-connector-java-5.1.8-bin.jar
...

还有其他方法可以预先在每个Hadoop节点上提供所有依赖项,等等。

如果您使用的是Maven,使用Assembly插件组装这样的jar非常容易。但是要快速测试它,您只需手动在jar中添加JDBC驱动程序(在/ lib文件夹中)。