Sqoop教程(一) Sqoop数据迁移工具
Sqoop是一个用来将Hadoop和关系型数据库中的数据相互转移的工具,可以将一个关系型数据库(例如:MySQL、Oracle、Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。对于某些NoSQL数据库它也提供了连接器。Sqoop,类似于其他ETL工具,使用元数据模型来判断数据类型并在数据从数据源转移到Hadoop时确保类型安全的数据处理。Sqoop专为大数据批量传输设计,能够分割数据集并创建Hadoop任务来处理每个区块。
Sqoop工作流程图1-1
1、在windons安装MySQL数据库,安装教程参见:http://jingyan.baidu.com/article/4b07be3c67853c48b380f311.html
2、本地安装MySQL可视化工具SQLyog,下载地址:http://download.csdn.net/detail/yuan_xw/9535853
3、下载创建数据库、插入测试数据,下载地址:http://download.csdn.net/detail/yuan_xw/9537098
创建数据库sqoop_db
在《Hadoop教程(五)Hadoop分布式集群部署安装》安装的是Hadoop-2.7.1版本,在此需要下载sqoop版本hadoop-2.0.4-alpha.tar.gz:
下载地址:http://mirrors.hust.edu.cn/apache/sqoop/1.4.6/sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz
4、在Hadoop3服务器节点下载hadoop-2.0.4-alpha.tar.gz到目录位置:/usr/local/software/
执行命令:
cd /usr/local/software
wgethttp://mirrors.hust.edu.cn/apache/sqoop/1.4.6/sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz
5、解压Hbase
执行命令:tar -zxvf sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz
重命名:mv sqoop-1.4.6.bin__hadoop-2.0.4-alpha sqoop_1.4.6
6、配置环境变量
export JAVA_HOME=/usr/local/software/jdk1.8.0_66
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export HADOOP_HOME=/usr/local/software/hadoop_2.7.1
export SQOOP_HOME=/usr/local/software/sqoop_1.4.6
export PATH=.:$JAVA_HOME/bin:$HADOOP_HOME/bin:$SQOOP_HOME/bin:$PATH
配置好环境变量,退出并刷新环境变量:source /etc/profile
将数据库连接驱动拷贝到$SQOOP_HOME/lib文件中,
执行命令:
cd /usr/local/software/sqoop_1.4.6/lib
wgethttp://central.maven.org/maven2/mysql/mysql-connector-java/5.1.38/mysql-connector-java-5.1.38.jar
7、设置MySQL数据root用户
MySQL数据库开启远程连接,在localhost(本机)登录mysql数据库后,对root远程进行授权,SQL语句如下:
--予192.168.1.105主机访问数据的权限--
GRANT ALL PRIVILEGES ON sqoop_db.* TO'root'@'192.168.1.105' IDENTIFIED BY '123' WITH GRANT OPTION;
--予任何主机访问数据的权限--
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'IDENTIFIED BY 'root' WITH GRANT OPTION;
--修改生效--
FLUSH PRIVILEGES
1、MySQL导入HDFS文件系统
执行命令:
sqoop import --connect jdbc:mysql://192.168.1.105:3306/sqoop_db --username root --password root
--table product --columns 'PRODUCT_ID,PRODUCT_NAME,LIST_PRICE,QUANTITY,CREATE_TIME'
import:从MySQL导入到HDFS文件系统数据
--connect:数据库JDBC连接字符串jdbc:mysql://192.168.1.105:3306/sqoop_db
--username:数据库用户名
--password:数据库密码
--table:数据库表名
--columns:数据库列名
实际上import命令,从MySQL导入到HDFS文件系统数据操作的背后依然是执行的MapReduce。
查看导入到HDFS中的数据:
通过web浏览器查看:http://192.168.1.121:50070/explorer.html#/user/root/product
通过命令行查看:
执行命令:hadoop fs -ls -R /
执行命令:hadoop fs -cat/user/root/product/part-m-00001
1、将数据从MySQL导入HDFS文件系统指定的目录下,并且指定使用#号进行数据分隔,指定Map数量为2,方便分析
执行命令:
sqoop import --connect jdbc:mysql://192.168.1.105:3306/sqoop_db --username root --password root --table product
--columns 'PRODUCT_ID,PRODUCT_NAME,LIST_PRICE,QUANTITY,CREATE_TIME' --target-dir' /sqoop/product1' --fields-terminated-by '#' -m 2
通过命令行查看:
执行命令:hadoop fs -ls -R /
执行命令:hadoop fs -cat /sqoop/product1/part-m-00001|grep '#'
1、where条件查询出QUANTITY字段大于500的导入到HDFS文件系统指定的目录下,where条件的内容必须在单引号中
执行命令:
sqoop import --connect jdbc:mysql://192.168.1.105:3306/sqoop_db --username root --password root --table product
--columns 'PRODUCT_ID,PRODUCT_NAME,LIST_PRICE,QUANTITY,CREATE_TIME' --where 'QUANTITY> 500' --target-dir '/sqoop/product2' --fields-terminated-by '#'
通过命令行查看:
执行命令:hadoop fs -ls -R /sqoop/product2/
执行命令:hadoop fs -cat /sqoop/product2/part-m-00004|grep '#'
1、where条件导入使用--query这个命令的时候,需要注意的是where后面的参数,AND$CONDITIONS这个参数必须加上而且存在单引号与双引号的区别,如果--query后面使用的是双引号,那么需要在$CONDITIONS前加上\即\$CONDITIONS如果设置map数量为1个时即-m 1,不用加上--split-by${tablename.column},否则需要加上。query使用 \ 将语句换行。
执行命令:
sqoop import --connect jdbc:mysql://192.168.1.105:3306/sqoop_db --username root --password root
--query 'SELECT P.PRODUCT_ID,P.PRODUCT_NAME,P.LIST_PRICE,P.QUANTITY,B.BRAND_ID,B.BRAND_NAME,P.CREATE_TIME FROM PRODUCT P
INNER JOIN BRAND B ON P.BRAND_ID = B.BRAND_ID WHERE P.QUANTITY > 500 AND $CONDITIONS'
--split-by P.PRODUCT_ID --target-dir '/sqoop/product3' --fields-terminated-by '#'
通过命令行查看:
执行命令:hadoop fs -ls -R /sqoop/product3/
执行命令:hadoop fs -cat /sqoop/product3/part-m-00001|grep '#'
1、将SQL语句查出的数据,进行导入到MySQL数据库中。另外需要注意的是,如果导入HDFS的使用的分隔符是'#',那么在数据导出到MySQL也需要指定分隔符是'#'。
执行命令:
sqoop export --connect jdbc:mysql://192.168.1.105:3306/sqoop_db --username root --password root
--export-dir '/sqoop/product3' --table PRODUCT_BRAND_TABLE -m 1 --input-fields-terminated-by '#'
在MySQL命令行执行SQL语句,查看数据:select * from product_brand_table;
1. 《Apache Sqoop Cookbook》
——厚积薄发(yuanxw)