大数据——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

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值