sqoop安装

本文介绍了sqoop作为数据迁移工具的作用,详细讲解了sqoop1和sqoop2的架构及区别,重点在于sqoop2的实战安装过程,包括服务器配置、环境变量设置、元数据导入、link创建和job执行。同时,文章还涵盖了sqoop1的导入导出操作以及在遇到问题时的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.Why

  • 电脑的硬盘是 hdfs,CPU+内存:mr;软件:hive,hbase
  • 如何打通本地和大数据的道路呢
    两种方式
    1. 手动:我们使用浏览器把本地的文件上传到百度网盘中;(java连接hdfs)
    2. 手动:使用百度网盘推出的电脑app和手机app把数据上传到网盘中;
  • 把数据上传到hdfs中,自动:数据有两种格式:文件(日志),数据库
    1. 日志:flume;
    2. 数据库里面的数据上传到hdfs中;
      1. 通过navicat导出功能;文件的格式得注意
      2. 通过hive建表
      3. 手动把txt文件上传到hdfs中
      4. sqoop 自动把数据库里面的数据上传到hdfs中
  • 手动把操作 把数据库里面的数据上传到hdfs中
    1. 全量的数据 一次把数据都导入到hdfs中
    2. 增量数据 从导入数据的那一刻起 后续新增加的数据怎么办?
    3. 上传的文本文件巨大(100G)

2.介绍

1.介绍

  • 将关系数据库(oracl mysql postgresql等)数据与hadoop数据进行转换的工具
  • 官方网址 http://sqoop.apache.org/
  • 版本 (两个版本完全不兼容 sqoop1使用的最多)
  •   sqoop1 1.4.x
    
  •   sqoop2 1.99.x
    

1.4.7:在线手册http://sqoop.apache.org/docs/1.4.7/index.html
在这里插入图片描述
Sqoop2:http://sqoop.apache.org/docs/1.99.7/index.html
在这里插入图片描述

  • 同类产品
  • DataX 阿里顶级数据交换工具

2. sqoop架构

  • sqoop架构非常简单 是hadoop生态系统的架构最简单的框架
  • sqoop1 由client端直接接入hadoop 人物通过解析生成对应的mapreduce执行
  • sqoop1 仅有一个客户端 架构简单明了 部署即用 使用门槛比较低 但是耦合性强 用户密码暴漏不安全
  • sqoop2 服务端部署 运行 提供li rest api webui 等入口 connector集中管理 rdbms账户控制更安全 但是sqoop2仅负责数据的读写操作 架构相对复杂
    Sqoop1
    在这里插入图片描述
    Sqoop2
    在这里插入图片描述

3. sqoop1导入

把数据从数据库导入到hdfs中(大数据生态圈)
把数据从数据库导入到hdfs中

4. sqoop1导出

sqoop1导出

5.sqoop工具

sqoop工具 
选项 	含义说明
--connect <jdbc-uri> 指定JDBC连接字符串
--connection-manager <class-name> 指定要使用的连接管理器类
--driver <class-name> 指定要使用的JDBC驱动类
--hadoop-mapred-home <dir> 指定$HADOOP_MAPRED_HOME路径
--help 万能帮助
--password-file 设置用于存放认证的密码信息文件的路径
-P 从控制台读取输入的密码
--password <password> 设置认证密码
--username <username> 设置认证用户名
--verbose 打印详细的运行信息
--connection-param-file <filename> 可选,指定存储数据库连接参数的属性文件

6.但如工具import

选选项项 含义说明含义说明
--append 将数据追加到HDFS上一个已存在的数据集上
--as-avrodatafile 将数据导入到Avro数据文件
--as-sequencefile 将数据导入到SequenceFile
--as-textfile 将数据导入到普通文本文件(默认)
--boundary-query <statement> 边界查询,用于创建分片(InputSplit)
--columns <col,col,col…> 从表中导出指定的一组列的数据
--delete-target-dir 如果指定目录存在,则先删除掉
--direct 使用直接导入模式(优化导入速度)
--direct-split-size <n> 分割输入stream的字节大小(在直接导入模式下)
--fetch-size <n> 从数据库中批量读取记录数
--inline-lob-limit <n> 设置内联的LOB对象的大小
-m,--num-mappers <n> 使用n个map任务并行导入数据
-e,--query <statement> 导入的查询语句
--split-by <column-name> 指定按照哪个列去分割数据
--table <table-name> 导入的源表表名
--target-dir <dir> 导入HDFS的目标路径
--warehouse-dir <dir> HDFS存放表的根路径
--where <where clause> 指定导出时所使用的查询条件
-z,--compress 启用压缩
--compression-codec <c> 指定Hadoop的codec方式(默认gzip)
--null-string <null-string> 如果指定列为字符串类型,使用指定字符串替换值为null的该类列的值
--null-non-string <null-string> 如果指定列为非字符串类型,使用指定字符串替换值为null的该类列的值

7. 导入工具export:

选项 含义说明
--validate <class-name> 启用数据副本验证功能,仅支持单表拷贝,可以指定验证使用的实现类
--validation-threshold <class-name> 指定验证门限所使用的类
--direct 使用直接导出模式(优化速度)
--export-dir <dir> 导出过程中HDFS源路径
--m,--num-mappers <n> 使用n个map任务并行导出
--table <table-name> 导出的目的表名称
--call <stored-proc-name> 导出数据调用的指定存储过程名
--update-key <col-name> 更新参考的列名称,多个列名使用逗号分隔
--update-mode <mode> 指定更新策略,包括:updateonly(默认)、allowinsert
--input-null-string <null-string> 使用指定字符串,替换字符串类型值为null的列
--input-null-non-string <null-string> 使用指定字符串,替换非字符串类型值为null的列
--staging-table <staging-table-name> 在数据导出到数据库之前,数据临时存放的表名称
--clear-staging-table 清除工作区中临时存放的数据
--batch 使用批量模式导出

3. sqoop2 实战安装

1. 服务器端

  • 选择node1来安装sqoop2
  • 启动hadoop集群
  • 将sqoop的包上传到linux合适的目录中 解压
  • 修改hadoop的配置 修改core-site.xml
<property>
  <name>hadoop.proxyuser.root.hosts</name>
  <value>*</value>
</property>
<property>
  <name>hadoop.proxyuser.root.groups</name>
  <value>*</value>
</property>
  • sqoop解压sqoop2
tar -xzf sqoop-1.99.7-bin-hadoop200.tar.gz
rm -rf sqoop-1.99.7-bin-hadoop200.tar.gz
mv sqoop-1.99.7-bin-hadoop200/ sqoop-2
rm -rf docs/
  • 将mysql的驱动包放到%sqoop_home%\server\lib
    mysql驱动包 mysql-connector-java-8.0.20.jar
    在这里插入图片描述
  • 修改%Sqoop_home%cong/sqoop/properties
org.apache.sqoop.submission.engine.mapreduce.configuration.directory=/data/hadoop/hadoop/etc/hadoop/

在这里插入图片描述

  • 初始化并验证
bin/sqoop2-tool verify

将这些包都增加到环境变量中
在这里插入图片描述

  • 配置环境变量 修改bin/sqoop/sh
  • 在这里插入图片描述
    出现以下界面,说明OK
    在这里插入图片描述
    失败
    在这里插入图片描述
    **

一定要把hadoop\share\hadoop\common\lib\guava-27.0-jre.jar拷贝到/data/sqoop/sqoop-2/server/lib;和/data/sqoop/sqoop-2/tools/lib 删除老的,留下新的

**

  • 启动服务
bin/sqoop2-server start

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 日志
    在这里插入图片描述
    在这里插入图片描述

2.工具

  • 八元数据从derby导出
    bin/sqoop2-tool repositorydump -o ~/data.json
    在这里插入图片描述
    bin/sqoop2-tool repositorydump -o ~/data.json
    在这里插入图片描述
  • 元数据导入
    sqoop2-tool repositoryload -i ~/data.json
    在这里插入图片描述

3.创建link导数据

  1. 客户端
  • 把sqoop2 复制到node3上 (随便一台机器)
    bin/sqoop2 -shell
    在这里插入图片描述
    在这里插入图片描述
    set option --name verbose --value true
    启动客户端图形界面服务:
set server --host node7-4 --port 12000 --webapp sqoop

检查是否连接成功

show version -all
  1. 创建hdfs link
    创建hdfs的链接器
create link --connector hdfs-connector
hdfs://node7-1:8020
/data/hadoop/hadoop/etc/hadoop

在这里插入图片描述
3. 创建一个mysql的link
看看自己的mysql数据库是否有数据库userscenter
看看自己的网关

create link --connector generic-jdbc-connector
com.mysql.cj.jdbc.Driver    
jdbc:mysql://192.168.56.1/**userscenter**?useSSL=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true

在这里插入图片描述
4. 创建一个job 从link(mysql)到link(hdfs)

create job --from mysql --to hdfs

在这里插入图片描述
在这里插入图片描述
5. 创建一个job 从hdfs–>mysql
表是手动复制的a_users表,(表里面的数据应该清空)
在这里插入图片描述
在这里插入图片描述
6. 启动job

start job --name myjob

在这里插入图片描述
查看任务状态:

status job --name myjob

在这里插入图片描述
删除任务

Delete  job -n myjob

在这里插入图片描述
结果:
在这里插入图片描述
在这里插入图片描述

4 实战sqoop1

  • 手册
    在这里插入图片描述

在这里插入图片描述

  • 配置环境变量
  • 复制conf/sqoop-env-template.sh为sqoop-env.sh
    -在这里插入图片描述
  • 启动命令
    在这里插入图片描述
bin/sqoop help
bin/sqoop help import
bin/sqoop import --help

在这里插入图片描述

1. sqoop-import

将数据从数据库导入到大数据生态圈
1. mysql -->hdfs

  • 基于userscenter这个数据库
# 查询mysql提供的数据
bin/sqoop import --driver com.mysql.cj.jdbc.Driver --connect jdbc:mysql://192.168.56.1/userscenter?serverTimezone=GMT%2B8 --table a_users --username root --password 123456 --verbose --target-dir=/sqoop/a_users
# 导入数据
# --query和--table是互斥的;
#$CONDITIONS sql语句执行的条件,这个条件由sqoop自己控制
#--split-by;拆分的这一列不能重复,一般是主键
bin/sqoop import --connect jdbc:mysql://192.168.56.1/userscenter?serverTimezone=GMT%2B8 --username root --password 123456 --verbose --fetch-size 30 --query 'select * from a_users where $CONDITIONS' --split-by id  --target-dir=/sqoop/a_users
# 新建一个文件;(一行一个,使用#注释);文件名随便写
import
--connect
jdbc:mysql://192.168.56.1/userscenter?serverTimezone=GMT%2B8
--username
root
--password
123456
--verbose
--fetch-size
30
--query
'select * from a_users where $CONDITIONS'
--split-by
id
--target-dir=/sqoop/a_users
# 执行目录带上文件
bin/sqoop --options-file /root/sqoop_file.txt 
bin/sqoop import --connect jdbc:mysql://192.168.56.1:3306/mydata?useSSL=false \
--username root --password 123456 --verbose --fetch-size 30 --query 'select * from a_king where $CONDITIONS' --split-by id  \
--target-dir=/sqoop/a_king

在这里插入图片描述

  • 拷贝mysql驱动包(mysql)
  • sqoop与hadoop-mapperreduce的jar有问题 手动将hadoop-mapper的jar包考到sqoop下面
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  1. mysql–hive
  • 将hive-common-3.1.1.jar拷贝到sqoop/lib下面
  • 命令
# fields-terminated-by;列的分隔符

bin/sqoop import --connect jdbc:mysql://192.168.56.1/test_hive?serverTimezone=GMT%2B8 \
--username root --password 123456 --verbose --fetch-size 30 --query 'select * from a_dynasty where $CONDITIONS' --split-by id  \
--target-dir=/sqoop/a_dynasty \
--fields-terminated-by ',' \
--hive-import \
--hive-table mydata.a_dynasty  --hive-overwrite

在这里插入图片描述
在这里插入图片描述

  • 将hive-common-3.1.1.jar拷贝到sqoop/lib下面
    在这里插入图片描述
  1. mysql-hbase
    拷贝hbase-client-2.2.5.jar包sqoop
    在这里插入图片描述
bin/sqoop import  --connect jdbc:mysql://192.168.56.1:3306/mydata?useSSL=false \
--username root --password 123456 --verbose --fetch-size 30 --query 'select * from a_dynasty where $CONDITIONS' --split-by id  \
--target-dir=/sqoop/a_dynasty \
--fields-terminated-by ',' \
--hbase-table a_dynasty  \
---column-family cf --hbase-row-key id --hbase-create-table 

2.sqoop-import-all-tables

将一个库里面的所有的表都导出来

bin/sqoop import-all-tables  --connect jdbc:mysql://192.168.56.1:3306/test_hive?serverTimezone=GMT%2B8 \
--username root --password 123456 --verbose --fetch-size 30 \
--warehouse-dir=/sqoop/a_dynasty 

3.sqoop-export

将数据从大数据生态圈导入到数据中

  1. hdfs–>mysql
bin/sqoop export --connect jdbc:mysql://192.168.56.1:3306/test_hive?serverTimezone=GMT%2B8 --username root --password 123456 --verbose  --table a_dynasty \
--export-dir=/sqoop/a_dynasty/a_dynasty

4.JOB

#创建job
bin/sqoop job --create myjob -- import --connect jdbc:mysql://192.168.56.1:3306/test_hive?serverTimezone=GMT%2B8 --username root --password 123456 --verbose --fetch-size 30 --query 'select * from a_king where $CONDITIONS' --split-by id  --target-dir=/sqoop/a_king 
#查看所有job
bin/sqoop job --list
# 查看单个job
bin/sqoop job --show myjob
#执行job
bin/sqoop job --exec myjob
# 删除job
bin/sqoop job --delete myjob

在这里插入图片描述
在这里插入图片描述
将json的包上传到sqoop/lib下面

5.常见问题

启动job任务时报错

解决:

创建generic-jdbc-connector link 时:

Identifier enclose:指定SQL中标识符的定界符,也就是说,有的SQL标示符是一个引号:select * from "table_name",这种定界符在MySQL中是会报错的。这个属性默认值就是双引号,所以不能使用回车,必须将之覆盖,使用空格覆盖了这个值

Identifier enclose:  注意  这里不能直接回车!要打一个空格符号!因为如果不打,查询mysql表的时候会在表上加上“”,导致查询出错!

mysql–>hdfs–>手动创建表 使用load data 把数据加载过来

1.linux执行sh文件的问题

在这里插入图片描述

2.sqoop执行job时StringUtils

在这里插入图片描述
解决方法是把 comm-lang2.5拷贝到hadoop集群中
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 启动jobhistoryServer
# 老的
sbin/mr-jobhistory-daemon.sh start historyserver
# 新的
bin/mapred --daemon start historyserver

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值