大數據學習系列: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表數據
在這裏插入圖片描述

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