Sqoop是什么???
Sqoop:SQL-to-Hadoop 传统数据库与Hadoop间数据同步工具 利用Mapreduce分布式批处理,加快了数据传输速度,保证了容错性
Sqoop的工作原理
sqoop1 import原理: 从传统数据库获取元数据信息(schema、table、field、field type),把导入功能转换为只有Map的Mapreduce作业,在mapreduce中有很多map,每个map读一片数据,进而并行的完成数据的拷贝。
sqoop1 export原理: 获取导出表的schema、meta信息,和Hadoop中的字段match;多个map only作业同时运行,完成hdfs中数据导出到关系型数据库中
1、Sqoop介绍
Sqoop即 SQL to Hadoop ,是一款方便的在传统型数据库与Hadoop之间进行数据迁移的工具,充分利用MapReduce并行特点以批处理的方式加快数据传输,发展至今主要演化了二大版本,Sqoop1和Sqoop2,我们以Sqoop1为案例进行讲解,Sqoop2商用不太稳定。
Sqoop工具是hadoop下连接关系型数据库和Hadoop的桥梁,支持关系型数据库和hive、hdfs,hbase之间数据的相互导入,可以使用全表导入和增量导入。
hive的工作原理
2. sqoop安装
2.1. 上传解压
tar -zxvf sqoop-1.4.4.bin__hadoop-2.0.4-alpha.tar.gz -C /wishedu/2.2. 配置环境变量
vi /etc/profile
在最后面增加:
export SQOOP_HOME = /wishedu/sqoop-1.4.4 export PATH=$PATH:$JAVA_HOME/bin;$HADOOP_HOME/bin:$SQOOP_HOME/bin
`刷新profile:`
source /etc/profile
2.3. 重命名配置文件
在$SQOOP_HOME/conf中执行命令
mv sqoop-env-template.sh sqoop-env.sh
2.4. 修改配置文件sqoop-env.sh
1.#Set path to where bin/hadoop is available 2.export HADOOP_COMMON_HOME=/wishedu/hadoop-2.4.1/ 3. 4.#Set path to where hadoop-*-core.jar is available 5.export HADOOP_MAPRED_HOME=/wishedu/hadoop-2.4.1/ 6. 7.#set the path to where bin/hbase is available 8.#export HBASE_HOME= 9. 10.#Set the path to where bin/hive is available 11.export HIVE_HOME=/wishedu/hive-0.13.0-bin 12. 13.#Set the path for where zookeper config dir is 14.#export ZOOCFGDIR=
目前是伪分布式部署的hadoop,暂时不用配置zk,Hbase的导入导出详见hbase章节
-
2.5. 添加数据库驱动
把MySQL的JDBC驱动包复制到Sqoop的lib目录下
3. sqoop导入导出(hdfs)
3.1. 导入
3.1.1. 普通导入
sqoop import --connect jdbc:mysql://192.168.1.101:3306/mysql --username root --password root --table user --columns ‘name, age’ –m 1 <表没有主键时,需要指定map数量为1>
3.1.2. 指定输出路径、指定数据分隔符
sqoop import --connect jdbc:mysql://192.168.1.101:3306/test --username root --password root --table user --target-dir ‘/sqoop/d1’ --fields-terminated-by '\t’
3.1.3. 指定Map数量 -m
sqoop import --connect jdbc:mysql://192.168.1.101:3306/test --username root --password root --table user --target-dir ‘/sqoop/d1’ --fields-terminated-by ‘\t’ -m 2
3.1.4. 增加where条件
`sqoop import --connect jdbc:mysql://192.168.1.101:3306/test --username root --password root --table user --where ‘age>20’ --target-dir '/sqoop/d1’
3.1.5. 使用query语句
sqoop import --connect jdbc:mysql://192.168.1.101:3306/test --username root --password root --query ‘SELECT * FROM user where age > 20 AND $CONDITIONS’ --split-by user.age --target-dir ‘/sqoop/d1’
使用query语句必须指定split-by和–target-dir
3.1.6. 使用 \将语句换行
>sqoop import
–connect jdbc:mysql://192.168.1.101:3306/test
–username root
–password root
–query ‘SELECT * FROM user where age > 20 AND $CONDITIONS’
–split-by user.age
–target-dir '/sqoop/d1’3.1.7. 增量导入
1、根据id
sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password root --table user --target-dir ‘/sqoop/user’ --incremental append --check-column id --last-value 10 -m 1
–incremental append选项使用append模式,
–check-column id 使用id字段来做增量
–last-value为10,从MySQL表中主键id>10开始同步。
`2、根据时间戳`
–incremental lastmodified --check-column last_update --last-value '2017-03-20 11:00:00’
3.2. 导出
先建好相对应的表,才能导出
sqoop export --connect jdbc:mysql://192.168.1.101:3306/test --username root --password root --export-dir ‘/sqoop/testdata/user’ --table user -m 1 --fields-terminated-by '\t’
4. sqoop导入导出(hive)
4.1. 导入
4.1.1. 普通导入
sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password root --table user --hive-import –m 1
内部执行实际分三部,1.将数据导入hdfs(可在hdfs上找到相应目录),2.创建hive表名相同的表,3,将hdfs上数据导入hive表中
4.1.2. 创建hive表
sqoop create-hive-table --connect jdbc:mysql://localhost:3306/test --username root --password root --table user --hive-table user123 --fields-terminated-by "\t"
4.1.3. 指定hive表名、指定数据分隔符
sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password root --table user --hive-import --hive-table user123 --fields-terminated-by '\t’
4.1.4. 通过create-hive-table创建表
sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password root --table user --hive-import --create-hive-table --hive-table user123 --fields-terminated-by ‘\t’
可以通过 --create-hive-table 创建表,如果表已经存在则会执行失败
如果提示目录已存在,可以在导入脚本后面追加:–delete-target-dir
4.1.5. 覆盖hive表的内容
sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password root --table user --hive-import --hive-overwrite --hive-table user123 --fields-terminated-by '\t’
4.1.6. 增加where条件
sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password root --table user --where ‘age>20’ --hive-import --hive-table user123 --fields-terminated-by '\t’
4.1.7. 指定编码格式
sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password root --table user --where ‘age>20’ --hive-import --hive-table user123 --fields-terminated-by ‘\t’ --default-character-set=utf-8
4.1.8. 使用query语句
sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password root --query ‘select * from user where age>30 and $CONDITIONS’ --hive-import --hive-table user123 --fields-terminated-by ‘\t’ --target-dir ‘/sqoop/user123’ --split-by user.age
使用query语句必须指定split-by和–target-dir
4.1.9. 增量导入
1、根据id
sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password root --table user --hive-import --hive-table user123 --incremental append --check-column id --last-value 11 --fields-terminated-by '\t’
2、根据时间戳
通过时间戳来增量导入的脚本:
–incremental lastmodified --check-column last_update --last-value ‘2017-03-20 11:00:00’
完整脚本:
sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password root --table user --hive-import --hive-table user123 --incremental lastmodified --check-column last_update --last-value ‘2017-03-20 11:00:00’ --fields-terminated-by '\t’
4.2. 导出
sqoop export --connect jdbc:mysql://localhost:3306/test-username root --password root --export-dir ‘/user/hive/warehouse/user123’ --table user -m 1 --fields-terminated-by '\t’
5. sqoop job指令
5.1. 相关命令:
bin/sqoop job
bin/sqoop-job
5.2. 基本用法:
bin/sqoop job --create 创建job
bin/sqoop job --delete 删除job
bin/sqoop job --exec 执行job
bin/sqoop job --show 显示job
bin/sqoop job --list 列出job
`5.3. 创建和执行job`
创建job(注意:-- import之间需要空格)
sqoop job --create synuser – import --connect jdbc:mysql://localhost:3306/test --username root -P --table user --target-dir ‘/sqoop/ d2’ -m 1
创建了job,id为“synuser”,它是将MySQL数据库test中的user表同步hdfs中。然后我们根据这个job的id去查询job详细配置情况:
bin/sqoop job --show synuser
我们可以通过job的id来执行job:
bin/sqoop job --exec synuser
5.4. 安全配置
默认情况下,创建的每个job在运行的时候都不会进行安全的认证。如果我们希望限制指定的sqoop job的执行,只有经过认证以后才能执行,这时候可以使用sqoop job的安全选项。Sqoop安装目录下,通过修改配置文件conf/sqoop-site.xml可以对job进行更高级的配置。实际上,我们使用了Sqoop的metastore工具,它能够对Sqoop进行细粒度的配置。
我们要将MySQL数据库中的数据同步到Hive表,每次执行sqoop job都需要输入访问MySQL数据库的连接账号信息,可以设置sqoop.metastore.client.record.password的值为true。如果在conf/sqoop-site.xml中增加如下配置,会将连接账号信息存储到Sqoop的metastore中:
1.<property> 2. <name>sqoop.metastore.client.record.password</name> 3. <value>true</value> 4. <description>If true, allow saved passwords in the metastore. </description> 5.</property>
5.5. 定时任务
在实际开发运维过程,我们常常要定时执行导入脚本,可以使用crontab来制作定时任务:
crontab -e
0 */1 * * * sqoop job --exec synuser > sqoop_synuser.log 2>&1 &