Hadoop遷移MaxCompute神器之DataX-On-Hadoop使用指南
摘要: DataX-On-Hadoop即使用hadoop的任務排程器,將DataX task(Reader->Channel->Writer)排程到hadoop執行叢集上執行。這樣使用者的hadoop資料可以通過MR任務批量上傳到ODPS、RDS等,不需要使用者提前安裝和部署DataX軟體包,也不需要另外為DataX準備執行叢集。
DataX-On-Hadoop即使用hadoop的任務排程器,將DataX task(Reader->Channel->Writer)排程到hadoop執行叢集上執行。這樣使用者的hadoop資料可以通過MR任務批量上傳到MaxCompute、RDS等,不需要使用者提前安裝和部署DataX軟體包,也不需要另外為DataX準備執行叢集。但是可以享受到DataX已有的外掛邏輯、流控限速、魯棒重試等等。
1. DataX-On-Hadoop 執行方式
1.1 什麼是DataX-On-Hadoop
DataX https://github.com/alibaba/DataX 是阿里巴巴集團內被廣泛使用的離線資料同步工具/平臺,實現包括 MySQL、Oracle、HDFS、Hive、OceanBase、HBase、OTS、MaxCompute 等各種異構資料來源之間高效的資料同步功能。 DataX同步引擎內部實現了任務的切分、排程執行能力,DataX的執行不依賴Hadoop環境。
DataX-On-Hadoop是DataX針對Hadoop排程環境實現的版本,使用hadoop的任務排程器,將DataX task(Reader->Channel->Writer)排程到hadoop執行叢集上執行。這樣使用者的hadoop資料可以通過MR任務批量上傳到MaxCompute等,不需要使用者提前安裝和部署DataX軟體包,也不需要另外為DataX準備執行叢集。但是可以享受到DataX已有的外掛邏輯、流控限速、魯棒重試等等。
目前DataX-On-Hadoop支援將Hdfs中的資料上傳到公共雲MaxCompute當中。
1.2 如何執行DataX-On-Hadoop
執行DataX-On-Hadoop步驟如下:
- 提阿里雲工單申請DataX-On-Hadoop軟體包,此軟體包本質上也是一個Hadoop MR Jar;
- 通過hadoop客戶端提交一個MR任務,您只需要關係作業的配置檔案內容(這裡是./bvt_case/speed.json,配置檔案和普通的DataX配置檔案完全一致),提交命令是:
<span style="color:#333333"><span style="color:#f8f8f2"><code class="language-java"><span style="color:#f8f8f2">.</span>/bin<span style="color:#f8f8f2">/</span>hadoop jar datax<span style="color:#f8f8f2">-</span>jar<span style="color:#f8f8f2">-</span>with<span style="color:#f8f8f2">-</span>dependencies<span style="color:#f8f8f2">.</span>jar com<span style="color:#f8f8f2">.</span>alibaba<span style="color:#f8f8f2">.</span>datax<span style="color:#f8f8f2">.</span>hdfs<span style="color:#f8f8f2">.</span>odps<span style="color:#f8f8f2">.</span>mr<span style="color:#f8f8f2">.</span>HdfsToOdpsMRJob <span style="color:#f8f8f2">.</span>/bvt_case<span style="color:#f8f8f2">/</span>speed<span style="color:#f8f8f2">.</span>json</code></span></span>
- 任務執行完成後,可以看到類似如下日誌:
本例子的Hdfs Reader 和Odps Writer配置資訊如下:
<span style="color:#333333"><span style="color:#f8f8f2"><code class="language-java"><span style="color:#f8f8f2">{</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"core"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#f8f8f2">{</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"transport"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#f8f8f2">{</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"channel"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#f8f8f2">{</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"speed"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#f8f8f2">{</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"byte"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#a6e22e"><span style="color:#e6db74">"-1"</span></span><span style="color:#f8f8f2">,</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"record"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#a6e22e"><span style="color:#e6db74">"-1"</span></span>
<span style="color:#f8f8f2">}</span>
<span style="color:#f8f8f2">}</span>
<span style="color:#f8f8f2">}</span>
<span style="color:#f8f8f2">}</span><span style="color:#f8f8f2">,</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"job"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#f8f8f2">{</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"setting"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#f8f8f2">{</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"speed"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#f8f8f2">{</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"byte"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#ae81ff"><span style="color:#ae81ff">1048576</span></span>
<span style="color:#f8f8f2">}</span><span style="color:#f8f8f2">,</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"errorLimit"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#f8f8f2">{</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"record"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#ae81ff"><span style="color:#ae81ff">0</span></span>
<span style="color:#f8f8f2">}</span>
<span style="color:#f8f8f2">}</span><span style="color:#f8f8f2">,</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"content"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#f8f8f2">[</span>
<span style="color:#f8f8f2">{</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"reader"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#f8f8f2">{</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"name"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#a6e22e"><span style="color:#e6db74">"hdfsreader"</span></span><span style="color:#f8f8f2">,</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"parameter"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#f8f8f2">{</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"path"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#a6e22e"><span style="color:#e6db74">"/tmp/test_datax/big_data*"</span></span><span style="color:#f8f8f2">,</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"defaultFS"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#a6e22e"><span style="color:#e6db74">"hdfs://localhost:9000"</span></span><span style="color:#f8f8f2">,</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"column"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#f8f8f2">[</span>
<span style="color:#f8f8f2">{</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"index"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#ae81ff"><span style="color:#ae81ff">0</span></span><span style="color:#f8f8f2">,</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"type"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#a6e22e"><span style="color:#e6db74">"string"</span></span>
<span style="color:#f8f8f2">}</span><span style="color:#f8f8f2">,</span>
<span style="color:#f8f8f2">{</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"index"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#ae81ff"><span style="color:#ae81ff">1</span></span><span style="color:#f8f8f2">,</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"type"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#a6e22e"><span style="color:#e6db74">"string"</span></span>
<span style="color:#f8f8f2">}</span>
<span style="color:#f8f8f2">]</span><span style="color:#f8f8f2">,</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"fileType"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#a6e22e"><span style="color:#e6db74">"text"</span></span><span style="color:#f8f8f2">,</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"encoding"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#a6e22e"><span style="color:#e6db74">"UTF-8"</span></span><span style="color:#f8f8f2">,</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"fieldDelimiter"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#a6e22e"><span style="color:#e6db74">","</span></span>
<span style="color:#f8f8f2">}</span>
<span style="color:#f8f8f2">}</span><span style="color:#f8f8f2">,</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"writer"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#f8f8f2">{</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"name"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#a6e22e"><span style="color:#e6db74">"odpswriter"</span></span><span style="color:#f8f8f2">,</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"parameter"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#f8f8f2">{</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"project"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#a6e22e"><span style="color:#e6db74">""</span></span><span style="color:#f8f8f2">,</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"table"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#a6e22e"><span style="color:#e6db74">""</span></span><span style="color:#f8f8f2">,</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"partition"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#a6e22e"><span style="color:#e6db74">"pt=1,dt=2"</span></span><span style="color:#f8f8f2">,</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"column"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#f8f8f2">[</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"id"</span></span><span style="color:#f8f8f2">,</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"name"</span></span>
<span style="color:#f8f8f2">]</span><span style="color:#f8f8f2">,</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"accessId"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#a6e22e"><span style="color:#e6db74">""</span></span><span style="color:#f8f8f2">,</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"accessKey"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#a6e22e"><span style="color:#e6db74">""</span></span><span style="color:#f8f8f2">,</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"truncate"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#ae81ff"><span style="color:#f92672">true</span></span><span style="color:#f8f8f2">,</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"odpsServer"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#a6e22e"><span style="color:#e6db74">"http://service.odps.aliyun.com/api"</span></span><span style="color:#f8f8f2">,</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"tunnelServer"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#a6e22e"><span style="color:#e6db74">"http://dt.odps.aliyun.com"</span></span><span style="color:#f8f8f2">,</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"accountType"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#a6e22e"><span style="color:#e6db74">"aliyun"</span></span>
<span style="color:#f8f8f2">}</span>
<span style="color:#f8f8f2">}</span>
<span style="color:#f8f8f2">}</span>
<span style="color:#f8f8f2">]</span>
<span style="color:#f8f8f2">}</span>
<span style="color:#f8f8f2">}</span></code></span></span>
1.3 DataX-On-Hadoop 任務高階配置引數
針對上面的例子,介紹幾個效能、髒資料的引數:
- core.transport.channel.speed.byte 同步任務切分多多個mapper併發執行,每個mapper的同步速度位元Byte上限,預設為-1,負數表示不限速;如果是1048576表示單個mapper最大速度是1MB/s。
- core.transport.channel.speed.record 同步任務切分多多個mapper併發執行,每個mapper的同步速度記錄上限,預設為-1,負數表示不限速;如果是10000表示單個mapper最大記錄速度每秒1萬行。
- job.setting.speed.byte 同步任務整體的最大速度,依賴hadoop 2.7.0以後的版本,主要是通過mapreduce.job.running.map.limit引數控制同一時間點mapper的並行度。
- job.setting.errorLimit.record 髒資料記錄現在,預設不配置表示不進行髒資料檢查(有髒資料任務不會失敗);0表示允許髒資料條數最大為0條,如果任務執行時髒資料超過限制,任務會失敗;1表示允許髒資料條數最大為1條,含義不言自明。一個由於髒資料原因失敗的任務:
作業級別的效能引數配置位置示例:
<span style="color:#333333"><span style="color:#f8f8f2"><code class="language-java"><span style="color:#f8f8f2">{</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"core"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#f8f8f2">{</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"transport"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#f8f8f2">{</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"channel"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#f8f8f2">{</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"speed"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#f8f8f2">{</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"byte"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#a6e22e"><span style="color:#e6db74">"-1"</span></span><span style="color:#f8f8f2">,</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"record"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#a6e22e"><span style="color:#e6db74">"-1"</span></span>
<span style="color:#f8f8f2">}</span>
<span style="color:#f8f8f2">}</span>
<span style="color:#f8f8f2">}</span>
<span style="color:#f8f8f2">}</span><span style="color:#f8f8f2">,</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"job"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#f8f8f2">{</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"setting"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#f8f8f2">{</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"speed"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#f8f8f2">{</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"byte"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#ae81ff"><span style="color:#ae81ff">1048576</span></span>
<span style="color:#f8f8f2">}</span><span style="color:#f8f8f2">,</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"errorLimit"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#f8f8f2">{</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"record"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#ae81ff"><span style="color:#ae81ff">0</span></span>
<span style="color:#f8f8f2">}</span>
<span style="color:#f8f8f2">}</span><span style="color:#f8f8f2">,</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"content"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#f8f8f2">[</span>
<span style="color:#f8f8f2">{</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"reader"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#f8f8f2">{</span><span style="color:#f8f8f2">}</span><span style="color:#f8f8f2">,</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"writer"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#f8f8f2">{</span><span style="color:#f8f8f2">}</span>
<span style="color:#f8f8f2">}</span>
<span style="color:#f8f8f2">]</span>
<span style="color:#f8f8f2">}</span>
<span style="color:#f8f8f2">}</span></code></span></span>
另外,介紹幾個變數替換、作業命名引數:
- 支援變數引數,比如作業配置檔案json中有如下:
-
<span style="color:#333333"><span style="color:#f8f8f2"><code class="language-java"><span style="color:#a6e22e"><span style="color:#e6db74">"path"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#a6e22e"><span style="color:#e6db74">"/tmp/test_datax/dt=${dt}/abc.txt"</span></span></code></span></span>
任務執行時可以配置如下傳參,使得一份配置程式碼可以多次使用:
<span style="color:#333333"><span style="color:#f8f8f2"><code class="language-java"><span style="color:#f8f8f2">.</span>/bin<span style="color:#f8f8f2">/</span>hadoop jar datax<span style="color:#f8f8f2">-</span>jar<span style="color:#f8f8f2">-</span>with<span style="color:#f8f8f2">-</span>dependencies<span style="color:#f8f8f2">.</span>jar com<span style="color:#f8f8f2">.</span>alibaba<span style="color:#f8f8f2">.</span>datax<span style="color:#f8f8f2">.</span>hdfs<span style="color:#f8f8f2">.</span>odps<span style="color:#f8f8f2">.</span>mr<span style="color:#f8f8f2">.</span>HdfsToOdpsMRJob
datax<span style="color:#f8f8f2">.</span>json <span style="color:#f8f8f2">-</span>p <span style="color:#a6e22e"><span style="color:#e6db74">"-Ddt=20170427 -Dbizdate=123"</span></span> <span style="color:#f8f8f2">-</span>t hdfs_2_odps_mr</code></span></span>
- 支援給作業命名,任務執行時的-t引數是作業的traceId,即作業的名字方便根據作業名字即知曉其意圖,比如上面的
-t hdfs_2_odps_mr
讀寫外掛詳細配置介紹,請見後續第2、3部分。
2. Hdfs 讀取
2.1 快速介紹
Hdfs Reader提供了讀取分散式檔案系統資料儲存的能力。在底層實現上,Hdfs Reader獲取分散式檔案系統上檔案的資料,並轉換為DataX傳輸協議傳遞給Writer。
Hdfs Reader實現了從Hadoop分散式檔案系統Hdfs中讀取檔案資料並轉為DataX協議的功能。textfile是Hive建表時預設使用的儲存格式,資料不做壓縮,本質上textfile就是以文字的形式將資料存放在hdfs中,對於DataX而言,Hdfs Reader實現上類比TxtFileReader,有諸多相似之處。orcfile,它的全名是Optimized Row Columnar file,是對RCFile做了優化。據官方文件介紹,這種檔案格式可以提供一種高效的方法來儲存Hive資料。Hdfs Reader利用Hive提供的OrcSerde類,讀取解析orcfile檔案的資料。目前Hdfs Reader支援的功能如下:
-
支援textfile、orcfile、rcfile、sequence file、csv和parquet格式的檔案,且要求檔案內容存放的是一張邏輯意義上的二維表。
-
支援多種型別資料讀取(使用String表示),支援列裁剪,支援列常量。
-
支援遞迴讀取、支援正則表示式("*"和"?")。
-
支援orcfile資料壓縮,目前支援SNAPPY,ZLIB兩種壓縮方式。
-
支援sequence file資料壓縮,目前支援lzo壓縮方式。
-
多個File可以支援併發讀取。
-
csv型別支援壓縮格式有:gzip、bz2、zip、lzo、lzo_deflate、snappy。
我們暫時不能做到:
- 單個File支援多執行緒併發讀取,這裡涉及到單個File內部切分演算法。後續可以做到支援。
2.2 功能說明
2.2.1 配置樣例
<span style="color:#333333"><span style="color:#f8f8f2"><code class="language-java"><span style="color:#f8f8f2">{</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"core"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#f8f8f2">{</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"transport"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#f8f8f2">{</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"channel"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#f8f8f2">{</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"speed"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#f8f8f2">{</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"byte"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#a6e22e"><span style="color:#e6db74">"-1048576"</span></span><span style="color:#f8f8f2">,</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"record"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#a6e22e"><span style="color:#e6db74">"-1"</span></span>
<span style="color:#f8f8f2">}</span>
<span style="color:#f8f8f2">}</span>
<span style="color:#f8f8f2">}</span>
<span style="color:#f8f8f2">}</span><span style="color:#f8f8f2">,</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"job"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#f8f8f2">{</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"setting"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#f8f8f2">{</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"speed"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#f8f8f2">{</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"byte"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#ae81ff"><span style="color:#ae81ff">1048576</span></span>
<span style="color:#f8f8f2">}</span><span style="color:#f8f8f2">,</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"errorLimit"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#f8f8f2">{</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"record"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#ae81ff"><span style="color:#ae81ff">0</span></span>
<span style="color:#f8f8f2">}</span>
<span style="color:#f8f8f2">}</span><span style="color:#f8f8f2">,</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"content"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#f8f8f2">[</span>
<span style="color:#f8f8f2">{</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"reader"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#f8f8f2">{</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"name"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#a6e22e"><span style="color:#e6db74">"hdfsreader"</span></span><span style="color:#f8f8f2">,</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"parameter"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#f8f8f2">{</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"path"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#a6e22e"><span style="color:#e6db74">"/tmp/test_datax/*"</span></span><span style="color:#f8f8f2">,</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"defaultFS"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#a6e22e"><span style="color:#e6db74">"hdfs://localhost:9000"</span></span><span style="color:#f8f8f2">,</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"column"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#f8f8f2">[</span>
<span style="color:#f8f8f2">{</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"index"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#ae81ff"><span style="color:#ae81ff">0</span></span><span style="color:#f8f8f2">,</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"type"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#a6e22e"><span style="color:#e6db74">"string"</span></span>
<span style="color:#f8f8f2">}</span><span style="color:#f8f8f2">,</span>
<span style="color:#f8f8f2">{</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"index"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#ae81ff"><span style="color:#ae81ff">1</span></span><span style="color:#f8f8f2">,</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"type"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#a6e22e"><span style="color:#e6db74">"string"</span></span>
<span style="color:#f8f8f2">}</span>
<span style="color:#f8f8f2">]</span><span style="color:#f8f8f2">,</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"fileType"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#a6e22e"><span style="color:#e6db74">"text"</span></span><span style="color:#f8f8f2">,</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"encoding"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#a6e22e"><span style="color:#e6db74">"UTF-8"</span></span><span style="color:#f8f8f2">,</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"fieldDelimiter"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#a6e22e"><span style="color:#e6db74">","</span></span>
<span style="color:#f8f8f2">}</span>
<span style="color:#f8f8f2">}</span><span style="color:#f8f8f2">,</span>
<span style="color:#a6e22e"><span style="color:#e6db74">"writer"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#f8f8f2">{</span><span style="color:#f8f8f2">}</span>
<span style="color:#f8f8f2">}</span>
<span style="color:#f8f8f2">]</span>
<span style="color:#f8f8f2">}</span>
<span style="color:#f8f8f2">}</span></code></span></span>
2.2.2 引數說明
-
path
-
描述:要讀取的檔案路徑,如果要讀取多個檔案,可以使用正則表示式"*",注意這裡可以支援填寫多個路徑。
當指定萬用字元,HdfsReader嘗試遍歷出多個檔案資訊。例如: 指定/*代表讀取/目錄下所有的檔案,指定/yixiao/*代表讀取yixiao目錄下所有的檔案。HdfsReader目前只支援"*"和"?"作為檔案萬用字元。
特別需要注意的是,DataX會將一個作業下同步的所有的檔案視作同一張資料表。使用者必須自己保證所有的File能夠適配同一套schema資訊。並且提供給DataX許可權可讀。
-
必選:是
-
預設值:無
-
-
defaultFS
- 描述:Hadoop hdfs檔案系統namenode節點地址。
- 必選:是
- 預設值:無
-
fileType
-
描述:檔案的型別,目前只支援使用者配置為"text"、"orc"、"rc"、"seq"、"csv"。
text表示textfile檔案格式
orc表示orcfile檔案格式
rc表示rcfile檔案格式
seq表示sequence file檔案格式
csv表示普通hdfs檔案格式(邏輯二維表)
特別需要注意的是,HdfsReader能夠自動識別檔案是orcfile、rcfile、sequence file還是textfile或csv型別的檔案,該項是必填項,HdfsReader在做資料同步之前,會檢查使用者配置的路徑下所有需要同步的檔案格式是否和fileType一致,如果不一致則會丟擲異常
另外需要注意的是,由於textfile和orcfile是兩種完全不同的檔案格式,所以HdfsReader對這兩種檔案的解析方式也存在差異,這種差異導致hive支援的複雜複合型別(比如map,array,struct,union)在轉換為DataX支援的String型別時,轉換的結果格式略有差異,比如以map型別為例:
orcfile map型別經hdfsreader解析轉換成datax支援的string型別後,結果為"{job=80, team=60, person=70}"
textfile map型別經hdfsreader解析轉換成datax支援的string型別後,結果為"job:80,team:60,person:70"
從上面的轉換結果可以看出,資料本身沒有變化,但是表示的格式略有差異,所以如果使用者配置的檔案路徑中要同步的欄位在Hive中是複合型別的話,建議配置統一的檔案格式。
如果需要統一複合型別解析出來的格式,我們建議使用者在hive客戶端將textfile格式的表導成orcfile格式的表
-
-
column
-
描述:讀取欄位列表,type指定源資料的型別,index指定當前列來自於文字第幾列(以0開始),value指定當前型別為常量,不從源標頭檔案讀取資料,而是根據value值自動生成對應的列。
預設情況下,使用者可以全部按照string型別讀取資料,配置如下:
使用者可以指定column欄位資訊,配置如下:
對於使用者指定column資訊,type必須填寫,index/value必須選擇其一。
-
<span style="color:#333333"><span style="color:#f8f8f2"><code class="language-java"><span style="color:#a6e22e"><span style="color:#e6db74">"column"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#f8f8f2">[</span><span style="color:#a6e22e"><span style="color:#e6db74">"*"</span></span><span style="color:#f8f8f2">]</span></code></span></span>
-
<span style="color:#333333"><span style="color:#f8f8f2"><code class="language-java"><span style="color:#f8f8f2">{</span> <span style="color:#a6e22e"><span style="color:#e6db74">"type"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#a6e22e"><span style="color:#e6db74">"long"</span></span><span style="color:#f8f8f2">,</span> <span style="color:#a6e22e"><span style="color:#e6db74">"index"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#ae81ff"><span style="color:#ae81ff">0</span></span> <span style="color:slategray"><span style="color:#75715e">//從本地檔案文字第一列獲取int欄位</span></span> <span style="color:#f8f8f2">}</span><span style="color:#f8f8f2">,</span> <span style="color:#f8f8f2">{</span> <span style="color:#a6e22e"><span style="color:#e6db74">"type"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#a6e22e"><span style="color:#e6db74">"string"</span></span><span style="color:#f8f8f2">,</span> <span style="color:#a6e22e"><span style="color:#e6db74">"value"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#a6e22e"><span style="color:#e6db74">"alibaba"</span></span> <span style="color:slategray"><span style="color:#75715e">//HdfsReader內部生成alibaba的字串欄位作為當前欄位</span></span> <span style="color:#f8f8f2">}</span></code></span></span>
-
必選:是
-
預設值:全部按照string型別讀取
-
-
fieldDelimiter
- 描述:讀取的欄位分隔符
另外需要注意的是,HdfsReader在讀取textfile資料時,需要指定欄位分割符,如果不指定預設為',',HdfsReader在讀取orcfile時,使用者無需指定欄位分割符,hive本身的預設分隔符為 "\u0001";若你想將每一行作為目的端的一列,分隔符請使用行內容不存在的字元,比如不可見字元"\u0001" ,分隔符不能使用\n
- 必選:否
- 預設值:,
-
encoding
- 描述:讀取檔案的編碼配置。
- 必選:否
- 預設值:utf-8
-
nullFormat
-
描述:文字檔案中無法使用標準字串定義null(空指標),DataX提供nullFormat定義哪些字串可以表示為null。
例如如果使用者配置: nullFormat:"\N",那麼如果源頭資料是"\N",DataX視作null欄位。
-
必選:否
-
預設值:無
-
-
compress
- 描述:當fileType(檔案型別)為csv下的檔案壓縮方式,目前僅支援 gzip、bz2、zip、lzo、lzo_deflate、hadoop-snappy、framing-snappy壓縮;值得注意的是,lzo存在兩種壓縮格式:lzo和lzo_deflate,使用者在配置的時候需要留心,不要配錯了;另外,由於snappy目前沒有統一的stream format,datax目前只支援最主流的兩種:hadoop-snappy(hadoop上的snappy stream format)和framing-snappy(google建議的snappy stream format);orc檔案型別下無需填寫。
- 必選:否
- 預設值:無
-
csvReaderConfig
- 描述:讀取CSV型別檔案引數配置,Map型別。讀取CSV型別檔案使用的CsvReader進行讀取,會有很多配置,不配置則使用預設值。
- 必選:否
-
預設值:無
常見配置:
<span style="color:#333333"><span style="color:#f8f8f2"><code class="language-java"><span style="color:#a6e22e"><span style="color:#e6db74">"csvReaderConfig"</span></span><span style="color:#f8f8f2">:</span><span style="color:#f8f8f2">{</span> <span style="color:#a6e22e"><span style="color:#e6db74">"safetySwitch"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#ae81ff"><span style="color:#f92672">false</span></span><span style="color:#f8f8f2">,</span> <span style="color:#a6e22e"><span style="color:#e6db74">"skipEmptyRecords"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#ae81ff"><span style="color:#f92672">false</span></span><span style="color:#f8f8f2">,</span> <span style="color:#a6e22e"><span style="color:#e6db74">"useTextQualifier"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#ae81ff"><span style="color:#f92672">false</span></span> <span style="color:#f8f8f2">}</span></code></span></span>
所有配置項及預設值,配置時 csvReaderConfig 的map中請嚴格按照以下欄位名字進行配置:
-
hadoopConfig
-
描述:hadoopConfig裡可以配置與Hadoop相關的一些高階引數,比如HA的配置。
<span style="color:#333333"><span style="color:#f8f8f2"><code class="language-java"><span style="color:#a6e22e"><span style="color:#e6db74">"hadoopConfig"</span></span><span style="color:#f8f8f2">:</span><span style="color:#f8f8f2">{</span> <span style="color:#a6e22e"><span style="color:#e6db74">"dfs.nameservices"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#a6e22e"><span style="color:#e6db74">"testDfs"</span></span><span style="color:#f8f8f2">,</span> <span style="color:#a6e22e"><span style="color:#e6db74">"dfs.ha.namenodes.testDfs"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#a6e22e"><span style="color:#e6db74">"namenode1,namenode2"</span></span><span style="color:#f8f8f2">,</span> <span style="color:#a6e22e"><span style="color:#e6db74">"dfs.namenode.rpc-address.youkuDfs.namenode1"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#a6e22e"><span style="color:#e6db74">""</span></span><span style="color:#f8f8f2">,</span> <span style="color:#a6e22e"><span style="color:#e6db74">"dfs.namenode.rpc-address.youkuDfs.namenode2"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#a6e22e"><span style="color:#e6db74">""</span></span><span style="color:#f8f8f2">,</span> <span style="color:#a6e22e"><span style="color:#e6db74">"dfs.client.failover.proxy.provider.testDfs"</span></span><span style="color:#f8f8f2">:</span> <span style="color:#a6e22e"><span style="color:#e6db74">"org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider"</span></span> <span style="color:#f8f8f2">}</span></code></span></span>
-
必選:否
-
預設值:無
-
-
minInputSplitSize
- 描述:Hadoop hdfs部分檔案型別支援檔案內部切分,這樣一個檔案可以被切分到多個mapper裡面併發執行,每個mapper讀取這個檔案的一部分。這邊測試環境驗證確實可以做到速度的 線性 擴充套件。注意:由於切分的粒度更細了,啟動mapper數量多可能佔用的機器資源也多一些。目前支援檔案內部切分的檔案型別有: rc、text、csv、parquet
- 必選:否
- 預設值:無限大
2.3 型別轉換
2.3.1 RCFile
如果使用者同步的hdfs檔案是rcfile,由於rcfile底層儲存的時候不同的資料型別儲存方式不一樣,而HdfsReader不支援對Hive元資料資料庫進行訪問查詢,因此需要使用者在column type裡指定該column在hive表中的資料型別,比如該column是bigint型。那麼type就寫為bigint,如果是double型,則填寫double,如果是float型,則填寫float。注意:如果是varchar或者char型別,則需要填寫位元組數,比如varchar(255),char(30)等,跟hive表中該欄位的型別保持一致,或者也可以填寫string型別。
如果column配置的是*,會讀取所有column,那麼datax會預設以string型別讀取所有column,此時要求column中的型別只能為String,CHAR,VARCHAR中的一種。
RCFile中的型別預設會轉成DataX支援的內部型別,對照表如下:
RCFile在Hive表中的資料型別 | DataX 內部型別 |
---|---|
TINYINT,SMALLINT,INT,BIGINT | Long |
FLOAT,DOUBLE,DECIMAL | Double |
String,CHAR,VARCHAR | String |
BOOLEAN | Boolean |
Date,TIMESTAMP | Date |
Binary | Binary |
2.3.2 ParquetFile
如果column配置的是*, 會讀取所有列; 此時Datax會預設以String型別讀取所有列. 如果列中出現Double等型別的話, 全部將轉換為String型別。如果column配置讀取特定的列的話, DataX中的型別和Parquet檔案型別的對應關係如下:
Parquet格式檔案的資料型別 | DataX 內部型別 |
---|---|
int32, int64, int96 | Long |
float, double | Double |
binary | Binary |
boolean | Boolean |
fixed_len_byte_array | String |
textfile,orcfile,sequencefile:
由於textfile和orcfile檔案表的元資料資訊由Hive維護並存放在Hive自己維護的資料庫(如mysql)中,目前HdfsReader不支援對Hive元資料資料庫進行訪問查詢,因此使用者在進行型別轉換的時候,必須指定資料型別,如果使用者配置的column為"*",則所有column預設轉換為string型別。HdfsReader提供了型別轉換的建議表如下:
DataX 內部型別 | Hive表 資料型別 |
---|---|
Long | TINYINT,SMALLINT,INT,BIGINT |
Double | FLOAT,DOUBLE |
String | String,CHAR,VARCHAR,STRUCT,MAP,ARRAY,UNION,BINARY |
Boolean | BOOLEAN |
相關推薦Hadoop遷移MaxCompute神器之DataX-On-Hadoop使用指南摘要: DataX-On-Hadoop即使用hadoop的任務排程器,將DataX task(Reader->Channel->Writer)排程到hadoop執行叢集上執行。這樣使用者的hadoop資料可以通過MR任務批量上傳到ODPS、RDS等,不需要使用者提 Apache Hadoop文件翻譯之三(使用者指南)目的 該文件是使用者使用Hadpoop分散式檔案系統(HDFS)的起點,不管是作為hadoop叢集的一部分來使用還是獨立的通用分散式檔案系統。雖然在很多場景下HDFS被設計成“正常工作”即可,但是掌握更多的HDFS工作機制將有利於更好的配置以及診斷。 概述 HD 理論與實踐:如何從Hadoop遷移到MaxCompute技術分享 直播視頻 插件 oss 使用 雲上 原來 令行 磁盤 摘要: MaxCompute大數據計算服務,能提供快速、完全托管的PB級數據倉庫解決方案,能夠使用戶經濟且高效地分析處理海量數據。而用戶往往之前使用了Hadoop實現大數據計算任務,在選擇了阿裏雲大數據計算服務 Hadoop資料遷移MaxCompute最佳實踐本文向您詳細介紹如何通過使用DataWorks資料同步功能,將Hadoop資料遷移到阿里雲MaxCompute大資料計算服務上。 1. 環境準備 1.1 Hadoop叢集搭建 本文使用的EMR Hadoop版本資訊如下: EMR版本: EMR-3.11.0 叢 全文索引-lucene,solr,nutch,hadoop之nutch與hadoopaof java get 查詢 自己 結構 目的 strong 之間 全文索引-lucene。solr。nutch,hadoop之lucene 全文索引-lucene。solr,nutch,hadoop之solr 我在去年的時候,就想把lucene,sol Hadoop源碼學習之HDFS(一)-a node bsp ima 數據 layout 版本號 name 技術 Hadoop的HDFS可以分為NameNode與DataNode,NameNode存儲所有DataNode中數據的元數據信息。而DataNode負責存儲真正的數據(數據塊)信息以及數據塊的ID。 hadoop入門學習系列之六hadoop學習之sqoop安裝1.7 sqoop安裝 opc 2.6 clas jdb -m -- error 1.下載安裝包及解壓 tar -zxvf sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz 2.配置環境變量和配置文件 cd 到 sqoop Cloudera Developer之Spark 及 Hadoop 開發員培訓(CCA-175)環境 課堂 nbsp 教材 vro tro 數據處理 操作 上海 學習如何將數據導入到 Apache Hadoop 機群並使用 Spark、Hive、Flume、Sqoop、Impala 及其他 Hadoop 生態系統工具對數據進行各種操作和處理分析。 詳情:https:/ Hive之 hive與hadoop的聯系ack create 交互 table ima ask str 數據信息 where Hive與Hadoop調用圖 解析: Hadoop(一)之初識大數據與Hadoophive 程序員 http 關系型數據庫 .com 邏輯 使用 alt clu 前言 從今天起,我將一步一步的分享大數據相關的知識,其實很多程序員感覺大數據很難學,其實並不是你想象的這樣,只要自己想學,還有什麽難得呢? 學習Hadoop有一個8020原則,80% Hadoop(一)之初識大數據與Hadoop【轉載】hba 無效 理解 組織 鼠標 掌握 能夠 through 2.3 原文地址:http://www.cnblogs.com/zhangyinhua/p/7647334.html 閱讀目錄(Content) 一、引言(大數據時代) 1.1、從數據中得到信息 1.2、大數據 SQL On Hadoop 設計的一個基本原則是:將計算任務移動到數據所在的節點而不是反過來介紹 計算性能 pan 之間 處理 arr 應用程序 sum span 3.1 數據本地化 SQL On Hadoop 設計的一個基本原則是:將計算任務移動到數據所在的節點而不是反過來。這主要出於網絡優化的目的,因為數據分布在不同的節點,如果移動數據那麽將會產生大量的低效的 hadoop mapreduce開發實踐之HDFS文件分發by streamingsubmit ast nap direct 如同 lis slots cal ado 1、分發HDFS文件(-cacheFile) 需求:wordcount(只統計指定的單詞),但是該文件非常大,可以先將該文件上傳到hdfs,通過-cacheFile的方式進行分發; -ca hadoop mapreduce開發實踐之HDFS壓縮文件(-cacheArchive)delete info dset odi .gz .tar.gz package cal 2.6.0 1、分發HDFS壓縮文件(-cacheArchive) 需求:wordcount(只統計指定的單詞【the,and,had...】),但是該文件存儲在HDFS上的壓縮文件, hadoop mapreduce開發實踐之輸出數據壓縮實踐 shuff file apr 存儲 壓縮 ras 最終 item 1、hadoop 輸出數據壓縮 1.1、為什麽要壓縮? 輸出數據較大時,使用hadoop提供的壓縮機制對數據進行壓縮,可以指定壓縮的方式。減少網絡傳輸帶寬和存儲的消耗; 可以對map的輸出進行壓縮(m Ubuntu搭建Hadoop的踩坑之旅(三)namenode 結束 ctu mapreduce 分布 使用 framework 2.6 start 之前的兩篇文章介紹了如何從0開始到搭建好帶有JDK的Ubuntu的過程,本來這篇文章是打算介紹搭建偽分布式集群的。但是後來想想反正偽分布式和完全分布式差不多,所幸直接介紹 4.Hadoop集群搭建之啟動urn 生成 狀態 CP data 其他 sla site 驗證 配置好Hadoop、HDFS、YARN、Zookeeper集群後,需要按照順序啟動。 前期準備 配置好Hadoop、HDFS、YARN、Zookeeper集群 先stop掉所有的hadoop服務 使用jp hadoop家族學習路線圖之hadoop產品介紹工作效率 快速 性能 pan 數據處理 sha lin pig win 大數據這個詞也許幾年前你聽著還會覺得陌生,但我相信你現在聽到hadoop這個詞的時候你應該都會覺得“熟悉”!越來越發現身邊從事hadoop開發或者是正在學習hadoop的人變多了。作為一個hadoop入 配置hadoop集群服務之二主機名 $path log dir log日誌 hadoop集群 filesyste 登陸 bad 1、配置多臺機器可以免密登陸: 步驟: (Tip:正常情況下authorized_keys應該同id_rsa.pub) 1)用ssh-keygen命令生成公匙 2)接著在Ma BigData--hadoop集群搭建之zookeer安裝其他 ron fault ntp time pro art 變量 tick Zookeeper安裝 cd /opt/ tar -zxvf zookeeper-3.4.10.tar.gzmv zookeeper-3.4.10 /opt/zookeeper修改配置文件cd / |