我在Hadoop中运行MapReduce作业。我简化的reducer函数输出键和键的出现次数。
我的管道中的下一步是将这些数据发送到MySQL数据库(特别是RDS实例),但是我遇到了试图访问jdbc驱动程序的reducers的问题。这可能是因为驱动程序没有被发送到所有Reducer并且只包装在我的jar中。
对于这个程序,我相信不是试图调试reducer,而是更容易找到另一个程序,它只是从hdfs中获取数据并一行一行地发送到数据库。
让每个Reducer连接到数据库是否通过我期望的并行化改进了这个过程?在这种情况下,是否值得花时间与Reducers jdbc驱动程序搏斗?
示例输出: HDFS:///用户/ hadoop的输入/输出/部分-R-0000
Key1 150
Key2 214
答案 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文件夹中)。