任务二:MySQL数据库导入到Hbase
1.背景:
将第一次试验中的mysql数据导入到hbase中,对比SQL语句与Hbase查询语句的区别,对比Phoenix组件和原生Hbase查询的时间性能。尝试编程实现对Hbase数据库的访问。
2. 自行安装Hbase/Phoenix环境
由于设备条件有限,没有实现真正的分布式,于是使用的伪分布式进行的实验。
① Hadoop的安装和配置:
图2.1 Hadoop安装成功图
图2.2 HDFS配置完成展示
图2.3 HDFS配置完成
②Hbase安装配置:
图2.4 Hbase配置和安装完成
③ 以为要用sqoop进行数据的导入,所以安装了一个独立的zookeeper,方便后面从mysql导入hbase数据库数据。
图2.5 服务的启动
3. 实现数据从MySQL数据库导入Hbase数据库
1. bin/sqoop import --connect jdbc:mysql://192.168.1.108:3306/imooc --username root --password '' --table tdb_goods --hbase-table test_imooc --column-family info --hbase-row-key goods_id
2.
3. sqoop import --connect jdbc:mysql://192.168.1.103:3306/taxi --username root --password '' --table taxi_infor_little--hbase-table taxi --column-family info --hbase-row-key infor_id
找了一个小的数据表时可以正常的导入:
图3.1 导入的数据
通过程序连接Hbase数据库:
Hbase提供直接的java连接接口,如果想用其他的语言,要使用thrift。
进行连接:
5. import happybase
6. #连接
7. connection = happybase.Connection('localhost')
8. connection.open()
9.
10. # connection.create_table('mytable', {'name' : dict(max_versions=5), 'course':dict()})
11. #打印所有的表
12. print(connection.tables())
13. table = connection.table('Score')
14. row = table.row(b'95001')
15. print(row[b'course:Math'])
16.
17. #插入数据
18. table.put(b'95002', {b'course:Math':b'65', b'course:English':b'77'}
19. # 扫描表
20. for key, data in table.scan():
21. print(key, data)
22. table.delete(b'95002')
23. #断开连接
24. connection.close()
4.遇到的问题:
遇到的问题可以说是千奇百怪,按照遇到问题的先后顺序进行一个说明:
问题一:hbase无法启动。
刚开始进行配置安装完hadoop的HDFS后,无法启动Hbase的web访问页面,于是到网上去查询各种资料。最后结合着hadoop官网的指导按装教程和网上找来的资料,将hadoop的yarn、MapReduce均进行了配置。还找到了zookeeper的官网,一边查看官网的指导说明一边看网上的博客教程,正常将Hbase的web访问页面启动了起来。
问题二:无法通过虚拟机下的Ubuntu来访问Windows下的MySQL服务。
查询后发现是应为没有关闭Windows的防火墙。添加访问规则后将电脑重启终于可以正常访问到了Windows的MySQL服务。
问题三:MapReduce停留在0%,%0的地方不动。
查询后是因为yarn的配置问题,因为虚拟机的内存和硬件不够,于是在yarn中进行了配置。
问题四:job被无情的给kill掉了,并抛出了143错误代码。
就在数据sqoop的导入命令后,发现虚拟机和真机之间的数据交换量非常的大:
图4.1 数据交换量
此时以为要成功了,但是最后被告知超时600S,进程被杀。于是尝试将之前导入MySQL中的小数据进行一下导入,很正常的就导入了进去。查到的解决办法是说要在修改MapReduce的默认超时时间,但是根据在配置文件中进行修改后并没有起作用,依然是相同的问题。于是在小数据的基础上进行了实验。进行了查询等相关操作。
(后面有同学在分享时提供了解决办法:在配置文件中添加相应的配置信息
)
图4.2 Job的完成情况
图4.3 导入小数据后的耗时情况
可以看到最后的一个job是成功的导入的,在Hbase的shell下面也可以查询到相应的数据:
图4.4 导入的数据
可以观察到,关于row-key的排列并不是像MySQL中那样,从小到大进行排列。
总结:
这次从平台的搭建到数据的导入,再到数据的的查询,遇到了很多的问题,当觉解决完这些问题后,感觉最大的收获是锻炼了自己解决问题的能力和手段,以后解决问题要多去官网查看相应的用户手册,官网的资料是最全面,也是最原始的。确保了信息的真实性。对于数据库的发展和方向,以及hadoop生态有了一个更加充分的认知,对于生态中各个软件的定位有了一个大致的了解。