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的情况下:

  • 引号问题,要么外层使用单引号,内层使用双引号,CONDITIONS的符号不用转义, 要么外层使用双引号,那么内层使用单引号,然后CONDITIONS的符号需要转义。
  • 自定义的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的步骤 一致。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,607评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,239评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,960评论 0 355
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,750评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,764评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,604评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,347评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,253评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,702评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,893评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,015评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,734评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,352评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,934评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,052评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,216评论 3 371
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,969评论 2 355

推荐阅读更多精彩内容