尚硅谷大数据技术之Hive第10章 Sqoop

10.1 Sqoop概述

Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql、postgresql…)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。

Sqoop项目开始于2009年,最早是作为Hadoop的一个第三方模块存在,后来为了让使用者能够快速部署,也为了让开发人员能够更快速的迭代开发,Sqoop独立成为一个Apache项目。

最新的稳定版本是1.4.7。Sqoop2的最新版本是1.99.7。请注意,1.99.7与1.4.7不兼容,且没有特征不完整,它并不打算用于生产部署。

10.2 Sqoop下载与安装

10.2.1 Sqoop安装地址

1)Sqoop官网地址:

http://sqoop.apache.org/

2)文档查看地址:

http://sqoop.apache.org/docs/1.4.7/index.html

3)下载地址:

https://mirrors.tuna.tsinghua.edu.cn/apache/sqoop/1.4.7/

10.2.2 Sqoop安装部署

  1. 把sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz上传到linux的/opt/software目录下

  2. 解压sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz到/opt/module/目录下

[atguigu@hadoop102 software]$ tar -zxvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz -C /opt/module/

  1. 修改sqoop-1.4.7.bin__hadoop-2.6.0的名称为sqoop

[atguigu@hadoop102 software]$ mv sqoop-1.4.7.bin__hadoop-2.6.0/ sqoop

  1. 修改/opt/module/sqoop/conf目录下的sqoop-env-template.sh名称为sqoop-env.sh

[atguigu@hadoop102 software]$ mv sqoop-env-template.sh sqoop-env.sh

[atguigu@hadoop102 software]$ mv sqoop-site-template.xml sqoop-site.xml

5)配置sqoop-env.sh文件

export HADOOP_COMMON_HOME=/opt/module/hadoop-2.7.2

export HADOOP_MAPRED_HOME=/opt/module/hadoop-2.7.2

export HIVE_HOME=/opt/module/hive

export ZOOKEEPER_HOME=/opt/module/zookeeper-3.4.10

export ZOOCFGDIR=/opt/module/zookeeper-3.4.10

10.2.3 添加JDBC驱动

拷贝/opt/software/mysql-libs/mysql-connector-java-5.1.27目录下的

mysql-connector-java-5.1.27-bin.jar到/opt/module/sqoop/lib/

[atguigu@hadoop102 mysql-connector-java-5.1.27]$ cp mysql-connector-java-5.1.27-bin.jar /opt/module/sqoop/lib/

10.2.4验证Sqoop

我们可以通过某一个command来验证sqoop配置是否正确:

|

$ bin/sqoop help

出现一些Warning警告(警告信息已省略),并伴随着帮助命令的输出:

Available commands:

codegen Generate code to interact with database records

create-hive-table Import a table definition into Hive

eval Evaluate a SQL statement and display the results

export Export an HDFS directory to a database table

help List available commands

import Import a table from a database to HDFS

import-all-tables Import tables from a database to HDFS

import-mainframe Import datasets from a mainframe server to HDFS

job Work with saved jobs

list-databases List available databases on a server

list-tables List available tables in a database

merge Merge results of incremental imports

metastore Run a standalone Sqoop metastore

version Display version information

|

10.2.5测试Sqoop是否能够成功连接数据库

|

$ bin/sqoop list-databases –connect jdbc:mysql://hadoop102:3306/ –username root –password 000000

出现如下输出:

information_schema

metastore

mysql

performance_schema

|

10.3 导入数据

在Sqoop中,“导入”概念指:从非大数据集群(RDBMS)向大数据集群(HDFS,HIVE,HBASE)中传输数据,叫做:导入,即使用import关键字。

10.3.1 RDBMS到HDFS

  1. 确定Mysql服务开启正常

  2. 在Mysql中新建一张表并插入一些数据

|

$ mysql -uroot -p123456

mysql> create database company;

mysql> create table company.staff(id int(4) primary key not null auto_increment, name varchar(255), sex varchar(255));

mysql> insert into company.staff(name, sex) values(‘Thomas’, ‘Male’);

mysql> insert into company.staff(name, sex) values(‘Catalina’, ‘FeMale’);

|

  1. 导入数据

(1)全部导入

|

$ bin/sqoop import \

–connect jdbc:mysql://linux01:3306/company \

–username root \

–password 123456 \

–table staff \

–target-dir /user/company \

–delete-target-dir \

–num-mappers 1 \

–fields-terminated-by “\t”

|

(2)查询导入

|

$ bin/sqoop import \

–connect jdbc:mysql://linux01:3306/company \

–username root \

–password 123456 \

–target-dir /user/company \

–delete-target-dir \

–num-mappers 1 \

–fields-terminated-by “\t” \

–query ‘select name,sex from staff where id <=1 and $CONDITIONS;’

|

尖叫提示:must contain ‘$CONDITIONS’ in WHERE clause.

尖叫提示:如果query后使用的是双引号,则$CONDITIONS前必须加转移符,防止shell识别为自己的变量。

(3)导入指定列

|

$ bin/sqoop import \

–connect jdbc:mysql://linux01:3306/company \

–username root \

–password 123456 \

–target-dir /user/company \

–delete-target-dir \

–num-mappers 1 \

–fields-terminated-by “\t” \

–columns id,sex \

–table staff

|

尖叫提示:columns中如果涉及到多列,用逗号分隔,分隔时不要添加空格

(4)使用sqoop关键字筛选查询导入数据

|

$ bin/sqoop import \

–connect jdbc:mysql://linux01:3306/company \

–username root \

–password 123456 \

–target-dir /user/company \

–delete-target-dir \

–num-mappers 1 \

–fields-terminated-by “\t” \

–table staff \

–where “id=1”

|

尖叫提示:在Sqoop中可以使用sqoop import -D property.name=property.value这样的方式加入执行任务的参数,多个参数用空格隔开。

10.3.2 RDBMS到Hive

|

$ bin/sqoop import \

–connect jdbc:mysql://linux01:3306/company \

–username root \

–password 123456 \

–table staff \

–num-mappers 1 \

–hive-import \

–fields-terminated-by “\t” \

–hive-overwrite \

–hive-table staff_hive

|

提示:该过程分为两步,第一步将数据导入到HDFS,第二步将导入到HDFS的数据迁移到Hive仓库,第一步默认的临时目录是/user/admin/表名

10.4 导出数据

在Sqoop中,“导出”概念指:从大数据集群(HDFS,HIVE,HBASE)向非大数据集群(RDBMS)中传输数据,叫做:导出,即使用export关键字。

4.2.1、HIVE/HDFS到RDBMS

|

$ bin/sqoop export \

–connect jdbc:mysql://linux01:3306/company \

–username root \

–password 000000 \

–table staff \

–num-mappers 1 \

–export-dir /user/hive/warehouse/staff_hive \

–input-fields-terminated-by “\t”

|

注意:Mysql中如果表不存在,不会自动创建

思考:数据是覆盖还是追加

10.5 脚本打包

使用opt格式的文件打包sqoop命令,然后执行

  1. 创建一个.opt文件

|

$ mkdir opt

$ touch opt/job_HDFS2RDBMS.opt

|

  1. 编写sqoop脚本

|

$ vi opt/job_HDFS2RDBMS.opt

export

–connect

jdbc:mysql://hadoop102:3306/company

–username

root

–password

000000

–table

staff

–num-mappers

1

–export-dir

/user/hive/warehouse/staff_hive

–input-fields-terminated-by

“\t”

|

3)执行该脚本
|

$ bin/sqoop –options-file opt/job_HDFS2RDBMS.opt

|

本教程由尚硅谷教育大数据研究院出品,如需转载请注明来源,欢迎大家关注尚硅谷公众号(atguigu)了解更多。

    原文作者:尚硅谷教育
    原文地址: https://www.jianshu.com/p/80887b878bb0
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞