大数据学习系列:Hadoop3.0苦命学习(七)

传送门:
大数据学习系列:Hadoop3.0苦命学习(一)
大数据学习系列:Hadoop3.0苦命学习(二)
大数据学习系列:Hadoop3.0苦命学习(三)
大数据学习系列:Hadoop3.0苦命学习(四)
大数据学习系列:Hadoop3.0苦命学习(五)
大数据学习系列:Hadoop3.0苦命学习(六)
大数据学习系列:Hadoop3.0苦命学习(七)

本节主要学习Azkaban和sqoop。

目录

1 Azkaban 介绍

在这里插入图片描述

1.1 为什么需要Azkaban

一个完整的数据分析系统通常都是由大量任务单元组成

  • shell 脚本程序
  • java 程序
  • mapreduce 程序
  • hive 脚本等
    各任务单元之间存在时间先后及前后依赖关系, 为了很好地组织起这样的复杂执行计划,需要一个工作流调度系统来调度执行;

例如,我们可能有这样一个需求,某个业务系统每天产生20G原始数据,我们每天都要对其进行处理,处理步骤如下所示:

  1. 通过Hadoop先将原始数据同步到HDFS上;
  2. 借助MapReduce计算框架对原始数据进行转换,生成的数据以分区表的形式存储到
    多张Hive表中;
  3. 需要对Hive中多个表的数据进行JOIN处理,得到一个明细数据Hive大表;
  4. 将明细数据进行各种统计分析,得到结果报表信息;
  5. 需要将统计分析得到的结果数据同步到业务系统中,供业务调用使用。

1.2 常见工作流调度系统

简单的任务调度:直接使用linux的crontab来定义;

复杂的任务调度:在hadoop领域,常见的工作流调度器有Oozie, Azkaban,Cascading, 等

1.3 各种调度工具特性对比

下面的表格对上述四种 hadoop工作流调度器的关键特性进行了比较,尽管这些工作流调度器能够解决的需求场景基本一致,但在设计理念,目标用户,应用场景等方面还是存在显著的区别,在做技术选型的时候,可以提供参考

特性 Hamake Oozie Azkaban Cascading
工作流描述语言 XML XML (xPDL based) text file with key/value pairs Java API
依赖机制 data-driven explicit explicit explicit
是否要web容器 No Yes Yes No
进度跟踪 console/log messages web page web page Java API
Hadoop job调度支持 no yes yes yes
运行模式 command line utility daemon daemon API
Pig支持 yes yes yes yes
事件通知 no no no yes
需要安装 no yes yes no
支持的hadoop版本 0.18+ 0.20+ currently unknown 0.18+
重试支持 no workflownode evel yes yes
运行任意命令 yes yes yes yes
Amazon EMR支持 yes no currently unknown yes

1.5 Azkaban 是什么

Azkaban 是由Linkedin开源的一个批量工作流任务调度器。用于在一个工作流内以一个特定的顺序运行一组工作和流程。

Azkaban定义了一种KV文件(properties)格式来建立任务之间的依赖关系,并提供一个易
于使用的web用户界面维护和跟踪你的工作流。

它有如下功能特点:

  • Web 用户界面
  • 基于时间的执行任务
  • 方便上传工作流
  • 方便设置任务之间的关系
  • 工作流和任务的日志记录和审计

在这里插入图片描述

2 安装

2.1 编译

我们这里选用azkaban3.51.0这个版本自己进行重新编译,编译完成之后得到我们需要的安装包进行安装

注意:我们这里编译需要使用jdk1.8的版本来进行编译,如果编译服务器使用的jdk版本
是1.7的,记得切换成jdk1.8,我们这里使用的是jdk8u141这个版本来进行编译

我这里使用的是node03主机

cd /export/softwares/
wget https://github.com/azkaban/azkaban/archive/3.51.0.tar.gz
tar -zxvf azkaban-3.51.0.tar.gz -C ../services/
cd /export/services/azkaban-3.51.0/
yum ‐y install git
yum ‐y install gcc‐c++
./gradlew build installDist ‐x test

在这里插入图片描述
泪目,为了这个,弄了一天。。。

编译完成后得到如下文件

azkaban-exec-server
编译完成之后得到我们需要的安装包在以下目录下即可获取得到
azkaban-exec-server存放目录
/export/services/azkaban-3.51.0/azkaban-exec-server/build/distributions/
在这里插入图片描述
azkaban-web-server
azkaban-web-server存放目录
/export/services/azkaban-3.51.0/azkaban-web-server/build/distributions
在这里插入图片描述
azkaban-solo-server
azkaban-solo-server存放目录
/export/services/azkaban-3.51.0/azkaban-solo-server/build/distributions
在这里插入图片描述
execute-as-user.c
azkaban two server模式下需要的C程序在这个路径下面
/export/services/azkaban-3.51.0/az-exec-util/src/main/c
在这里插入图片描述
数据库脚本文件

数据库脚本文件在这个路径下面
/export/services/azkaban-3.51.0/azkaban-db/build/install/azkaban-db/
在这里插入图片描述

2.2 Azkaban 单服务模式安装与使用

所需软件 : azkaban-solo-server

Step 1: 解压

azkaban 的solo server使用的是一个单节点的模式来进行启动服务的,只需要一个
azkaban-solo-server-0.1.0-SNAPSHOT.tar.gz的安装包即可启动,所有的数据信息都是
保存在H2这个azkaban默认的数据当中,
上传我们的压缩包,然后修改配置文件启动即可

cd /export/services/azkaban-3.51.0/azkaban-solo-server/build/distributions
cp azkaban-solo-server-0.1.0-SNAPSHOT.tar.gz /export/softwares/
cd /export/softwares/
tar -zxvf azkaban-solo-server-0.1.0-SNAPSHOT.tar.gz -C ../services/

Step 2: 修改时区配置文件

cd /export/services/azkaban-solo-server-0.1.0-SNAPSHOT/conf/
vim azkaban.properties

修改内容:
default.timezone.id=Asia/Shanghai

在这里插入图片描述
修改 commonprivate.properties配置文件

cd /export/services/azkaban-solo-server-0.1.0-SNAPSHOT/plugins/jobtypes/
vim commonprivate.properties

添加:
memCheck.enabled=false

在这里插入图片描述
Step 3: 启动solo-server
启动azkaban-solo-server

cd /export/services/azkaban-solo-server-0.1.0-SNAPSHOT/
bin/start-solo.sh

通过jps查看启动情况
在这里插入图片描述

Step 4: 浏览器页面访问

浏览器页面访问 http://node03:8081/

用户名和密码默认都是:azkaban
在这里插入图片描述

单服务模式使用

需求:使用azkaban调度我们的shell脚本,执行linux的shell命令

在这里插入图片描述
在这里插入图片描述

创建普通文本文件 foo.job,文件内容如下

type=command
command=echo "hello world"

然后将这个文件打包为压缩文件(注意:是zip格式),如下:
在这里插入图片描述
azkaban 上传我们的压缩包
在这里插入图片描述
开始执行工作流

在这里插入图片描述
直接执行工作流
在这里插入图片描述

2.3 Azkaban 两个服务器模式安装与使用

需要的工具
Azkaban Web服务安装包 azkaban-web-server-0.1.0-SNAPSHOT.tar.gz
Azkaban执行服务安装包 azkaban-exec-server-0.1.0-SNAPSHOT.tar.gz

编译之后的sql脚本 create-all-sql-0.1.0-SNAPSHOT.sql
C 程序文件脚本 execute-as-user.c程序

Step 1: 数据库准备

进入mysql的客户端执行以下命令

mysql  ‐uroot ‐p

执行以下命令:

CREATE DATABASE azkaban;
CREATE USER 'azkaban'@'%' IDENTIFIED BY 'azkaban';
GRANT all privileges ON azkaban.* to 'azkaban'@'%' identified by
'azkaban' WITH GRANT OPTION;
flush privileges;
use azkaban;
source /export/softwares/create‐all‐sql‐0.1.0‐SNAPSHOT.sql;

Step 2: 解压软件包

解压软件安装包

  • 解压 azkaban-web-server
cd /export/softwares/
tar -zxvf azkaban-web-server-0.1.0-SNAPSHOT.tar.gz -C ../services/
cd /export/services/
mv azkaban‐web‐server‐0.1.0‐SNAPSHOT/ azkaban‐web‐server‐3.51.0

* 解压azkaban‐exec‐server
```shell
cd /export/softwares/
tar -zxvf azkaban-exec-server-0.1.0-SNAPSHOT.tar.gz -C ../services/
cd /export/services/
mv azkaban‐exec‐server‐0.1.0‐SNAPSHOT/ azkaban‐exec‐server‐3.51.0

Step 3: 安装SSL安全认证

安装ssl安全认证,允许我们使用https的方式访问我们的azkaban的web服务
密码一定要一个个的字母输入,或者粘贴也行

cd /export/services/azkaban-web-server-3.51.0/
keytool -keystore keystore -alias jetty -genkey -keyalg RSA

Step 4: azkaban web server安装

修改azkaban-web-server的配置文件

cd /export/services/azkaban-web-server-3.51.0/conf/
vim azkaban.properties

配置如下:

# Azkaban Personalization Settings
azkaban.name=Azkaban
azkaban.label=My Azkaban
azkaban.color=#FF3601
azkaban.default.servlet.path=/index
web.resource.dir=web/
default.timezone.id=Asia/Shanghai
# Azkaban UserManager class
user.manager.class=azkaban.user.XmlUserManager
user.manager.xml.file=conf/azkaban-users.xml
# Loader for projects
executor.global.properties=conf/global.properties
azkaban.project.dir=projects
# Velocity dev mode
velocity.dev.mode=false
# Azkaban Jetty server properties.
jetty.use.ssl=true
jetty.maxThreads=25
jetty.port=8081
jetty.ssl.port=8443
jetty.keystore=/export/services/azkaban-web-server-3.51.0/keystore
jetty.password=azkaban
jetty.keypassword=azkaban
jetty.truststore=/export/services/azkaban-web-server-3.51.0/keystore
jetty.trustpassword=azkaban
# Azkaban Executor settings
# mail settings
mail.sender=
mail.host=

# enduser ‐> myazkabanhost:443 ‐> proxy ‐> localhost:8081
# azkaban.webserver.external_hostname=myazkabanhost.com
# azkaban.webserver.external_ssl_port=443
# azkaban.webserver.external_port=8081
job.failure.email=
job.success.email=
lockdown.create.projects=false
cache.directory=cache
# JMX stats
jetty.connector.stats=true
executor.connector.stats=true
# Azkaban mysql settings by default. Users should configure their own
username and password.
database.type=mysql
mysql.port=3306
mysql.host=node03
mysql.database=azkaban
mysql.user=azkaban
mysql.password=azkaban
mysql.numconnections=100
#Multiple Executor
azkaban.use.multiple.executors=true
#azkaban.executorselector.filters=StaticRemainingFlowSize,MinimumFreeMemo
ry,CpuStatus
azkaban.executorselector.comparator.NumberOfAssignedFlowComparator=1
azkaban.executorselector.comparator.Memory=1
azkaban.executorselector.comparator.LastDispatched=1
azkaban.executorselector.comparator.CpuUsage=1
azkaban.activeexecutor.refresh.milisecinterval=10000
azkaban.queueprocessing.enabled=true
azkaban.activeexecutor.refresh.flowinterval=10
azkaban.executorinfo.refresh.maxThreads=10

Step 5: azkaban executor server 安装 第一步:修改azkaban-exex-server配置文件

修改azkaban-exec-server的配置文件

cd /export/services/azkaban-exec-server-3.15.0/conf/
vim azkaban.properties

配置如下:

# Azkaban Personalization Settings
azkaban.name=Azkaban
azkaban.label=My Azkaban
azkaban.color=#FF3601
azkaban.default.servlet.path=/index
web.resource.dir=web/
default.timezone.id=Asia/Shanghai
# Azkaban UserManager class
user.manager.class=azkaban.user.XmlUserManager
user.manager.xml.file=conf/azkaban-users.xml
# Loader for projects
executor.global.properties=conf/global.properties
azkaban.project.dir=projects
# Velocity dev mode
velocity.dev.mode=false
# Azkaban Jetty server properties.
jetty.use.ssl=true
jetty.maxThreads=25
jetty.port=8081
jetty.keystore=/export/services/azkaban-web-server-3.51.0/keystore
jetty.password=azkaban
jetty.keypassword=azkaban
jetty.truststore=/export/services/azkaban-web-server-3.51.0/keystore
jetty.trustpassword=azkaban
# Where the Azkaban web server is located
azkaban.webserver.url=https://node03:8443
# mail settings
mail.sender=
mail.host=

# enduser ‐> myazkabanhost:443 ‐> proxy ‐> localhost:8081
# azkaban.webserver.external_hostname=myazkabanhost.com
# azkaban.webserver.external_ssl_port=443
# azkaban.webserver.external_port=8081
job.failure.email=
job.success.email=
lockdown.create.projects=false
cache.directory=cache
# JMX stats
jetty.connector.stats=true
executor.connector.stats=true
# Azkaban plugin settings
azkaban.jobtype.plugin.dir=plugins/jobtypes
# Azkaban mysql settings by default. Users should configure their own
username and password.
database.type=mysql
mysql.port=3306
mysql.host=node03
mysql.database=azkaban
mysql.user=azkaban
mysql.password=azkaban
mysql.numconnections=100
# Azkaban Executor settings
executor.maxThreads=50
executor.flow.threads=30

Step 6: azkaban executor server 安装 第二步:添加插件

将我们编译后的C文件execute-as-user.c
上传到这个目录来/export/services/azkaban-exec-server-3.51.0/plugins/jobtypes
或者直接将文件拷贝过来也行

cd /export/services/azkaban-3.51.0/az-exec-util/src/main/c
cp execute-as-user.c /export/services/azkaban-exec-server-3.15.0/plugins/jobtypes/

然后执行以下命令生成execute-as-user

yum -y install gcc-c++
cd /export/services/azkaban-exec-server-3.15.0/plugins/jobtypes/
gcc execute-as-user.c -o execute-as-user
chown root execute-as-user
chmod 6050 execute-as-user

Step 7: azkaban executor server 安装 第三步:修改配置文件

修改配置文件

cd /export/services/azkaban-exec-server-3.15.0/plugins/jobtypes/
vim commonprivate.properties
execute.as.user=false
memCheck.enabled=false
azkaban.native.lib=/export/services/azkaban-exec-server-3.15.0/plugins/jobtypes

在这里插入图片描述

Step 7: 启动服务

第一步:启动azkaban exec server

cd /export/services/azkaban-exec-server-3.15.0/
bin/start-exec.sh

第二步:激活我们的exec-server
node03机器任意目录下执行以下命令

curl -G "node03:$(<./executor.port)/executor?action=activate" && echo

第三步:启动azkaban-web-server

cd /export/services/azkaban-web-server-3.51.0/
bin/start-web.sh

访问地址:
https://node03:8443

3 实战

Azkaba内置的任务类型支持command、java

3.1 Command 类型单一 Job 示例

Step 1: 创建 Job 描述文件

创建文本文件,更改名称为 mycommand.job
注意后缀.txt一定不要带上,保存为格式为UFT-8 without bom
内容如下

type=command
command=echo 'hello world'

Step 2: 将job资源文件打包成zip文件

在这里插入图片描述

Step 3: 创建project并上传压缩包

通过azkaban的web管理平台创建project并上传job压缩包
首先创建project
在这里插入图片描述
上传 zip包
在这里插入图片描述

Step 4: 启动执行job

在这里插入图片描述

3.2 Command 类型多 Job 示例

Step 1: 创建有依赖关系的多个job描述

第一个job:foo.job

type=command
command=echo 'foo'

第二个job:bar.job依赖foo.job

type=command
command=echo 'bar'
dependencies=foo

Step 2: 将所有job资源文件打到一个zip包中

在这里插入图片描述

Step 3: 在azkaban的web管理界面创建工程并上传zip包

Step 4: 启动工作流flow

在这里插入图片描述

3.3 HDFS 操作任务

Step 1: 创建job描述文件fs.job

type=command
command=/export/services/hadoop-3.1.1/bin/hdfs dfs -mkdir /azkaban

Step 2: 将job资源文件打包成zip文件

在这里插入图片描述

Step 3: 通过azkaban的web管理平台创建project并上传job压缩包

Step 4: 启动执行该job

在这里插入图片描述

3.4 MapReduce 任务

MR 任务依然可以使用command的job类型来执行

Step 1: 创建job描述文件,及mr程序jar包(示例中直接使用hadoop自带的example jar)

type=command
command=/export/services/hadoop-3.1.1/bin/hadoop jar hadoop-mapreduce-examples-3.1.1.jar pi 3 5

Step 2: 将所有job资源文件打到一个zip包中

在这里插入图片描述

Step 3: 在azkaban的web管理界面创建工程并上传zip包

Step 4: 启动job

在这里插入图片描述
好慢,计算个3.7333…,算了3分钟多

3.5 Hive ​脚本任务

Step 1: 创建job描述文件和hive脚本

Hive脚本: hive.sql

create database if not exists azhive;
use azhive;
create table if not exists aztest(id string,name string) row format delimited fields terminated by '\t';

Step 2: Job描述文件:hive.job

type=command
command=/export/services/apache-hive-3.1.1-bin ‐f 'hive.sql'

Step 3: 将所有job资源文件打到一个zip包中

在这里插入图片描述

Step 4: 在azkaban的web管理界面创建工程并上传zip包

Step 5: 启动job

3.6 Azkaban 的定时任务

使用azkaban的scheduler功能可以实现对我们的作业任务进行定时调度功能
在这里插入图片描述
在这里插入图片描述
*/1 * ? * * 每分钟执行一次定时调度任务
0 1 ? * * 每天晚上凌晨一点钟执行这个任务
0 */2 ? * * 每隔两个小时定时执行这个任务
30 21 ? * * 每天晚上九点半定时执行这个任务

4 sqoop 数据迁移

4.1 概述


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

导入数据:MySQL,Oracle导入数据到Hadoop的HDFS、HIVE、HBASE等数据存储系
统;

导出数据:从Hadoop的文件系统中导出数据到关系数据库mysql等
在这里插入图片描述

4.2 sqoop1与sqoop2架构对比


sqoop1架构
在这里插入图片描述
sqoop2 架构
在这里插入图片描述

4.3 工作机制


将导入或导出命令翻译成mapreduce程序来实现
在翻译出的mapreduce中主要是对inputformat和outputformat进行定制

4.4 sqoop实战及原理


4.4.1 sqoop安装

安装sqoop的前提是已经具备java和hadoop的环境

  1. 下载并解压
    下载地址
    http://archive.apache.org/dist/sqoop/1.4.7/
    sqoop1 版本详细下载地址
    http://archive.apache.org/dist/sqoop/1.4.7/sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz
    sqoop2版本详细下载地址
    http://archive.apache.org/dist/sqoop/1.99.6/sqoop-1.99.6-bin-hadoop200.tar.gz

我们这里使用sqoop1的版本,下载之后上传到/export/softwares目录下,然后进行解压

cd /export/softwares/
tar -zxvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz -C ../services/
  1. 修改配置文件
cd /export/services/sqoop-1.4.7.bin__hadoop-2.6.0/conf/
cp sqoop-env-template.sh sqoop-env.sh
vim sqoop-env.sh
export HADOOP_COMMON_HOME=/export/services/hadoop-3.1.1
export HADOOP_MAPRED_HOME=/export/services/hadoop-3.1.1
export HIVE_HOME=/export/services/apache-hive-3.1.1-bin
  1. 加入额外的依赖包
    sqoop的使用需要添加两个额外的依赖包,一个是mysql的驱动包,一个是java-json的的依赖包,不然就会报错
mysql-connector-java-5.1.49.jar
java-json.jar

将这个两个jar包添加到sqoop的lib目录下
在这里插入图片描述
4. 验证启动

cd /export/services/sqoop-1.4.7.bin__hadoop-2.6.0/
bin/sqoop-version

在这里插入图片描述

4.5 Sqoop的数据导入


“导入工具”导入单个表从RDBMS到HDFS。表中的每一行被视为HDFS的记录。所有记录都存储为文本文件的文本数据(或者Avro、sequence文件等二进制数据)

列举出所有的数据库

命令行查看帮助
bin/sqoop list-databases --help

列出windows主机所有的数据库

bin/sqoop list-databases --connect jdbc:mysql://192.168.0.102:3306/ --username root --password 123456

如果出现连接拒绝,则在windows的mysql的数据库中执行以下命令:
开启windows的远程连接权限

 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
FLUSH  PRIVILEGES;

查看某一个数据库下面的所有数据表

bin/sqoop list‐tables ‐‐connect jdbc:mysql://192.168.0.102:3306/userdb ‐‐username root ‐‐password 123456

在这里插入图片描述

其它导入示例

表数据

在 mysql中有一个库userdb中三个表:emp, emp_add和emp_conn

数据脚本:

/*
SQLyog Ultimate v12.08 (64 bit)
MySQL - 5.7.23-log : Database - userdb
*********************************************************************
*/


/*!40101 SET NAMES utf8 */;

/*!40101 SET SQL_MODE=''*/;

/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`userdb` /*!40100 DEFAULT CHARACTER SET utf8 */;

USE `userdb`;

/*Table structure for table `emp` */

DROP TABLE IF EXISTS `emp`;

CREATE TABLE `emp` (
  `id` int(11) NOT NULL,
  `name` varchar(30) DEFAULT NULL,
  `deg` varchar(30) DEFAULT NULL,
  `salary` double DEFAULT NULL,
  `dept` char(2) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

/*Data for the table `emp` */

insert  into `emp`(`id`,`name`,`deg`,`salary`,`dept`) values (1201,'gopal','manager',50000,'TP'),(1202,'manisha','Proof reader',50000,'TP'),(1203,'khalil','php dev',30000,'AC'),(1204,'prasanth','php dev',30000,'AC'),(1205,'kranthi','admin',20000,'TP');

/*Table structure for table `emp_add` */

DROP TABLE IF EXISTS `emp_add`;

CREATE TABLE `emp_add` (
  `id` int(11) NOT NULL,
  `hno` varchar(30) DEFAULT NULL,
  `street` varchar(30) DEFAULT NULL,
  `city` varchar(30) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

/*Data for the table `emp_add` */

insert  into `emp_add`(`id`,`hno`,`street`,`city`) values (1201,'288A','vgiri','jublee'),(1202,'108l','aoc','sec-bad'),(1203,'144Z','pgutta','hyd'),(1204,'78B','old city','sec-bad'),(1205,'720X','hitec','sec-bad');

/*Table structure for table `emp_conn` */

DROP TABLE IF EXISTS `emp_conn`;

CREATE TABLE `emp_conn` (
  `id` int(11) NOT NULL,
  `phno` int(11) DEFAULT NULL,
  `email` varchar(30) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

/*Data for the table `emp_conn` */

insert  into `emp_conn`(`id`,`phno`,`email`) values (1201,2356742,'[email protected]'),(1202,1661663,'[email protected]'),(1203,8887776,'[email protected]'),(1204,9988774,'[email protected]'),(1205,1231231,'[email protected]');

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

表emp:
在这里插入图片描述
表emp_add:
在这里插入图片描述
表emp_conn:
在这里插入图片描述

导入数据库表数据到 HDFS

下面的命令用于从MySQL数据库服务器中的emp表导入HDFS。

bin/sqoop import ‐‐connect jdbc:mysql://192.168.0.102:3306/userdb ‐‐username root ‐‐password 123456 ‐‐table emp ‐‐m 1

可以在hdfs上看到数据
在这里插入图片描述

导入到HDFS指定目录

在导入表数据到HDFS使用Sqoop导入工具,我们可以指定目标目录。
使用参数 --target-dir 来指定导出目的地,
使用参数 --delete-target-dir 来判断导出目录是否存在,如果存在就删掉

bin/sqoop import --connect jdbc:mysql://192.168.0.102:3306/userdb --username root --password 123456 --delete-target-dir --table emp --target-dir /sqoop/emp --m 1

发现目标:
在这里插入图片描述
默认以“,”为分隔符
在这里插入图片描述

导入到hdfs指定目录并指定字段之间的分隔符

bin/sqoop import --connect jdbc:mysql://192.168.0.102:3306/userdb --username root --password 123456 --delete-target-dir --table emp --target-dir /sqoop/emp2 --m 1 --fields-terminated-by '\t'

结果:
在这里插入图片描述

导入关系表到HIVE

第一步:拷贝jar包

将我们 mysql表当中的数据直接导入到hive表中的话,我们需要将hive的一个叫做hive- exec-3.1.1.jar 的jar包拷贝到sqoop的lib目录下

cd /export/services/apache-hive-3.1.1-bin/lib/
cp hive-exec-3.1.1.jar /export/services/sqoop-1.4.7.bin__hadoop-2.6.0/lib/

第二步:准备hive数据库与表
将我们mysql当中的数据导入到hive表当中来

hive (default)> create database sqooptohive;
hive (default)> use sqooptohive;
hive (sqooptohive)> create external table emp_hive(id int,name string,deg
string,salary int ,dept string) row format delimited fields terminated by
'\001';

第三步:开始导入

bin/sqoop import ‐‐connect jdbc:mysql://192.168.0.102:3306/userdb ‐‐username root ‐‐password 123456 ‐‐table emp ‐‐fields‐terminated‐by '\001' ‐‐hive‐import ‐‐hive‐table sqooptohive.emp_hive ‐‐hive‐overwrite ‐‐delete‐target‐dir ‐‐m 1

第四步:hive表数据查看

select * from emp_hive;

在这里插入图片描述

导入关系表到hive并自动创建hive表

我们也可以通过命令来将我们的mysql的表直接导入到hive表当中去

bin/sqoop import ‐‐connect jdbc:mysql://192.168.0.102:3306/userdb ‐‐username root ‐‐password 123456 ‐‐table emp_conn ‐‐hive‐import ‐m 1 ‐‐hive‐database sqooptohive

通过这个命令,我们可以直接将我们mysql表当中的数据以及表结构一起倒入到hive当中

在这里插入图片描述

导入表数据子集

我们可以导入表的使用Sqoop导入工具,"where"子句的一个子集。它执行在各自的数据
库服务器相应的SQL查询,并将结果存储在HDFS的目标目录。

where子句的语法如下。

按照条件进行查找,通过–where`参数来查找表emp_add当中city字段的值为sec-bad的
所有数据导入到hdfs上面去

bin/sqoop import --connect jdbc:mysql://192.168.0.102:3306/userdb --username root --password 123456 --table emp_add --target-dir /sqoop/emp_add -m 1  --delete-target-dir --where "city = 'sec-bad'"

结果如下:
在这里插入图片描述

sql语句查找导入hdfs

我们还可以通过 –query参数来指定我们的sql语句,通过sql语句来过滤我们的数据进行
导入

bin/sqoop import ‐‐connect jdbc:mysql://192.168.0.102:3306/userdb ‐‐username root ‐‐password 123456 ‐‐delete‐target‐dir ‐m 1 ‐‐query 'select email from emp_conn where 1=1 and $CONDITIONS' ‐‐target‐dir /sqoop/emp_conn

在这里插入图片描述

增量导入

在实际工作当中,数据的导入,很多时候都是只需要导入增量数据即可,并不需要将表
中的数据全部导入到hive或者hdfs当中去,肯定会出现重复的数据的状况,所以我们一
般都是选用一些字段进行增量的导入,为了支持增量的导入,sqoop也给我们考虑到了这种情况并且支持增量的导入数据

增量导入是仅导入新添加的表中的行的技术。

它需要添加‘incremental’, ‘check-column’, 和 ‘last-value’选项来执行增量导入。

下面的语法用于Sqoop导入命令增量选项。

第一种增量导入使用上面的选项来实现
导入emp表当中id大于1202的所有数据
注意:增量导入的时候,一定不能加参数–delete-target-dir否则会报错

bin/sqoop import ‐‐connect jdbc:mysql://192.168.0.102:3306/userdb ‐‐username root ‐‐password 123456 ‐‐table emp ‐‐incremental append ‐‐check‐column id ‐‐last‐value 1202 ‐m 1 ‐‐target‐dir /sqoop/increment

查看数据内容
hdfs dfs -text /sqoop/increment/part*
在这里插入图片描述

4.6 Sqoop的数据导出

1、将数据从HDFS把文件导出到RDBMS数据库
导出前,目标表必须存在于目标数据库中。

u 默认操作是从将文件中的数据使用INSERT语句插入到表中
u 更新模式下,是生成UPDATE语句更新表数据

hdfs导出到mysql

数据是在HDFS当中的如下目录/sqoop/emp,数据内容如下

1201,gopal,manager,50000.0,TP
1202,manisha,Proof reader,50000.0,TP
1203,khalil,php dev,30000.0,AC
1204,prasanth,php dev,30000.0,AC
1205,kranthi,admin,20000.0,TP

第一步:创建mysql表

CREATE TABLE emp_out (
  `id` int(11) NOT NULL,
  `name` varchar(30) DEFAULT NULL,
  `deg` varchar(30) DEFAULT NULL,
  `salary` double DEFAULT NULL,
  `dept` char(2) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

第二步:执行导出命令

通过export来实现数据的导出,将hdfs的数据导出到mysql当中去

bin/sqoop export ‐‐connect jdbc:mysql://192.168.0.102:3306/userdb ‐‐username root ‐‐password 123456 ‐‐table emp_out ‐‐export‐dir /sqoop/emp ‐‐input‐fields‐terminated‐by ","

第三步:验证mysql表数据
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章