干货:Sqoop导入导出数据练习
sqoop简介
1,sqoop:sql-to-hadoop,
sqoop是连接关系型数据库和hadoop的桥梁: (1),把关系型数据库的数据导入到hadoop与其相关的系统(hbase和hive); (2),把数据从hadoop导出到关系型数据库里。 sqoop是利用mapreudude加快数据的传输速度,批处理的方式进行数据传输。
2,sqoop1&sqoop2
两个版本完全不兼容。版本的划分方式是apache:1.4.x,1.99.x。 sqoop2相对于sqoop1有很大改进:首先引入了sqoop server,集中化管理connector等,其次,sqoop2有多种访问方式:CLI,Web UI,REST API;最后sqoop2引入了角色的安全机制。 下图是sqoop架构图:
3,sqoop三要素
3,导入导出过程
导入导出过程类似,主要是分为两步: 1.获得元数据; 2. 提交map任务。 以import为例画出七过程图。
1,sqoop的安装
1.1 解压到安装目录
$tar -zxvf zookeeper-3.4.5-cdh5.3.6.tar.gz -C ./
1.2 配置环境变量
在sqoop的conf/目录下的sqoop-env.sh
#Set path to where bin/hadoop is available
export HADOOP_COMMON_HOME=/opt/cdh2.3.6/hadoop-2.5.0-cdh5.3.6
#Set path to where hadoop-*-core.jar is available
export HADOOP_MAPRED_HOME=/opt/cdh2.3.6/hadoop-2.5.0-cdh5.3.6
#set the path to where bin/hbase is available
#HBASE_HOME=
#Set the path to where bin/hive is available
export HIVE_HOME=/opt/cdh2.3.6/hive-0.13.1-cdh5.3.6
#Set the path for where zookeper config dir is
#export ZOOCFGDIR=/opt/cdh2.3.6/hive-0.13.1-cdh5.3.6
ZOOKEEPER_HOME=/opt/cdh2.3.6/zookeeper-3.4.5-cdh5.3.
1.3 注释掉hbase的检测
在configure-sqoop
## Moved to be a runtime check in sqoop.
#if [ ! -d "${HBASE_HOME}" ]; then
# echo "Warning: $HBASE_HOME does not exist! HBase imports will fail."
# echo 'Please set $HBASE_HOME to the root of your HBase installation.'
#fi
## Moved to be a runtime check in sqoop.
#if [ ! -d "${HCAT_HOME}" ]; then
# echo "Warning: $HCAT_HOME does not exist! HCatalog jobs will fail."
# echo 'Please set $HCAT_HOME to the root of your HCatalog installation.'
#fi
#if [ ! -d "${ACCUMULO_HOME}" ]; then
# echo "Warning: $ACCUMULO_HOME does not exist! Accumulo imports will fail."
# echo 'Please set $ACCUMULO_HOME to the root of your Accumulo installation.'
#fi
1.5 sqoop安装检测
shell中sqoop的安装目录下输入:
$bin/sqoop help
2,sqoop的import命令使用
2.1 使用mysql数据库
安装数据库驱动
cp /opt/modules/hive-0.13.1/lib/mysql-connector-java-5.1.27-bin.jar lib/
在mysql数据库中hadoop数据库创建一张表并导入数据
CREATE TABLE `my_user` (
`id` tinyint(4) NOT NULL AUTO_INCREMENT,
`account` varchar(255) DEFAULT NULL,
`passwd` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
);
INSERT INTO `my_user` VALUES ('1', 'admin', 'admin');
INSERT INTO `my_user` VALUES ('2', 'pu', '12345');
INSERT INTO `my_user` VALUES ('3', 'system', 'system');
INSERT INTO `my_user` VALUES ('4', 'zxh', 'zxh');
INSERT INTO `my_user` VALUES ('5', 'test', 'test');
INSERT INTO `my_user` VALUES ('6', 'pudong', 'pudong');
INSERT INTO `my_user` VALUES ('7', 'qiqi', 'qiqi');
2.2 将mysql中表数据import到hdfs
2.2.1 全表导入
bin/sqoop import
--connect jdbc:mysql://luffy.onepiece1.host:3306/hadoop
--username root
--password 123456
--table my_user
--num-mappers 1
--target-dir /user/hadoop/sqoop/import/imp_my_user
--delete-target-dir
--direct
--fields-terminated-by "t"
解释
--delete-target-dir :目标目录存在就删除
--target-dir:指定输出目录,不指定就直接在主目录下生产。
--num-mappers 1:设置map的个数
--direct:manager.DirectMySQLManager: Beginning mysqldump fast path import.使用这个命令会很快,本机装有mysql时,才可以使用。
--fields-terminated-by "t":设置输出文件分分割方式
--as-parquetfile :设置文件格式为parquetfile
--columns <col,col,col...> :指定表中部分字段进行导入
--query:直接查询
--where <where clause> :条件查询
四个提醒
WARN tool.BaseSqoopTool: Setting your password on the command-line is insecure. Consider using -P instead.
WARN manager.MySQLManager: It looks like you are importing from mysql.
WARN manager.MySQLManager: This transfer can be faster! Use the --direct
WARN manager.MySQLManager: option to exercise a MySQL-specific fast path.
2.2.2 增量导入
bin/sqoop import
--connect jdbc:mysql://luffy.onepiece1.host:3306/hadoop
--username root
--password 123456
--table my_user
--num-mappers 1
--target-dir /user/hadoop/sqoop/import/imp_my_user
--fields-terminated-by "t"
--check-column id
--incremental append
--last-value 4
2.2.3 文件格式
bin/sqoop import
--connect jdbc:mysql://luffy.onepiece1.host:3306/hadoop
--username root
--password 123456
--table my_user
--num-mappers 1
--target-dir /user/hadoop/sqoop/import/imp_my_user_parquet
--fields-terminated-by "t"
--as-parquetfile
2.2.3 设置支持压缩
$tar -zxvf cdh5.3.6-snappy-lib-natirve.tar.gz $ cp -r ./lib hadoop-2.5.0-cdh5.3.6$ bin/hadoop checknative
import数据到hdfs,并进行压缩
bin/sqoop import
--connect jdbc:mysql://luffy.onepiece1.host:3306/hadoop
--username root
--password 123456
--table my_user
--num-mappers 1
--target-dir /user/hadoop/sqoop/import/imp_my_user_snappy
--fields-terminated-by "t"
--compress
--compression-codec org.apache.hadoop.io.compress.SnappyCodec
2.2.4 指定RDBMS表中部分字段导入
bin/sqoop import
--connect jdbc:mysql://luffy.onepiece1.host:3306/hadoop
--username root
--password 123456
--table my_user
--num-mappers 1
--columns id
--target-dir /user/hadoop/sqoop/import/imp_my_user_id
--fields-terminated-by "t"
2.2.5 直接查询语句query
bin/sqoop import
--connect jdbc:mysql://luffy.onepiece1.host:3306/hadoop
--username root
--password 123456
--num-mappers 1
--query "select id,account from my_user where $CONDITIONS"
--target-dir /user/hadoop/sqoop/import/imp_my_user_quary
--delete-target-dir
--fields-terminated-by "t"
2.2.6 条件查询
bin/sqoop import
--connect jdbc:mysql://luffy.onepiece1.host:3306/hadoop
--username root
--password 123456
--num-mappers 1
--table my_user
--where "id>3"
--target-dir /user/hadoop/sqoop/import/imp_my_user_quary
--delete-target-dir
--fields-terminated-by "t"
2.2.7 按条件增量方式直接查询
bin/sqoop import
--connect jdbc:mysql://luffy.onepiece1.host:3306/hadoop
--username root
--password 123456
--query "select id,account from my_user where $CONDITIONS"
--where "id>3"
--num-mappers 1
--target-dir /user/hadoop/sqoop/import/imp_my_user
--fields-terminated-by "t"
--check-column id
--incremental append
--last-value 4
总结: 1)使用query,直接写SQL 2)导入数据全量和增量 全量: 所有数据 增量: * incremental paramters * query where
2.3 hive 与mysql之间数据导入导出
2.3.1 在mysql中创建一张表
CREATE TABLE `my_user2` (
`id` tinyint(4) NOT NULL AUTO_INCREMENT,
`account` varchar(255) DEFAULT NULL,
`passwd` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
);
2.3.2 将数据export到mysql
bin/sqoop export
--connect jdbc:mysql://luffy.onepiece1.host:3306/hadoop
--username root
--password 123456
--table my_user2
--num-mappers 1
--input-fields-terminated-by "t"
--export-dir /user/hadoop/sqoop/import/imp_my_user
2.3.3 import to hive
hive导入参数
--hive-home 重写$HIVE_HOME
--hive-import 插入数据到hive当中,使用hive的默认分隔符
--hive-overwrite 重写插入
--create-hive-table 建表,如果表已经存在,该操作会报错!
--hive-table [table] 设置到hive当中的表名
--hive-drop-import-delims 导入到hive时删除 n, r, and 1
--hive-delims-replacement 导入到hive时用自定义的字符替换掉 n, r, and 1
--hive-partition-key hive分区的key
--hive-partition-value hive分区的值
--map-column-hive 类型匹配,sql类型对应到hive类型
hive空值处理 sqoop会自动把NULL转换为null处理,但是hive中默认是把N来表示null,因为预先处理不会生效的我们需要使用 --null-string 和 --null-non-string来处理空值 把N转为N
sqoop import ... --null-string '\N' --null-non-string '\N'
在hive中创建一张表
drop table if exists db_1206.h_user ;
create table db_1206.h_user(
id int,
account string,
password string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY 't' ;
导入数据到hive中
bin/sqoop import
--connect jdbc:mysql://luffy.onepiece1.host:3306/hadoop
--username root
--password 123456
--table my_user
--num-mappers 1
--fields-terminated-by "t"
--delete-target-dir
--hive-database db_1206
--hive-import
--hive-table h_user
过程: mysql-table -> hdfs: /user/beifeng/my_user/xx 存在可查看 -> hive-table-hdfs-dir
2.3.4 hive 增量export to mysql
在mysql中创建一张表
CREATE TABLE `user_export` (
`id` tinyint(4) NOT NULL AUTO_INCREMENT,
`account` varchar(255) DEFAULT NULL,
`passwd` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
);
bin/sqoop export
--connect jdbc:mysql://luffy.onepiece1.host:3306/db_1206
--username root
--password 123456
--table user_export
--num-mappers 1
--input-fields-terminated-by "t"
--export-dir /user/hive/warehouse/db_1206.db/h_user
2.4 shell脚本执行sqoop指令文件
流程:
shell scripts
## step 1
load data .....
## step 2
bin/hive -f xxx.sql
## step 3
bin/sqoop --option-file yy.txt
import.txt封装sqoop指令
mport
--connect
jdbc:mysql://luffy.onepiece1.host:3306/hadoop
--username
root
--password
123456
--table
my_user
--num-mappers
1
--target-dir
/user/hadoop/sqoop/import/imp_my_user
--delete-target-dir
执行指令
bin/sqoop --options-file /opt/cdh2.3.6/sqoop-1.4.5-cdh5.3.6/import.txt
其实,sqoop完全可以用spark代替掉。
推荐阅读:
2,Flink DataStream编程指南及使用注意事项。
4,大数据基础系列之kafkaConsumer010+的多样demo及注意事项
- MySQL修改数据类型的问题总结(r10笔记第74天)
- 深究|Elasticsearch单字段支持的最大字符数?
- Go语言中Socket通信之Tcp客户端
- Oracle 12c PDB迁移及ORA-00600错误分析和解决(r10笔记第72天)
- 【Go 语言社区】epoll详解
- Oracle 12c数据库升级实战(r10笔记第70天)
- Oracle 12c升级检查问题分析(r10笔记第69天)
- 转--使用Revel(go)开发网站
- GoldenGate数据迁移的问题总结(二)(r10笔记第85天)
- Elasticsearch究竟要设置多少分片数?
- 设计模式(1)-使用简单工厂优化代码
- 简单易学的机器学习算法——因子分解机(Factorization Machine)
- Elasticsearch全文检索实战小结——复盘我带的第二个项目
- golang语言是如何处理栈的
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Nmap NSE 库分析 >>> httpspider
- Nmap NSE 库分析 >>> url
- Go语言中的byte和rune区别、对比
- Nmap NSE 缺陷
- Golang服务器热重启、热升级、热更新(safe and graceful hot-restart/reload http server)详解
- Nmap NSE 库分析 >>> shortport
- Linux 后门系列之 python3 反弹shell & 隐藏后门
- nc 反弹shell | Linux 后门系列
- dash & rbash & nc.openbsd | Linux 后门系列
- 通达OA getshell | Nmap 脚本
- Golang的优雅重启
- 通达OA文件包含全版本 getshell | Nmap 脚本
- NSE代码生成器 | Nmap 脚本
- shell 加密传输 | Linux后门系列
- msf反弹一把梭 | Linux后门系列