傳送門:
大數據學習系列:Hadoop3.0苦命學習(一)
大數據學習系列:Hadoop3.0苦命學習(二)
大數據學習系列:Hadoop3.0苦命學習(三)
大數據學習系列:Hadoop3.0苦命學習(四)
大數據學習系列:Hadoop3.0苦命學習(五)
大數據學習系列:Hadoop3.0苦命學習(六)
大數據學習系列:Hadoop3.0苦命學習(七)
本節主要學習Azkaban和sqoop。
目錄
- 1 Azkaban 介紹
- 2 安裝
- 3 實戰
- 3.1 Command 類型單一 Job 示例
- 3.2 Command 類型多 Job 示例
- Step 1: 創建有依賴關係的多個job描述
- Step 2: 將所有job資源文件打到一個zip包中
- Step 3: 在azkaban的web管理界面創建工程並上傳zip包
- Step 4: 啓動工作流flow
- 3.3 HDFS 操作任務
- Step 1: 創建job描述文件fs.job
- Step 2: 將job資源文件打包成zip文件
- Step 3: 通過azkaban的web管理平臺創建project並上傳job壓縮包
- Step 4: 啓動執行該job
- 3.4 MapReduce 任務
- Step 1: 創建job描述文件,及mr程序jar包(示例中直接使用hadoop自帶的example jar)
- Step 2: 將所有job資源文件打到一個zip包中
- Step 3: 在azkaban的web管理界面創建工程並上傳zip包
- Step 4: 啓動job
- 3.5 Hive 腳本任務
- Step 1: 創建job描述文件和hive腳本
- Step 2: Job描述文件:hive.job
- Step 3: 將所有job資源文件打到一個zip包中
- Step 4: 在azkaban的web管理界面創建工程並上傳zip包
- Step 5: 啓動job
- 3.6 Azkaban 的定時任務
- 4 sqoop 數據遷移
1 Azkaban 介紹
1.1 爲什麼需要Azkaban
一個完整的數據分析系統通常都是由大量任務單元組成
- shell 腳本程序
- java 程序
- mapreduce 程序
- hive 腳本等
各任務單元之間存在時間先後及前後依賴關係, 爲了很好地組織起這樣的複雜執行計劃,需要一個工作流調度系統來調度執行;
例如,我們可能有這樣一個需求,某個業務系統每天產生20G原始數據,我們每天都要對其進行處理,處理步驟如下所示:
- 通過Hadoop先將原始數據同步到HDFS上;
- 藉助MapReduce計算框架對原始數據進行轉換,生成的數據以分區表的形式存儲到
多張Hive表中; - 需要對Hive中多個表的數據進行JOIN處理,得到一個明細數據Hive大表;
- 將明細數據進行各種統計分析,得到結果報表信息;
- 需要將統計分析得到的結果數據同步到業務系統中,供業務調用使用。
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的環境
- 下載並解壓
下載地址
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/
- 修改配置文件
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
- 加入額外的依賴包
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表數據