文章目录
1.Why
- 电脑的硬盘是 hdfs,CPU+内存:mr;软件:hive,hbase
- 如何打通本地和大数据的道路呢
两种方式- 手动:我们使用浏览器把本地的文件上传到百度网盘中;(java连接hdfs)
- 手动:使用百度网盘推出的电脑app和手机app把数据上传到网盘中;
- 把数据上传到hdfs中,自动:数据有两种格式:文件(日志),数据库
- 日志:flume;
- 数据库里面的数据上传到hdfs中;
- 通过navicat导出功能;文件的格式得注意
- 通过hive建表
- 手动把txt文件上传到hdfs中
- sqoop 自动把数据库里面的数据上传到hdfs中
- 手动把操作 把数据库里面的数据上传到hdfs中
- 全量的数据 一次把数据都导入到hdfs中
- 增量数据 从导入数据的那一刻起 后续新增加的数据怎么办?
- 上传的文本文件巨大(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中(大数据生态圈)
4. 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导数据
- 客户端
- 把sqoop2 复制到node3上 (随便一台机器)
bin/sqoop2 -shell
set option --name verbose --value true
启动客户端图形界面服务:
set server --host node7-4 --port 12000 --webapp sqoop
检查是否连接成功
show version -all
- 创建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下面
- 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下面
- 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
将数据从大数据生态圈导入到数据中
- 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