sqoop

来源:互联网 发布:c语言入门电子书 编辑:程序博客网 时间:2024/06/06 01:17

1、是什么?解决了什么?
sqoop是一个数据迁移的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql、postgresql…)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。,sqoop语法将转化成mapreduce,底层运用还是运用的mapreduce。

2、怎么使用
安装sqoop很简单,这里不做说明

第一类:从一台主机mysql数据库中导一部分数据到hdfs中
首先将mysql连接驱动jar包放到sqoop目录的lib目录下(mysql-connector-5.1.8.jar)
cp /root/mysql-connector-5.1.8.jar /master/sqoop1.4.4/lib

然后在bin 目录(未配sqoop全局变量情况下)下运行命令:
1、将数据库db中表a拷贝到hdfs上的默认目录下
./sqoop import –connect jdbc:mysql://192.168.1.xx:3306/数据库名(db) –username root –password 123 –table 表名(a) hdfs目录(默认目录为user/执行用户(root)/表名a)。 (part-m-00000结果文件是map产生的,part-r-00000结果文件是reduce产生的)

2、将数据库db中表a拷贝到hdfs上的sqoop/td1目录下,启动2个map
./sqoop import –connect jdbc:mysql://192.168.1.xx:3306/数据库名 –username root –password 123 –table 表名 –target-dir /sqoop/td1 -m(指定起多少个map) 2

3、将数据库db中表a中的三列(id,account,income)拷贝到hdfs上的sqoop/td2目录下,启动2个map
指定列与列之间的分隔符
./sqoop import –connect jdbc:mysql://192.168.1.xx:3306/数据库名 –username root –password 123 –table 表名 –target-dir /sqoop/td2 -m 2 –fields-terminated-by ‘\t’ –columns(指定列名) “id,account,income”

4、将数据库db中表a中满足条件id>2&&id<=9拷贝到hdfs上的sqoop/td3目录下,启动2个map
指定where条件
./sqoop import –connect jdbc:mysql://192.168.1.xx:3306/数据库名 –username root –password 123 –table 表名 –target-dir /sqoop/td3 -m 2 –fields-terminated-by ‘\t’ –where ‘id>2 && id<=9’

5、也可以导入多个表中的数据(select语句关联多个数据库即可)
./sqoop import –connect jdbc:mysql://192.168.1.xx:3306/test(数据库) –username root –password 123 –query ‘select * from bbsinfo(表名) where id >3 and $CONDITONS’ -m 1 –target-dir /sqoop/td4

./sqoop import –connect jdbc:mysql://192.168.1.xx:3306/test(数据库) –username root –password 123 –query ‘select * from bbsinfo(表名) where id >3 and $CONDITONS’ -m 2 –target-dir /sqoop/td5(出错)

这时候当指定2个map的时候,语句会报错,因为不知道有多少条数据,要指定分割(主键),才能迅速知道有多少条数据,

./sqoop import –connect jdbc:mysql://192.168.1.xx:3306/test(数据库) –username root –password 123 –query ‘select * from bbsinfo(表名) where id >3 and $CONDITONS’ -m 2 –target-dir /sqoop/td5 –split-by
bbsinfo.id

第二类:将HDFS上的数据导出到数据库中(不要忘记指定分隔符)
sqoop export –connect jdbc:mysql://192.168.8.120:3306/itcast –username root –password 123 –export-dir ‘/td3’ –table td_bak -m 1 –fields-terminated-by ‘\t’

思考:$CONDITIONS在这里作用?
运行语句之前,检查数据库多少条记录,每个map处理多少条记录,根据split-by bbsinfo.id 统计出记录数,然后将信息动态的传给每个map查询条件中的$CONDITIONS. 起一个map时候,不需要split-by,因为直接将所有的记录交给一个map处理,不需要切分。

原创粉丝点击