Sqoop安装和配置及数据迁移
下载Sqoop
下载链接:Sqoop
提取码:0tre
安装Sqoop
- 把安装包放入Linux上的software目录下
- 解压至opt目录下
[root@hadoop100 software]# tar -zxvf sqoop-1.4.6-cdh5.14.2.tar.gz -C /opt/
- 更改sqoop-1.4.6-cdh5.14.2的名字
[root@hadoop100 opt]# mv sqoop-1.4.6-cdh5.14.2 sqoop
[root@hadoop100 opt]# ll
- 进入sqoop目录下
[root@hadoop100 opt]# cd sqoop/
- 修改conf目录下的sqoop-env-template.sh的名字
[root@hadoop100 sqoop]# mv conf/sqoop-env-template.sh conf/sqoop-env.sh
- 配置conf目录下的sqoop-env.sh
[root@hadoop100 sqoop]# vi conf/sqoop-env.sh
- 添加配置
export HADOOP_COMMON_HOME=/opt/hadoop
export HADOOP_MAPRED_HOME=/opt/hadoop
export HBASE_HOME=/opt/hbase
export HIVE_HOME=/opt/hive
export ZOOKEEPER_HOME=/opt/zkpr
export ZOOCFGDIR=/opt/zkpr
- 保存退出,配置环境变量
[root@hadoop100 sqoop]# vi /etc/profile
- 添加配置
export SQOOP_HOME=/opt/sqoop
export PATH=$SQOOP_HOME/bin:$PATH
- 保存退出,使环境变量生效
[root@hadoop100 sqoop]# source /etc/profile
- 复制JDBC驱动到sqoop目录下的lib目录下
[root@hadoop100 sqoop]# cp ../hive/lib/mysql-connector-java-5.1.38.jar lib/
- 验证sqoop,查看版本
[root@hadoop100 sqoop]# bin/sqoop version
- 这时会出现一些warning警告,没有什么影响
- 解决warning警告
- 打开bin目录下的configure-sqoop
[root@hadoop100 sqoop]# vi bin/configure-sqoop
- 注释掉141行到156行
#使用 :<<! ! 注释
- 保存退出,再次查看版本
[root@hadoop100 sqoop]# bin/sqoop version
- 移动到sqoop目录下的lib目录下
[root@hadoop100 sqoop]# cd lib/
- 下载wget工具
[root@hadoop100 lib]# yum install -y wget
- 下载java-json.jar包到lib目录下并解压
[root@hadoop100 lib]# wget http://www.java2s.com/Code/JarDownload/java-json/java-json.jar.zip
- 下载unzip解压工具
[root@hadoop100 lib]# yum install -y unzip
- 解压java-json.jar.zip到lib目录下
[root@hadoop100 lib]# unzip java-json.jar.zip
- 返回上一级
[root@hadoop100 lib]# cd ..
- 测试sqoop是否能够成功连接到数据库(可以在末尾通过空格加上反斜杠达到换行的效果)
[root@hadoop100 sqoop]# bin/sqoop list-databases --connect jdbc:mysql://hadoop100:3306/ --username root --password ok
- 到这步才算真正的安装和配置好Sqoop
Sqoop是什么
Sqoop是一个用于在Hadoop和关系型数据库之间传输数据的工具
- 将数据从RDBMS导入到HDFS
HDFS、Hive、HBase
- 从HDFS导出数据到RDBMS
- 使用MapReduce导入和导出数据,提供并行操作和容错
目标用户
- 系统管理员、数据库管理员
- 大数据分析师、大数据开发工程师等
数据迁移
从RDB导入数据到HDFS(一)
导入表到HDFS
sqoop import
--connect jdbc:mysql://localhost:3306/hr #配置数据库连接为MySQL中数据库
--driver com.mysql.jdbc.Driver
--table user
--username root
--password hadoop
--target-dir /data/user #导入指定目录
--m 3 #--m表示Mapper数量
示例
- 导入表到HDFS中
[root@hadoop100 sqoop]# bin/sqoop-import \
--connect jdbc:mysql://hadoop100:3306/hive \
--driver com.mysql.jdbc.Driver \
--table TBLS \
--username root \
--password ok \
--target-dir /data/user \
--m 3
注意:目录必须要不存在
如果从mysql导入数据到hdfs失败
Exception in thread "main" java.lang.NoClassDefFoundError: org/json/JSONObject
- 查看数据
[root@hadoop100 sqoop]# hdfs dfs -cat /data/user/part-m-00000
从RDB导入数据到HDFS(二)
通过Where语句过滤导入表
sqoop import
--connect jdbc:mysql://localhost:3306/hr
--table orders
--where “order_date > ‘2015-10-10’” #指定where条件
--username root
--password hadoop
--delete-target-dir #如果目标目录存在,则删除
--target-dir /data/orders
--m 3
示例
- 导入表
[root@hadoop100 sqoop]# bin/sqoop-import
--connect jdbc:mysql://hadoop100:3306/hive
--driver com.mysql.jdbc.Driver
--table TBLS
--where "owner='root'"
--username root
--password ok
--delete-target-dir
--target-dir /data/user
--m 3
- 查看数据
[root@hadoop100 sqoop]# hdfs dfs -cat /data/user/part-m-00000
从RDB导入数据到HDFS(三)
通过COLUMNS过滤导入表
sqoop import
--connect jdbc:mysql://localhost:3306/hr
--table user
--columns “host,name,age” #导入指定列
--username root
--password hadoop
--delete-target-dir
--target-dir /data/user
--m 3
示例
导入表
[root@hadoop100 sqoop]# bin/sqoop-import
--connect jdbc:mysql://hadoop100:3306/hive
--driver com.mysql.jdbc.Driver
--table TBLS
--columns "tbl_id,owner,tbl_name,tbl_type"
--where "owner='root'"
--username root
--password ok
--delete-target-dir
--target-dir /data/user
--m 3
从RDB导入数据到HDFS(四)
使用query方式导入数据
sqoop import
--connect jdbc:mysql://localhost:3306/hr
--query “select * from user where host != '127.0.0.1' and \$CONDITIONS” #所有查询都应该以\$CONDITIONS结束;sqoop内部使用该条件将记录范围分发给所有Mapper
--username root
--password hadoop
--split-by host #指定用于分割数据的列为host
--delete-target-dir
--target-dir /data/user
--m 3
示例
- 导入表
[root@hadoop100 sqoop]# bin/sqoop-import
--connect jdbc:mysql://hadoop100:3306/hive
--driver com.mysql.jdbc.Driver
--query "select * from TBLS where owner='root' and \$CONDITIONS"
--username root
--password ok
--split-by tbl_id
--delete-target-dir
--target-dir /data/user
--m 3
注意:\$CONDITIONS和–split-by都不能省略,如果没有where筛选条件,也必须加上where \$CONDITIONS
- 查询数据
[root@hadoop100 sqoop]# hdfs dfs -cat /data/user/part-m-00000
从RDB导入数据到HDFS(五)
使用Sqoop增量导入数据
-
Incremental指定增量导入的模式
append:追加数据记录 lastmodified:可追加更新的数据
sqoop import
--connect jdbc:mysql://localhost:3306/hr
--table orders
--username root
--password hadoop
--incremental append #增量导入方式为append追加数据至已经存在的HDFS数据集
--check-column order_date #指定递增的列
--last-value ‘2015-10-10’ #指定上一次导入的最大值
--target-dir /data/orders
--m 3
示例
- 在SQL-yog中创建一个数据库student
CREATE DATABASE student;
- 在数据库student创建一个表students并插入数据
CREATE TABLE students(
sid INT AUTO_INCREMENT PRIMARY KEY,
sname VARCHAR(10),
age INT DEFAULT 20,
gender VARCHAR(10) DEFAULT 'sale'
);
INSERT INTO students(sname) VALUES("Michael"),
("Will"),("Steven"),("Lucy"),("Mike"),("Shelley"),
("Luly"),("Lily"),("Shell"),("Mich");
- 导入sid小于等于5的数据到hdfs中
[root@hadoop100 ~]# sqoop-import
--connect jdbc:mysql://hadoop100:3306/student
--table students
--where "sid<=5"
--username root -P
--target-dir "/data/stu"
--m 2
- 查看数据
[root@hadoop100 ~]# hdfs dfs -cat /data/stu/part-m-00000
- 追加内容sid大于5的数据
[root@hadoop100 ~]# sqoop-import
--connect jdbc:mysql://hadoop100:3306/student
--table students
--where "sid>5"
--username root -P
--incremental append
--check-column sid
--last-value 5
--target-dir "/data/stu"
--m 2
- 查看数据
[root@hadoop100 ~]# hdfs dfs -cat /data/stu/part-m-00002
导入文件格式
导入时指定文件格式参数
- –as-textfile 导入数据为text文件(默认)
- –as-avrodateafile 导入数据为avro文件
- –as-sequencefile 导入数据为sequence文件
- –as-parquetfile 导入数据为parquet文件
sqoop import
--connect jdbc:mysql://localhost:3306/hr
--table orders
--username root
--password hadoop
--delete-target-dir
--target-dir /data/orders
--m 3
--as-sequencefile
示例
[root@hadoop100 ~]# sqoop-import
--connect jdbc:mysql://hadoop100:3306/student
--table students
--where "sid<=5"
--username root -P
--target-dir "/data/stu"
--m 1
--as-sequencefile
从RDB导入数据到Hive(一)
直接导入数据到Hive
- –create-hive-table:自动创建表,生产中一般不使用
- –hive-overwrite:覆盖原有表数据
sqoop import
--connect jdbc:mysql://localhost:3306/hr
--table orders
--username root
--password hadoop
--hive-import #通过hive-import指定导入到Hive
--create-hive-table #指定创建一个新的hive表,如果表已经存在则报错
--hive-database retail_db
--hive-table orders
--m 3
--as-parquetfile
示例
导入jar包:从hive目录下的lib目录复制到sqoop目录下的lib目录下
- 导入commonjar包
[root@hadoop100 ~]# cp /opt/hive/lib/hive-common-1.1.0-cdh5.14.2.jar /opt/sqoop/lib/
- 导入execjar包
[root@hadoop100 ~]# cp /opt/hive/lib/hive-exec-1.1.0-cdh5.14.2.jar /opt/sqoop/lib/
- 在hive中创建一个数据库(用hive中已有的数据库也可以)
hive> create database sqooptest;
- 导入数据
[root@hadoop100 ~]# sqoop-import
--connect jdbc:mysql://hadoop100:3306/student
--username root
--password ok
--table students
--hive-import
--create-hive-table
--hive-database sqooptest
--hive-table students
--m 1
- 查看数据
hive> select * from students;
总结:
sqoop import
--connect jdbc:mysql://hadoop100:3306/student
--username root
--password ok
--table students
--hive-import
[--create-hive-table]
--hive-database 数据库名
--hive-table 表名
[--hive-overwrite]
[--m 1]
从RDB导入数据到Hive(二)
导入数据到Hive分区
sqoop import
--connect jdbc:mysql://localhost:3306/hr
--query “select order_id, order_status from orders where order_date >= ‘2014-07-24’ and order_date < ‘2014-07-25’ and \$CONDITIONS”
--username root
--password hadoop
--target-dir /user/data/orders
--split-by order_status
--hive-import
--hive-table eShop.orders
--hive-partition-key “order_date” #指定分区字段和分区值
--hive-partition-value “20140724”
--m 3
示例
- 导入数据
[root@hadoop100 ~]# sqoop-import
--connect jdbc:mysql://hadoop100:3306/student
--username root
--password ok
--query "select * from orders where order_date='2013-07-25' and \$CONDITIONS"
--hive-import
--hive-table sqooptest.orders_p
--hive-partition-key "date"
--hive-partition-value "20200724"
--hive-overwrite
--target-dir /data/orders
--m 1
从RDB导入数据到HBase
导入MySQL数据到HBase
sqoop import
--connect jdbc:mysql://localhost:3306/retail_db
--username root
--password hadoop
--table products
--columns "customernum, customername"
--hbase-table customercontactinfo #指定导入HBase表
--column-family CustomerName
--hbase-row-key customernum
-m 1
示例
- 导入数据
[root@hadoop100 ~]# sqoop-import
--connect jdbc:mysql://hadoop100:3306/student
--username root
--password ok
--table products
--columns "product_id,product_name","product_price"
--hbase-create-table
--hbase-table product
--column-family prod
--hbase-row-key product_id
--m 1
- 查看表结构和数据
hbase(main):003:0> desc 'product'
hbase(main):004:0> scan 'product'
导出HDFS数据到MySQL
使用sqoop export导出数据到MySQL
- 在MySQL中创建表
- 导出数据到MySQL
sqoop export
--connect jdbc:mysql://localhost:3306/sqoop
--username root
--password hadoop
--table emp_demo
--export-dir /data/sqoop/emp
--input-fields-terminated-by ',' #指定分隔符
-m 1
示例
- 使用SQL-yog在mysql中创建一个表并清除数据
CREATE TABLE stu AS SELECT * FROM student.`students`;
TRUNCATE TABLE stu;
- 导出数据到mysql中
[root@hadoop100 ~]# /opt/sqoop/bin/sqoop export
--connect jdbc:mysql://hadoop100:3306/sqoop
--username root
--password ok
--table stu
--export-dir /data/stu/
--input-fields-terminated-by '\001'
- 查看数据
SELECT * FROM stu