sqoop
产生背景
基于传统关系型数据库的稳定性,还是有很多企业将数据存储在关系型数据库中,早期由于工具的缺乏,hadoop与传统数据库之间的数据传输非常的困难,基于前两个方面的考虑,需要一个在传统关系型数据库 和hadoop之间进行数据传输的项目,sqoop应运而生
sqoop是什么
sqoop是一个用于hadoop和结构化存储(如关系型数据库之间进行高效传输大批量数据的工具,他包括两个方面,
可以用sqoop将数据从关系型数据库管理系统如mysql导入到hadoop系统(hdfs,hive,hbase中
将数据从hadoop系统中抽取并导出到关系型数据库中(如mysql)
常用的数据库开源工具
1sqoop
2datax
3kettle
4cannal
底层实现原理
sqoop的核心设计思想是利用mapreduce加快数据传输速度,也就是说sqoop的导入和导出功能都是基于maptask(只有map 的)mapreduce作业实现的,所以他是一种批处理方式进行数据传输,难以实现现实数据进行导入导出
特点
优点:他可以将跨平台的数据进行整合
缺点:他不是很灵活
主要执行操作
import:从关系型数据库到hadoop
export:从hadoop到关系型数据库
sqoop安装
解压
tar -zxvf /root/sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz -C /usr/local/ 改名 mv sqoop-1.4.7.bin__hadoop-2.6.0 sqoop1.4.7 修改环境变量 export SQOOP_HOME=/usr/local/sqoop1.4.7 export PATH=$PATH:$SQOOP_HOME/bin
新建配置文件
mv ./conf/sqoop-env-template.sh ./conf/sqoop-env.sh
修改配置文件
vi ./conf/sqoop-env.sh
安装hadoop系列的目录
export HADOOP_COMMON_HOME=/opt/soft/hadoop/hadoop-2.7.6 export HADOOP_MAPRED_HOME=/opt/soft/hadoop/hadoop-2.7.6 export HIVE_HOME=/opt/soft/hive-2.3.7 export ZOOCFGDIR=/opt/apps/zookeeper
拷贝mysql驱动
因为我们必须现在通过jdbc和hdfs等进行数据的导入导出,所以我们先必须把jdbc的驱动包拷贝到sqoop/lib路径下
cp /root/mysql-connector-java-5.1.38.jar ./lib/
验证安装
sqoop version
sqoop命令执行
常见的命令执行参数
sqoop help查看常见的命令行
直接执行命令
通过参数查看数据库 sqoop list-databases --connect jdbc:mysql://localhost:3306 --username root --password 123456
通过文件传递参数(脚本)
在执行sqoop命令时,如果每次执行的命令都相似,那么把相同的参数可以抽取出来放在一个文本本件里,把执行时的参数加入到这个文本文件为参数即可这个文本文件可以用 --option-file来指定,平时可以用定时任务来执行这个脚本,避免每次手工操作
jdbc的参数一般是不变的,可以把他抽离出来放在一个文件中放在sqoop根目录下config.conf里
list-databases --connect jdbc:mysql://local:3306 --username root --password 123456
我们可以执行命令链接数据库
sqoop --option-file config.conf
为了让配置文件config.txt的可读性更像可以加入空行和注释
不会影响文件内容的读取
#指令:列出mysql中的所有数据库 list-databases #指定链接字符串 --connect jdbc:mysql://localhost:3306 --username root --password 123456
import详解
import是从关系数据库导入到hadoop下面是一些通用参数的介绍
通过参数
--connect | 指定jdbc链接字符串 |
---|---|
--connection-manager | 指定链接管理类 |
--driver | 指定链接的驱动程序 |
-P | 从控制台读取密码(可以防止密码显示控制台) |
--password | 指定数据库的密码 |
--username | 只当访问数据库的用户名 |
连接数据库
sqoop的设计就是把数据库导入hdfs,所以必须指定连接的字符串再能访问数据库,这个链接字符类似于url这个来连接字符串通过--connect参数指定,它描述了链接的数据库地址和具体的链接数据库
sqoop import --connect jdbc:msyql://database.example.com/employees #指定链接的数据库服务器地址是database.example.com,要连接的数据库是employees
上面链接命令只是指定数据库,默认情况下,数据库都是需要用户名和参数的,这里可以用--username和--password来指定
#指定用户名和密码来链接数据库
sqoop import --connect jdbc:mysql://localhost:3306/mysql --username root --password 123456
查看数据库
在sqoop中可以通过list-databases参数来查看mysql的数据库,这样在导入之前可以得到所有数据库的名字
#列出所有数据库 sqoop list-databases --connect jdbc:mysql://localhost:3306 --username root -password 123456
查看所有表
在得到所有的数据库的名字后,也可以查看当前数据库中 的所有表,使用list-tables参数来进行查看,查看的时候可以在url连接中指定数据库的名字
#列出数据库中所有表 sqoop list-tables --connect jdbc:mysql://localhost:3306/leetom --username root --password 123456
import的参数控制
--append 通过追加的方式导入到hdfs --as-avrodatafile 导入为avro data文件格式 --as-sequencefile 导入为sequenceFiles文件格式 --as-textfile 导入为文本格式(默认值) --as-parquefile 导入为parquet文件格式 --columns 指定要导入的列 --delete-target-dir 如果目标文件夹存在,则删除 --fetch-size 一次从数据库读取的数量大小 -m,--num-mappers n用来指定map tasks的数量,用来做并行导入 -e,--query 指定要查询的sql语句 --split-by 指定要分片的列 --table 需要导入的表明 --target-dir hdfs的目标文件夹 --where 用来指定导入