離線計算七 輔助系統(flume、sqoop、oozie)

課程大綱(輔助系統)

離線輔助系統 數據接入 Flume介紹
Flume組件
Flume實戰案例
任務調度 調度器基礎
市面上調度工具
Oozie的使用
Oozie的流程定義詳解
數據導出 sqoop基礎知識
sqoop實戰及原理
Sqoop數據導入實戰
Sqoop數據導出實戰
Sqoop作業操作
Sqoop的原理

學習目標:
1、理解flume、sqoop、oozie的應用場景
2、理解flume、sqoop、oozie的基本原理
3、掌握flume、sqoop、oozie的使用方法

前言
在一個完整的大數據處理系統中,除了hdfs+mapreduce+hive組成分析系統的核心之外,還需要數據採集、結果數據導出、任務調度等不可或缺的輔助系統,而這些輔助工具在hadoop生態體系中都有便捷的開源框架,如圖所示:

  1. 日誌採集框架Flume
    1.1 Flume介紹
    1.1.1 概述
    Flume是一個分佈式、可靠、和高可用的海量日誌採集、聚合和傳輸的系統。
    Flume可以採集文件,socket數據包等各種形式源數據,又可以將採集到的數據輸出到HDFS、hbase、hive、kafka等衆多外部存儲系統中
    一般的採集需求,通過對flume的簡單配置即可實現
    Flume針對特殊場景也具備良好的自定義擴展能力,因此,flume可以適用於大部分的日常數據採集場景

1.1.2 運行機制
Flume分佈式系統中最核心的角色是agent,flume採集系統就是由一個個agent所連接起來形成
每一個agent相當於一個數據傳遞員,內部有三個組件:
Source:採集源,用於跟數據源對接,以獲取數據
Sink:下沉地,採集數據的傳送目的,用於往下一級agent傳遞數據或者往最終存儲系統傳遞數據
Channel:angent內部的數據傳輸通道,用於從source將數據傳遞到sink

1.1.4 Flume採集系統結構圖

  1. 簡單結構
    單個agent採集數據

  2. 複雜結構
    多級agent之間串聯

1.2 Flume實戰案例
1.2.1 Flume的安裝部署
Flume的安裝非常簡單,只需要解壓即可,當然,前提是已有hadoop環境
上傳安裝包到數據源所在節點上
然後解壓 tar -zxvf apache-flume-1.6.0-bin.tar.gz
然後進入flume的目錄,修改conf下的flume-env.sh,在裏面配置JAVA_HOME

2、根據數據採集的需求配置採集方案,描述在配置文件中(文件名可任意自定義)
3、指定採集方案配置文件,在相應的節點上啓動flume agent

先用一個最簡單的例子來測試一下程序環境是否正常
先在flume的conf目錄下新建一個文件
vi netcat-logger.conf

定義這個agent中各組件的名字a1.sources = r1a1.sinks = k1a1.channels = c1# 描述和配置source組件:r1a1.sources.r1.type = netcata1.sources.r1.bind = localhosta1.sources.r1.port = 44444# 描述和配置sink組件:k1a1.sinks.k1.type = logger# 描述和配置channel組件,此處使用是內存緩存的方式a1.channels.c1.type = memorya1.channels.c1.capacity = 1000a1.channels.c1.transactionCapacity = 100# 描述和配置source channel sink之間的連接關係a1.sources.r1.channels = c1a1.sinks.k1.channel = c1

啓動agent去採集數據
bin/flume-ng agent -c conf -f conf/netcat-logger.conf -n a1 -Dflume.root.logger=INFO,console
-c conf 指定flume自身的配置文件所在目錄
-f conf/netcat-logger.con 指定我們所描述的採集方案
-n a1 指定我們這個agent的名字
測試
先要往agent採集監聽的端口上發送數據,讓agent有數據可採
隨便在一個能跟agent節點聯網的機器上
telnet anget-hostname port (telnet localhost 44444)

1.2.2 採集案例
1、採集目錄到HDFS
採集需求:某服務器的某特定目錄下,會不斷產生新的文件,每當有新文件出現,就需要把文件採集到HDFS中去
根據需求,首先定義以下3大要素
採集源,即source——監控文件目錄 : spooldir
下沉目標,即sink——HDFS文件系統 : hdfs sink
source和sink之間的傳遞通道——channel,可用file channel 也可以用內存channel

配置文件編寫:
#定義三大組件的名稱agent1.sources = source1agent1.sinks = sink1agent1.channels = channel1# 配置source組件agent1.sources.source1.type = spooldiragent1.sources.source1.spoolDir = /home/hadoop/logs/agent1.sources.source1.fileHeader = false#配置攔截器agent1.sources.source1.interceptors = i1agent1.sources.source1.interceptors.i1.type = hostagent1.sources.source1.interceptors.i1.hostHeader = hostname# 配置sink組件agent1.sinks.sink1.type = hdfsagent1.sinks.sink1.hdfs.path =hdfs://hdp-node-01:9000/weblog/flume-collection/%y-%m-%d/%H-%Magent1.sinks.sink1.hdfs.filePrefix = access_logagent1.sinks.sink1.hdfs.maxOpenFiles = 5000agent1.sinks.sink1.hdfs.batchSize= 100agent1.sinks.sink1.hdfs.fileType = DataStreamagent1.sinks.sink1.hdfs.writeFormat =Textagent1.sinks.sink1.hdfs.rollSize = 102400agent1.sinks.sink1.hdfs.rollCount = 1000000agent1.sinks.sink1.hdfs.rollInterval = 60#agent1.sinks.sink1.hdfs.round = true#agent1.sinks.sink1.hdfs.roundValue = 10#agent1.sinks.sink1.hdfs.roundUnit = minuteagent1.sinks.sink1.hdfs.useLocalTimeStamp = true# Use a channel which buffers events in memoryagent1.channels.channel1.type = memoryagent1.channels.channel1.keep-alive = 120agent1.channels.channel1.capacity = 500000agent1.channels.channel1.transactionCapacity = 600# Bind the source and sink to the channelagent1.sources.source1.channels = channel1agent1.sinks.sink1.channel = channel1

Channel參數解釋:
capacity:默認該通道中最大的可以存儲的event數量
trasactionCapacity:每次最大可以從source中拿到或者送到sink中的event數量
keep-alive:event添加到通道中或者移出的允許時間

2、採集文件到HDFS
採集需求:比如業務系統使用log4j生成的日誌,日誌內容不斷增加,需要把追加到日誌文件中的數據實時採集到hdfs

根據需求,首先定義以下3大要素
採集源,即source——監控文件內容更新 : exec ‘tail -F file’
下沉目標,即sink——HDFS文件系統 : hdfs sink
Source和sink之間的傳遞通道——channel,可用file channel 也可以用 內存channel

配置文件編寫:
agent1.sources = source1agent1.sinks = sink1agent1.channels = channel1# Describe/configure tail -F source1agent1.sources.source1.type = execagent1.sources.source1.command = tail -F /home/hadoop/logs/access_logagent1.sources.source1.channels = channel1#configure host for sourceagent1.sources.source1.interceptors = i1agent1.sources.source1.interceptors.i1.type = hostagent1.sources.source1.interceptors.i1.hostHeader = hostname# Describe sink1agent1.sinks.sink1.type = hdfs#a1.sinks.k1.channel = c1agent1.sinks.sink1.hdfs.path =hdfs://hdp-node-01:9000/weblog/flume-collection/%y-%m-%d/%H-%Magent1.sinks.sink1.hdfs.filePrefix = access_logagent1.sinks.sink1.hdfs.maxOpenFiles = 5000agent1.sinks.sink1.hdfs.batchSize= 100agent1.sinks.sink1.hdfs.fileType = DataStreamagent1.sinks.sink1.hdfs.writeFormat =Textagent1.sinks.sink1.hdfs.rollSize = 102400agent1.sinks.sink1.hdfs.rollCount = 1000000agent1.sinks.sink1.hdfs.rollInterval = 60agent1.sinks.sink1.hdfs.round = trueagent1.sinks.sink1.hdfs.roundValue = 10agent1.sinks.sink1.hdfs.roundUnit = minuteagent1.sinks.sink1.hdfs.useLocalTimeStamp = true# Use a channel which buffers events in memoryagent1.channels.channel1.type = memoryagent1.channels.channel1.keep-alive = 120agent1.channels.channel1.capacity = 500000agent1.channels.channel1.transactionCapacity = 600# Bind the source and sink to the channelagent1.sources.source1.channels = channel1agent1.sinks.sink1.channel = channel1

1.3 更多source和sink組件
Flume支持衆多的source和sink類型,詳細手冊可參考官方文檔
http://flume.apache.org/FlumeUserGuide.html
2. 工作流調度器azkaban
2.1 概述
2.1.1爲什麼需要工作流調度系統
一個完整的數據分析系統通常都是由大量任務單元組成:
shell腳本程序,java程序,mapreduce程序、hive腳本等
各任務單元之間存在時間先後及前後依賴關係
爲了很好地組織起這樣的複雜執行計劃,需要一個工作流調度系統來調度執行;

例如,我們可能有這樣一個需求,某個業務系統每天產生20G原始數據,我們每天都要對其進行處理,處理步驟如下所示:
通過Hadoop先將原始數據同步到HDFS上;
藉助MapReduce計算框架對原始數據進行轉換,生成的數據以分區表的形式存儲到多張Hive表中;
需要對Hive中多個表的數據進行JOIN處理,得到一個明細數據Hive大表;
將明細數據進行復雜的統計分析,得到結果報表信息;
需要將統計分析得到的結果數據同步到業務系統中,供業務調用使用。

2.1.2 工作流調度實現方式
簡單的任務調度:直接使用linux的crontab來定義;
複雜的任務調度:開發調度平臺
或使用現成的開源調度系統,比如ooize、azkaban等

2.1.3 常見工作流調度系統
市面上目前有許多工作流調度器
在hadoop領域,常見的工作流調度器有Oozie, Azkaban,Cascading,Hamake等

2.1.4 各種調度工具特性對比
下面的表格對上述四種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
2.1.5 Azkaban與Oozie對比
對市面上最流行的兩種調度器,給出以下詳細對比,以供技術選型參考。總體來說,ooize相比azkaban是一個重量級的任務調度系統,功能全面,但配置使用也更復雜。如果可以不在意某些功能的缺失,輕量級調度器azkaban是很不錯的候選對象。
詳情如下:
功能
兩者均可以調度mapreduce,pig,java,腳本工作流任務
兩者均可以定時執行工作流任務

工作流定義
Azkaban使用Properties文件定義工作流
Oozie使用XML文件定義工作流

工作流傳參
Azkaban支持直接傳參,例如inputOozieEL{input} Oozie支持參數和EL表達式,例如{fs:dirSize(myInputDir)}

定時執行
Azkaban的定時執行任務是基於時間的
Oozie的定時執行任務基於時間和輸入數據

資源管理
Azkaban有較嚴格的權限控制,如用戶對工作流進行讀/寫/執行等操作
Oozie暫無嚴格的權限控制

工作流執行
Azkaban有兩種運行模式,分別是solo server mode(executor server和web server部署在同一臺節點)和multi server mode(executor server和web server可以部署在不同節點)
Oozie作爲工作流服務器運行,支持多用戶和多工作流

工作流管理
Azkaban支持瀏覽器以及ajax方式操作工作流
Oozie支持命令行、HTTP REST、Java API、瀏覽器操作工作流

2.2 Azkaban介紹
Azkaban是由Linkedin開源的一個批量工作流任務調度器。用於在一個工作流內以一個特定的順序運行一組工作和流程。Azkaban定義了一種KV文件格式來建立任務之間的依賴關係,並提供一個易於使用的web用戶界面維護和跟蹤你的工作流。
它有如下功能特點:
Web用戶界面
方便上傳工作流
方便設置任務之間的關係
調度工作流
認證/授權(權限的工作)
能夠殺死並重新啓動工作流
模塊化和可插拔的插件機制
項目工作區
工作流和任務的日誌記錄和審計

  1. 3 Azkaban安裝部署
    準備工作
    Azkaban Web服務器
    azkaban-web-server-2.5.0.tar.gz
    Azkaban執行服務器
    azkaban-executor-server-2.5.0.tar.gz

MySQL
目前azkaban只支持 mysql,需安裝mysql服務器,本文檔中默認已安裝好mysql服務器,並建立了 root用戶,密碼 root.

下載地址:http://azkaban.github.io/downloads.html

安裝
將安裝文件上傳到集羣,最好上傳到安裝 hive、sqoop的機器上,方便命令的執行
在當前用戶目錄下新建 azkabantools目錄,用於存放源安裝文件.新建azkaban目錄,用於存放azkaban運行程序
azkaban web服務器安裝
解壓azkaban-web-server-2.5.0.tar.gz
命令: tar –zxvf azkaban-web-server-2.5.0.tar.gz
將解壓後的azkaban-web-server-2.5.0 移動到 azkaban目錄中,並重新命名 webserver
命令: mv azkaban-web-server-2.5.0 …/azkaban
cd …/azkaban
mv azkaban-web-server-2.5.0 server

azkaban 執行服器安裝
解壓azkaban-executor-server-2.5.0.tar.gz
命令:tar –zxvf azkaban-executor-server-2.5.0.tar.gz
將解壓後的azkaban-executor-server-2.5.0 移動到 azkaban目錄中,並重新命名 executor
命令:mv azkaban-executor-server-2.5.0 …/azkaban
cd …/azkaban
mv azkaban-executor-server-2.5.0 executor

azkaban腳本導入
解壓: azkaban-sql-script-2.5.0.tar.gz
命令:tar –zxvf azkaban-sql-script-2.5.0.tar.gz
將解壓後的mysql 腳本,導入到mysql中:
進入mysql
mysql> create database azkaban;
mysql> use azkaban;
Database changed
mysql> source /home/hadoop/azkaban-2.5.0/create-all-sql-2.5.0.sql;

創建SSL配置
參考地址: http://docs.codehaus.org/display/JETTY/How+to+configure+SSL
命令: keytool -keystore keystore -alias jetty -genkey -keyalg RSA
運行此命令後,會提示輸入當前生成 keystor的密碼及相應信息,輸入的密碼請勞記,信息如下:

輸入keystore密碼:
再次輸入新密碼:
您的名字與姓氏是什麼?
[Unknown]:
您的組織單位名稱是什麼?
[Unknown]:
您的組織名稱是什麼?
[Unknown]:
您所在的城市或區域名稱是什麼?
[Unknown]:
您所在的州或省份名稱是什麼?
[Unknown]:
該單位的兩字母國家代碼是什麼
[Unknown]: CN
CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=CN 正確嗎?
[否]: y

輸入的主密碼
(如果和 keystore 密碼相同,按回車):
再次輸入新密碼:
完成上述工作後,將在當前目錄生成 keystore 證書文件,將keystore 考貝到 azkaban web服務器根目錄中.如:cp keystore azkaban/webserver

配置文件
注:先配置好服務器節點上的時區
先生成時區配置文件Asia/Shanghai,用交互式命令 tzselect 即可
拷貝該時區文件,覆蓋系統本地時區配置
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

azkaban web服務器配置
進入azkaban web服務器安裝目錄 conf目錄

修改azkaban.properties文件
命令vi azkaban.properties
內容說明如下:
#Azkaban Personalization Settingsazkaban.name=Test                           #服務器UI名稱,用於服務器上方顯示的名字azkaban.label=My Local Azkaban                               #描述azkaban.color=#FF3601                                                 #UI顏色azkaban.default.servlet.path=/index                         #web.resource.dir=web/                                                 #默認根web目錄default.timezone.id=Asia/Shanghai                           #默認時區,已改爲亞洲/上海 默認爲美國 #Azkaban UserManager classuser.manager.class=azkaban.user.XmlUserManager   #用戶權限管理默認類user.manager.xml.file=conf/azkaban-users.xml              #用戶配置,具體配置參加下文 #Loader for projectsexecutor.global.properties=conf/global.properties    # global配置文件所在位置azkaban.project.dir=projects                                                # database.type=mysql                                                              #數據庫類型mysql.port=3306                                                                       #端口號mysql.host=hadoop03                                                   #數據庫連接IPmysql.database=azkaban                                                       #數據庫實例名mysql.user=root                                                                 #數據庫用戶名mysql.password=root                                                          #數據庫密碼mysql.numconnections=100                                                  #最大連接數 # Velocity dev modevelocity.dev.mode=false# Jetty服務器屬性.jetty.maxThreads=25                                                               #最大線程數jetty.ssl.port=8443                                                                   #Jetty SSL端口jetty.port=8081                                                                         #Jetty端口jetty.keystore=keystore                                                          #SSL文件名jetty.password=123456                                                             #SSL文件密碼jetty.keypassword=123456                                                      #Jetty主密碼 與 keystore文件相同jetty.truststore=keystore                                                                #SSL文件名jetty.trustpassword=123456                                                   # SSL文件密碼 # 執行服務器屬性executor.port=12321                                                               #執行服務器端口 # 郵件設置[email protected]                                       #發送郵箱mail.host=smtp.163.com                                                       #發送郵箱smtp地址mail.user=xxxxxxxx                                       #發送郵件時顯示的名稱mail.password=**********                                                 #郵箱密碼[email protected]                              #任務失敗時發送郵件的地址[email protected]                            #任務成功時發送郵件的地址lockdown.create.projects=false                                           #cache.directory=cache                                                            #緩存目錄

azkaban 執行服務器配置
進入執行服務器安裝目錄conf,修改azkaban.properties
vi azkaban.properties
#Azkabandefault.timezone.id=Asia/Shanghai                                              #時區 # Azkaban JobTypes 插件配置azkaban.jobtype.plugin.dir=plugins/jobtypes                   #jobtype 插件所在位置 #Loader for projectsexecutor.global.properties=conf/global.propertiesazkaban.project.dir=projects #數據庫設置database.type=mysql                                                                       #數據庫類型(目前只支持mysql)mysql.port=3306                                                                                #數據庫端口號mysql.host=192.168.20.200                                                           #數據庫IP地址mysql.database=azkaban                                                                #數據庫實例名mysql.user=azkaban                                                                         #數據庫用戶名mysql.password=oracle                                                                   #數據庫密碼mysql.numconnections=100                                                           #最大連接數 # 執行服務器配置executor.maxThreads=50                                                                #最大線程數executor.port=12321                                                               #端口號(如修改,請與web服務中一致)executor.flow.threads=30                                                                #線程數

用戶配置
進入azkaban web服務器conf目錄,修改azkaban-users.xml
vi azkaban-users.xml 增加 管理員用戶
                                       

啓動
web服務器
在azkaban web服務器目錄下執行啓動命令
bin/azkaban-web-start.sh
注:在web服務器根目錄運行

執行服務器
在執行服務器目錄下執行啓動命令
bin/azkaban-executor-start.sh ./
注:只能要執行服務器根目錄運行

啓動完成後,在瀏覽器(建議使用谷歌瀏覽器)中輸入https://服務器IP地址:8443 ,即可訪問azkaban服務了.在登錄中輸入剛纔新的戶用名及密碼,點擊 login.

2.4 Azkaban實戰
Azkaba內置的任務類型支持command、java

Command類型單一job示例
創建job描述文件
vi command.job
#command.jobtype=command command=echo ‘hello’

將job資源文件打包成zip文件
zip command.job

通過azkaban的web管理平臺創建project並上傳job壓縮包
首先創建project

上傳zip包

4、啓動執行該job

Command類型多job工作流flow
創建有依賴關係的多個job描述
第一個job:foo.job

foo.jobtype=commandcommand=echo foo

第二個job:bar.job依賴foo.job

bar.jobtype=commanddependencies=foocommand=echo bar

將所有job資源文件打到一個zip包中

在azkaban的web管理界面創建工程並上傳zip包
啓動工作流flow

HDFS操作任務
創建job描述文件

fs.jobtype=commandcommand=/home/hadoop/apps/hadoop-2.6.1/bin/hadoop fs -mkdir /azaz

將job資源文件打包成zip文件

3、通過azkaban的web管理平臺創建project並上傳job壓縮包
4、啓動執行該job

MAPREDUCE任務
Mr任務依然可以使用command的job類型來執行
創建job描述文件,及mr程序jar包(示例中直接使用hadoop自帶的example jar)

mrwc.jobtype=commandcommand=/home/hadoop/apps/hadoop-2.6.1/bin/hadoop jar hadoop-mapreduce-examples-2.6.1.jar wordcount /wordcount/input /wordcount/azout

將所有job資源文件打到一個zip包中

3、在azkaban的web管理界面創建工程並上傳zip包
4、啓動job
HIVE腳本任務
創建job描述文件和hive腳本
Hive腳本: test.sql
use default;drop table aztest;create table aztest(id int,name string) row format delimited fields terminated by ‘,’;load data inpath ‘/aztest/hiveinput’ into table aztest;create table azres as select * from aztest;insert overwrite directory ‘/aztest/hiveoutput’ select count(1) from aztest;
Job描述文件:hivef.job

hivef.jobtype=commandcommand=/home/hadoop/apps/hive/bin/hive -f ‘test.sql’

2、將所有job資源文件打到一個zip包中
3、在azkaban的web管理界面創建工程並上傳zip包
4、啓動job

  1. sqoop數據遷移
    3.1 概述
    sqoop是apache旗下一款“Hadoop和關係數據庫服務器之間傳送數據”的工具。
    導入數據:MySQL,Oracle導入數據到Hadoop的HDFS、HIVE、HBASE等數據存儲系統;
    導出數據:從Hadoop的文件系統中導出數據到關係數據庫

3.2 工作機制
將導入或導出命令翻譯成mapreduce程序來實現
在翻譯出的mapreduce中主要是對inputformat和outputformat進行定製

3.3 sqoop實戰及原理
3.3.1 sqoop安裝
安裝sqoop的前提是已經具備java和hadoop的環境
1、下載並解壓
最新版下載地址http://ftp.wayne.edu/apache/sqoop/1.4.6/

2、修改配置文件
$ cd $SQOOP_HOME/conf
$ mv sqoop-env-template.sh sqoop-env.sh
打開sqoop-env.sh並編輯下面幾行:
export HADOOP_COMMON_HOME=/home/hadoop/apps/hadoop-2.6.1/
export HADOOP_MAPRED_HOME=/home/hadoop/apps/hadoop-2.6.1/
export HIVE_HOME=/home/hadoop/apps/hive-1.2.1

加入mysql的jdbc驅動包
cp ~/app/hive/lib/mysql-connector-java-5.1.28.jar $SQOOP_HOME/lib/
4、驗證啓動
$ cd $SQOOP_HOME/bin
$ sqoop-version
預期的輸出:
15/12/17 14:52:32 INFO sqoop.Sqoop: Running Sqoop version: 1.4.6
Sqoop 1.4.6 git commit id 5b34accaca7de251fc91161733f906af2eddbe83
Compiled by abe on Fri Aug 1 11:19:26 PDT 2015
到這裏,整個Sqoop安裝工作完成。

3.4 Sqoop的數據導入
“導入工具”導入單個表從RDBMS到HDFS。表中的每一行被視爲HDFS的記錄。所有記錄都存儲爲文本文件的文本數據(或者Avro、sequence文件等二進制數據)
3.4.1 語法
下面的語法用於將數據導入HDFS。
$ sqoop import (generic-args) (import-args)

3.4.2 示例
表數據
在mysql中有一個庫userdb中三個表:emp, emp_add和emp_contact
表emp:
id name deg salary dept
1201 gopal manager 50,000 TP
1202 manisha Proof reader 50,000 TP
1203 khalil php dev 30,000 AC
1204 prasanth php dev 30,000 AC
1205 kranthi admin 20,000 TP
表emp_add:
id hno street city
1201 288A vgiri jublee
1202 108I aoc sec-bad
1203 144Z pgutta hyd
1204 78B old city sec-bad
1205 720X hitec sec-bad
表emp_conn:

id phno email
1201 2356742 [email protected]
1202 1661663 [email protected]
1203 8887776 [email protected]
1204 9988774 [email protected]
1205 1231231 [email protected]
導入表表數據到HDFS
下面的命令用於從MySQL數據庫服務器中的emp表導入HDFS。
$bin/sqoop import --connect jdbc:mysql://hdp-node-01:3306/test --username root --password root --table emp --m 1

如果成功執行,那麼會得到下面的輸出。
14/12/22 15:24:54 INFO sqoop.Sqoop: Running Sqoop version: 1.4.514/12/22 15:24:56 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset.INFO orm.CompilationManager: Writing jar file: /tmp/sqoop-hadoop/compile/cebe706d23ebb1fd99c1f063ad51ebd7/emp.jar-----------------------------------------------------O mapreduce.Job: map 0% reduce 0%14/12/22 15:28:08 INFO mapreduce.Job: map 100% reduce 0%14/12/22 15:28:16 INFO mapreduce.Job: Job job_1419242001831_0001 completed successfully----------------------------------------------------------------------------------------------------------14/12/22 15:28:17 INFO mapreduce.ImportJobBase: Transferred 145 bytes in 177.5849 seconds (0.8165 bytes/sec)14/12/22 15:28:17 INFO mapreduce.ImportJobBase: Retrieved 5 records.

爲了驗證在HDFS導入的數據,請使用以下命令查看導入的數據
$ $HADOOP_HOME/bin/hadoop fs -cat /user/hadoop/emp/part-m-00000

emp表的數據和字段之間用逗號(,)表示。
1201, gopal, manager, 50000, TP1202, manisha, preader, 50000, TP1203, kalil, php dev, 30000, AC1204, prasanth, php dev, 30000, AC1205, kranthi, admin, 20000, TP

導入關係表到HIVE
bin/sqoop import --connect jdbc:mysql://hdp-node-01:3306/test --username root --password root --table emp --hive-import --m 1
導入到HDFS指定目錄
在導入表數據到HDFS使用Sqoop導入工具,我們可以指定目標目錄。
以下是指定目標目錄選項的Sqoop導入命令的語法。
–target-dir

下面的命令是用來導入emp_add表數據到’/queryresult’目錄。
bin/sqoop import --connect jdbc:mysql://hdp-node-01:3306/test --username root --password root --target-dir /queryresult --table emp --m 1

下面的命令是用來驗證 /queryresult 目錄中 emp_add表導入的數據形式。
$HADOOP_HOME/bin/hadoop fs -cat /queryresult/part-m-*

它會用逗號(,)分隔emp_add表的數據和字段。
1201, 288A, vgiri, jublee1202, 108I, aoc, sec-bad1203, 144Z, pgutta, hyd1204, 78B, oldcity, sec-bad1205, 720C, hitech, sec-bad

導入表數據子集
我們可以導入表的使用Sqoop導入工具,"where"子句的一個子集。它執行在各自的數據庫服務器相應的SQL查詢,並將結果存儲在HDFS的目標目錄。
where子句的語法如下。
–where

下面的命令用來導入emp_add表數據的子集。子集查詢檢索員工ID和地址,居住城市爲:Secunderabad
bin/sqoop import --connect jdbc:mysql://hdp-node-01:3306/test --username root --password root --where “city =‘sec-bad’” --target-dir /wherequery --table emp_add --m 1

下面的命令用來驗證數據從emp_add表導入/wherequery目錄
$HADOOP_HOME/bin/hadoop fs -cat /wherequery/part-m-*

它用逗號(,)分隔 emp_add表數據和字段。
1202, 108I, aoc, sec-bad1204, 78B, oldcity, sec-bad1205, 720C, hitech, sec-bad

增量導入
增量導入是僅導入新添加的表中的行的技術。
它需要添加‘incremental’, ‘check-column’, 和 ‘last-value’選項來執行增量導入。
下面的語法用於Sqoop導入命令增量選項。
–incremental –check-column –last value

假設新添加的數據轉換成emp表如下:
1206, satish p, grp des, 20000, GR
下面的命令用於在EMP表執行增量導入。
bin/sqoop import --connect jdbc:mysql://hdp-node-01:3306/test --username root --password root --table emp --m 1 --incremental append --check-column id --last-value 1205

以下命令用於從emp表導入HDFS emp/ 目錄的數據驗證。
$ $HADOOP_HOME/bin/hadoop fs -cat /user/hadoop/emp/part-m-*它用逗號(,)分隔 emp_add表數據和字段。1201, gopal, manager, 50000, TP1202, manisha, preader, 50000, TP1203, kalil, php dev, 30000, AC1204, prasanth, php dev, 30000, AC1205, kranthi, admin, 20000, TP1206, satish p, grp des, 20000, GR

下面的命令是從表emp 用來查看修改或新添加的行
$ $HADOOP_HOME/bin/hadoop fs -cat /emp/part-m-*1這表示新添加的行用逗號(,)分隔emp表的字段。 1206, satish p, grp des, 20000, GR

3.5 Sqoop的數據導出
將數據從HDFS導出到RDBMS數據庫
導出前,目標表必須存在於目標數據庫中。
默認操作是從將文件中的數據使用INSERT語句插入到表中
更新模式下,是生成UPDATE語句更新表數據
語法
以下是export命令語法。
$ sqoop export (generic-args) (export-args)

示例
數據是在HDFS 中“EMP/”目錄的emp_data文件中。所述emp_data如下:
1201, gopal, manager, 50000, TP1202, manisha, preader, 50000, TP1203, kalil, php dev, 30000, AC1204, prasanth, php dev, 30000, AC1205, kranthi, admin, 20000, TP1206, satish p, grp des, 20000, GR

1、首先需要手動創建mysql中的目標表
$ mysqlmysql> USE db;mysql> CREATE TABLE employee ( id INT NOT NULL PRIMARY KEY, name VARCHAR(20), deg VARCHAR(20), salary INT, dept VARCHAR(10));

2、然後執行導出命令
bin/sqoop export --connect jdbc:mysql://hdp-node-01:3306/test --username root --password root --table emp2 --export-dir /user/hadoop/emp/

3、驗證表mysql命令行。
mysql>select * from employee;如果給定的數據存儲成功,那麼可以找到數據在如下的employee表。±-----±-------------±------------±------------------±-------+| Id | Name | Designation | Salary | Dept |±-----±-------------±------------±------------------±-------+| 1201 | gopal | manager | 50000 | TP || 1202 | manisha | preader | 50000 | TP || 1203 | kalil | php dev | 30000 | AC || 1204 | prasanth | php dev | 30000 | AC || 1205 | kranthi | admin | 20000 | TP || 1206 | satish p | grp des | 20000 | GR |±-----±-------------±------------±------------------±-------+

3.6 Sqoop作業
注:Sqoop作業——將事先定義好的數據導入導出任務按照指定流程運行
語法
以下是創建Sqoop作業的語法。
$ sqoop job (generic-args) (job-args) [-- [subtool-name] (subtool-args)]$ sqoop-job (generic-args) (job-args) [-- [subtool-name] (subtool-args)]

創建作業(–create)
在這裏,我們創建一個名爲myjob,這可以從RDBMS表的數據導入到HDFS作業。

bin/sqoop job --create myimportjob – import --connect jdbc:mysql://hdp-node-01:3306/test --username root --password root --table emp --m 1
該命令創建了一個從db庫的employee表導入到HDFS文件的作業。

驗證作業 (–list)
‘–list’ 參數是用來驗證保存的作業。下面的命令用來驗證保存Sqoop作業的列表。
$ sqoop job --list
它顯示了保存作業列表。
Available jobs:
myjob
檢查作業(–show)
‘–show’ 參數用於檢查或驗證特定的工作,及其詳細信息。以下命令和樣本輸出用來驗證一個名爲myjob的作業。
$ sqoop job --show myjob
它顯示了工具和它們的選擇,這是使用在myjob中作業情況。
Job: myjob Tool: import Options: ---------------------------- direct.import = true codegen.input.delimiters.record = 0 hdfs.append.dir = false db.table = employee … incremental.last.value = 1206 …

執行作業 (–exec)
‘–exec’ 選項用於執行保存的作業。下面的命令用於執行保存的作業稱爲myjob。
$ sqoop job --exec myjob它會顯示下面的輸出。10/08/19 13:08:45 INFO tool.CodeGenTool: Beginning code generation …

3.7 Sqoop的原理
概述
Sqoop的原理其實就是將導入導出命令轉化爲mapreduce程序來執行,sqoop在接收到命令後,都要生成mapreduce程序

使用sqoop的代碼生成工具可以方便查看到sqoop所生成的java代碼,並可在此基礎之上進行深入定製開發

代碼定製
以下是Sqoop代碼生成命令的語法:
$ sqoop-codegen (generic-args) (codegen-args) $ sqoop-codegen (generic-args) (codegen-args)

示例:以USERDB數據庫中的表emp來生成Java代碼爲例。
下面的命令用來生成導入
$ sqoop-codegen --import–connect jdbc:mysql://localhost/userdb --username root \ --table emp

如果命令成功執行,那麼它就會產生如下的輸出。
14/12/23 02:34:40 INFO sqoop.Sqoop: Running Sqoop version: 1.4.514/12/23 02:34:41 INFO tool.CodeGenTool: Beginning code generation……………….14/12/23 02:34:42 INFO orm.CompilationManager: HADOOP_MAPRED_HOME is /usr/local/hadoopNote: /tmp/sqoop-hadoop/compile/9a300a1f94899df4a9b10f9935ed9f91/emp.java uses or overrides a deprecated API.Note: Recompile with -Xlint:deprecation for details.14/12/23 02:34:47 INFO orm.CompilationManager: Writing jar file: /tmp/sqoop-hadoop/compile/9a300a1f94899df4a9b10f9935ed9f91/emp.jar

驗證: 查看輸出目錄下的文件
$ cd /tmp/sqoop-hadoop/compile/9a300a1f94899df4a9b10f9935ed9f91/$ lsemp.classemp.jaremp.java
如果想做深入定製導出,則可修改上述代碼文件

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