Hadoop和数据库之间剪不清理还乱的关系(DBOutputFormat)

最近在用Hadoop搭一个小型搜索引擎。因为没有仔细思考,在上面浪费了大量的时间。以下稍微总结下。

先说说数据库。

Hadoop的原配,是HBase。应该说用用这个的话还是非常有学习价值的,但是听说这个还在开发阶段,并且是非关系型数据库,因为我们的Web页面要直接和数据库打交道,因此怕会出问题或是接口不完善,就没用。

如果想和传统的关系型数据库连接的话,有几种方法:

1、用Spooq啥之类的一个东西。不过这个似乎比较适合把数据从MySql中导出到Hadoop,可能还不太支持相互读写。

2、用Hadoop提供的接口,DBInputFormat,DBOutputFormat,可以把Mapper和Reducer的输入参数或输出参数用一个DBWritable来和数据库打交道。不过这个东西太shit了,Hadoop0.20之后改用了新的接口,不过这个东西的一些设置必须要用老东西,所以不得不用上两三个deprecated的类。另外一个问题是,查询的限制非常大。不幸的是我在这条路上走了很久……

3、读取HDFS的文件,然后自己创建数据库连接和写查询语句,半自动地插入。

对于第二种第三种方法来说,读取都不是什么问题。关键第二步的写入实在有点问题……下面讲讲第二种方法上我走的冤枉路。

忘了说,想要用第二种方法的话,要先把mysql的jar包放到你linux里面hadoop文件夹下面的lib文件夹里面。不然会出现class not found。


用Hadoop读取数据库中的数据是非常非常简单的,只要用Hadoop的DBInputFormat,就可以了。具体可以参考 牧羊D犬 同学的博客 http://blog.sina.com.cn/s/blog_6aeb91cd0100t94b.html

或是 CloudEra写的原版教材

http://www.cloudera.com/blog/2009/03/database-access-with-hadoop/

接下来是写入。

我首先自己在Reducer里杜撰了好多值。然后奇怪的是,不管怎么样,都插不进去。

然后开始在Reducer把输入进来的值直接输出,竟然成功了!

但是这里有一个挺大的问题,就是竟然只能插入,无法更新。我去网上找了找这个问题的解决方案,有人在Hadoop的某个版本给了个补丁,修改了一下函数的格式,在查询最后可以加上几句条件来实现更新。不过因为要重新编译包,我就没搞了......

最后还是用了第三种方法来实现,就是自己打开HDFS的文件,一行一行读,然后解析,插入数据库。

(日志之前出错过,现在再来更新就忘得差不多了,见谅!)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值