Sqoop安装和使用

Sqoop的安装和使用

所用环境的版本:

  • CentOS 7.9
  • Hadoop 2.9.2(已搭建集群)
  • Hive 2.3.6
  • Mysql 5.7.28

一:概述

  1. Sqoop 是 apache 旗下一款“Hadoop 和关系数据库服务器之间传送数据”的工具。

  2. 核心的功能有两个:导入、导出

  3. 本文档用于记录 Sqoop的安装和使用。

建议先配置好Hadoop的JobHistory节点,以便于在Web中的Yarn界面查看MapReduce任务日志信息。

二:Sqoop安装

1.前提概述

  • Sqoop就是一个工具, 只需要在一个节点上进行安装即可。
  • 你安装的Sqoop软件的节点一定要包含你要使用的集群或者软件系统的安装包

2. 软件下载

下载地址:点击此处打开Sqoop下载链接

注意:

  1. 下载sqoop-xx.bin__xx.tar.gz的安装压缩包。

  2. 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.修改配置文件

  1. 进入到 conf 文件夹中,复制sqoop-env-template.sh,并将其修改为sqoop-env.sh

    cp sqoop-env-template.sh sqoop-env.sh
    
  2. 修改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有可能分别安装在不同的地方。

  3. 将Mysql驱动包放到 lib 文件夹下

    cp mysql-connector-java-5.1.48-bin.jar /usr/local/sqoop/sqoop-1.4.7/lib/
    
  4. 配置环境变量

    vi /etc/profile
    
    #在末尾处添加以下行
    export SQOOP_HOME=/usr/local/sqoop/sqoop-1.4.7
    export PATH=${PATH}:${SQOOP_HOME}/bin
    
    #使文件生效
    source /etc/profile
    
  5. 验证是否安装成功

    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的步骤 一致。

你可能感兴趣的:(Sqoop安装和使用)