1. 程式人生 > >Hadoop遷移MaxCompute神器之DataX-On-Hadoop使用指南

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>
  • 任務執行完成後,可以看到類似如下日誌:

297ebb78fb13ffd96a51f80702bc06ae0a74aca6

本例子的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條,含義不言自明。一個由於髒資料原因失敗的任務:

7dc22676d71cb17bfb04f41ff4ea2fa2745159fe

作業級別的效能引數配置位置示例:

<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支援的功能如下:

  1. 支援textfile、orcfile、rcfile、sequence file、csv和parquet格式的檔案,且要求檔案內容存放的是一張邏輯意義上的二維表。

  2. 支援多種型別資料讀取(使用String表示),支援列裁剪,支援列常量。

  3. 支援遞迴讀取、支援正則表示式("*"和"?")。

  4. 支援orcfile資料壓縮,目前支援SNAPPY,ZLIB兩種壓縮方式。

  5. 支援sequence file資料壓縮,目前支援lzo壓縮方式。

  6. 多個File可以支援併發讀取。

  7. csv型別支援壓縮格式有:gzip、bz2、zip、lzo、lzo_deflate、snappy。

我們暫時不能做到:

  1. 單個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,hadoopnutch與hadoop

aof 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 DeveloperSpark 及 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(一)初識大數據與Hadoop

hive 程序員 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 streaming

submit 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 /