Sqoop的安装和使用
所用环境的版本:
- CentOS 7.9
- Hadoop 2.9.2(已搭建集群)
- Hive 2.3.6
- Mysql 5.7.28
一:概述
Sqoop 是 apache 旗下一款“Hadoop 和关系数据库服务器之间传送数据”的工具。
核心的功能有两个:导入、导出
本文档用于记录 Sqoop的安装和使用。
建议
先配置好Hadoop的JobHistory节点
,以便于在Web中的Yarn界面查看MapReduce任务日志信息。
二:Sqoop安装
1.前提概述
- Sqoop就是一个工具, 只需要在一个节点上进行安装即可。
- 你安装的Sqoop软件的节点一定要包含你要使用的集群或者软件系统的安装包
2. 软件下载
下载地址:点击此处打开Sqoop下载链接
注意:
下载
sqoop-xx.bin__xx.tar.gz
的安装压缩包。Sqoop 1 和Sqoop 2不兼容,且绝大部分企业所使用的Sqoop的版本是 Sqoop 1。
1.4.7版本的为Sqoop 1
1.99.7版本的为Sqoop 2
三:安装
1.创建sqoop安装目录
mkdir /usr/local/sqoop
2.解压安装包到指定目录
上传解压缩安装包到指定目录(此处跳过了Ftp传输步骤)。
因为之前hive只是安装在hadoop1机器上,所以Sqoop也同样安装在hadoop1机器上。
tar -zxvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz /usr/local/sqoop
3.修改配置文件
-
进入到 conf 文件夹中,复制sqoop-env-template.sh,并将其修改为sqoop-env.sh
cp sqoop-env-template.sh sqoop-env.sh
-
修改sqoop-env.sh
vi sqoop-env.sh
export HADOOP_MAPRED_HOME=/usr/local/hadoop/hadoop-2.9.2 #Hadoop的MapReduce安装路径 export HADOOP_COMMON_HOME=/usr/local/hadoop/hadoop-2.9.2 #Hadoop的Common安装路径 export HIVE_HOME=/usr/local/hive/hive #Hive安装路径
为什么在sqoop-env.sh 文件中会要求分别进行 common和mapreduce的配置呢???
在apache的hadoop的安装中;四大组件都是安装在同一个hadoop_home中的
但是在CDH, HDP中, 这些组件都是可选的。
在安装hadoop的时候,可以选择性的只安装HDFS或者YARN,
CDH,HDP在安装hadoop的时候,会把HDFS和MapReduce有可能分别安装在不同的地方。
-
将Mysql驱动包放到 lib 文件夹下
cp mysql-connector-java-5.1.48-bin.jar /usr/local/sqoop/sqoop-1.4.7/lib/
-
配置环境变量
vi /etc/profile
#在末尾处添加以下行 export SQOOP_HOME=/usr/local/sqoop/sqoop-1.4.7 export PATH=${PATH}:${SQOOP_HOME}/bin
#使文件生效 source /etc/profile
-
验证是否安装成功
sqoop version
四:Sqoop的基本命令
#查看命令
sqoop help
#运行结果:
usage: sqoop COMMAND [ARGS]
Available commands:
#生成与数据库记录交互的代码
codegen Generate code to interact with database records
#将表定义导入到Hive中
create-hive-table Import a table definition into Hive
#计算一个SQL语句并显示结果,可以用来校验下import的查询条件是否正确。
eval Evaluate a SQL statement and display the results
#将HDFS目录导出到数据库表
export Export an HDFS directory to a database table
#可用命令列表
help List available commands
#将表从数据库导入到HDFS
import Import a table from a database to HDFS
#将所有表从数据库导入到HDFS
import-all-tables Import tables from a database to HDFS
#从大型机服务器导入数据集到HDFS
import-mainframe Import datasets from a mainframe server to HDFS
#将Import任务保存为job,可以理解为起了个别名,这样方便的Sqoop任务的管理。
job Work with saved jobs
#列出服务器上可用的数据库
list-databases List available databases on a server
#列出数据库上可用的b表
list-tables List available tables in a database
#增量导入的合并结果
merge Merge results of incremental imports
#运行一个独立的Sqoop metastore
metastore Run a standalone Sqoop metastore
#显示sqoop的版本
version Display version information
See 'sqoop help COMMAND' for information on a specific command.
五:Sqoop的基本使用
执行Sqoop命令时,请登录对hadoop有操作权限的系统用户,否则会报没有权限等错误。
以下命令中出现的
\
为连接符,连接下一句命令,在实际操作中也可使用。
列出Mysql中有哪些数据库
sqoop list-databases \
-connect jdbc:mysql://localhost:3306/ \
-username root \
-password root
列出Mysql中指定数据库的表
sqoop list-tables \
-connect jdbc:mysql://localhost:3306/sqoop_test \
-username root \
-password root
创建一张跟sqoop_test库中user表结构一样的hive表hive_user
此处需要将 hive 中的
hive-common-2.3.6.jar
包复制到 sqoop 的 lib 文件夹下,否则会报java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf
sqoop create-hive-table \
-connect jdbc:mysql://localhost:3306/sqoop_test \
-username root \
-password root \
-table user \
-hive-table hive_user #要创建的hive表名
创建完后可登录hive查看,以下为所执行的命令:
hive #登录Hive
show databases; #查看数据库
use default; #选择数据库,由于上面没有指定数据库,所以在默认数据库中创建了表
show tables; #列出Default数据库中的所有表
Mysql→HDFS:从Mysql导入到HDFS
sqoop import \
-connect jdbc:mysql://{数据库IP}:3306/{数据库}?autoReconnect=true \ #数据库连接
-driver com.mysql.jdbc.Driver \ #数据库驱动
-username root \ #数据库用户名
-password root \ #数据库密码
-table user \ #数据库表
-target-dir /user/admin/temp/sqoop-import \ #导入到HDFS的目标目录
-fields-terminated-by ',' \ #按什么分隔
-m 1 #MapReduce执行任务数
拓展命令(在导出中同样适用):
-where "name = 'ZhangSan'" #带Where条件导入
-columns "name" #导入指定列
#自定义Sql查询,导入查询后数据
-query 'select * from mysql.help_keyword where $CONDITIONS and name = "STRING"'
-split-by ‘id’ #主键
-incremental append #增量导入
在需要按照自定义SQL语句导出数据到HDFS的情况下:
- 引号问题,要么外层使用单引号,内层使用双引号,符号不用转义, 要么外层使用双引号,那么内层使用单引号,然后符号需要转义。
- 自定义的SQL语句中必须带有WHERE $CONDITIONS
HDFS→Mysql:从HDFS中导出到Mysql
sqoop export \
-connect jdbc:mysql://{数据库IP}:3306/{数据库}?autoReconnect=true \ #数据库连接
-driver com.mysql.jdbc.Driver \ #数据库驱动
-username root \ #数据库用户名
-password root \ #数据库密码
-table sqoop_test \ #数据库表
-export-dir /user/admin/temp/sqoop-import \ #导出HDFS的目标目录到Mysql
-fields-terminated-by ',' \ #按什么分隔
-split-by id \ #主键
-m 1 #MapReduce执行任务数
记录问题:
- 数据库连接处**必须带上 **
autoReconnect=true
属性;- 若数据库连接带上了
serverTimezone=UTC
属性,则会导致后面语法报未找到命令错误;
- 如果Mysql为8.0的版本,同样不需要带上这个属性;
- 导入导出时需带上
-driver
命令,否则有可能会导致出现数据库连接失败错误;
- 如果Mysql为8.0的版本,需要更改为8.0驱动包:
com.mysql.cj.jdbc.Driver
- 执行命令时必须带上
-split-by
或者-m 1
命令,否则会报错;-fields-terminated-by
命令表示 数据库中的列在导入文本中按照什么字符分隔,如上面例子中的 ,;
Mysql→Hive:从Mysql导入到Hive中
导入过程:先导入到 hdfs,然后再 load 进入 hive
普通导入:数据存储在Hive默认的default库中,表名就是对应的mysql的表名:
sqoop import \
--connect jdbc:mysql://localhost:3306/sqoop_test \ #数据库连接
--username root \ #数据库用户名
--password root \ #数据库密码
--table user \ #数据库表
--hive-import \ #导入路径
-m 1 #任务并发数
查看 Hive 中的数据
hadoop fs -cat /user/hive/warehouse/user/part-m-00000 #user就是表名
拓展命令:
-fields-terminated-by "," #数据按什么分隔
-lines-terminated-by "\n" #行数按什么分隔
-hive-overwrite #指定覆盖导入
-create-hive-table #指定自动创建hive表
-delete-target-dir #指定删除中间结果数据目录
-hive-database mydb_test #指定Hive数据库
-hive-table new_user #指定表名
-incremental append #增量导入
当指定Hive数据库时,必须先创建该数据库,否则会报
Database does not exist: xx
数据库不存在。从Hive导出到Mysql的步骤 和 从HDFS导出到Mysql的步骤 一致。