DataX系列7-HdfsReader介紹 一. 快速介紹 二. 功能與限制 三. 功能說明 參考:

一. 快速介紹

  HdfsReader提供了讀取分佈式文件系統數據存儲的能力。在底層實現上,HdfsReader獲取分佈式文件系統上文件的數據,並轉換爲DataX傳輸協議傳遞給Writer。

  目前HdfsReader支持的文件格式有textfile(text)、orcfile(orc)、rcfile(rc)、sequence file(seq)和普通邏輯二維表(csv)類型格式的文件,且文件內容存放的必須是一張邏輯意義上的二維表。

  HdfsReader需要Jdk1.7及以上版本的支持。

二. 功能與限制

  HdfsReader實現了從Hadoop分佈式文件系統Hdfs中讀取文件數據並轉爲DataX協議的功能。textfile是Hive建表時默認使用的存儲格式,數據不做壓縮,本質上textfile就是以文本的形式將數據存放在hdfs中,對於DataX而言,HdfsReader實現上類比TxtFileReader,有諸多相似之處。orcfile,它的全名是Optimized Row Columnar file,是對RCFile做了優化。據官方文檔介紹,這種文件格式可以提供一種高效的方法來存儲Hive數據。HdfsReader利用Hive提供的OrcSerde類,讀取解析orcfile文件的數據。

目前HdfsReader支持的功能如下:

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

  2. 支持多種類型數據讀取(使用String表示),支持列裁剪,支持列常量

  3. 支持遞歸讀取、支持正則表達式("*"和"?")。

  4. 支持orcfile數據壓縮,目前支持SNAPPY,ZLIB兩種壓縮方式。

  5. 多個File可以支持併發讀取。

  6. 支持sequence file數據壓縮,目前支持lzo壓縮方式。

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

  8. 目前插件中Hive版本爲1.1.1,Hadoop版本爲2.7.1(Apache[爲適配JDK1.7],在Hadoop 2.5.0, Hadoop 2.6.0 和Hive 1.2.0測試環境中寫入正常;其它版本需後期進一步測試;

  9. 支持kerberos認證(注意:如果用戶需要進行kerberos認證,那麼用戶使用的Hadoop集羣版本需要和hdfsreader的Hadoop版本保持一致,如果高於hdfsreader的Hadoop版本,不保證kerberos認證有效)

我們暫時不能做到:

  1. 單個File支持多線程併發讀取,這裏涉及到單個File內部切分算法。二期考慮支持。
    目前還不支持hdfs HA;

三. 功能說明

3.1 配置樣例

{
    "job": {
        "setting": {
            "speed": {
                "channel": 3
            }
        },
        "content": [
            {
                "reader": {
                    "name": "hdfsreader",
                    "parameter": {
                        "path": "/user/hive/warehouse/mytable01/*",
                        "defaultFS": "hdfs://xxx:port",
                        "column": [
                               {
                                "index": 0,
                                "type": "long"
                               },
                               {
                                "index": 1,
                                "type": "boolean"
                               },
                               {
                                "type": "string",
                                "value": "hello"
                               },
                               {
                                "index": 2,
                                "type": "double"
                               }
                        ],
                        "fileType": "orc",
                        "encoding": "UTF-8",
                        "fieldDelimiter": ","
                    }

                },
                "writer": {
                    "name": "streamwriter",
                    "parameter": {
                        "print": true
                    }
                }
            }
        ]
    }
}

3.2 參數說明(各個配置項值前後不允許有空格)

3.2.1 path

  • 描述:要讀取的文件路徑,如果要讀取多個文件,可以使用正則表達式"",注意這裏可以支持填寫多個路徑。
    當指定單個Hdfs文件,HdfsReader暫時只能使用單線程進行數據抽取。二期考慮在非壓縮文件情況下針對單個File可以進行多線程併發讀取。
    當指定多個Hdfs文件,HdfsReader支持使用多線程進行數據抽取。線程併發數通過通道數指定。
    當指定通配符,HdfsReader嘗試遍歷出多個文件信息。例如: 指定/代表讀取/目錄下所有的文件,指定/bazhen/
    代表讀取bazhen目錄下游所有的文件。HdfsReader目前只支持""和"?"作爲文件通配符。
    特別需要注意的是,DataX會將一個作業下同步的所有的文件視作同一張數據表。用戶必須自己保證所有的File能夠適配同一套schema信息。並且提供給DataX權限可讀。

  • 必選:是

  • 默認值:無

3.2.2 defaultFS

  • 描述:Hadoop hdfs文件系統namenode節點地址。
    目前HdfsReader已經支持Kerberos認證,如果需要權限認證,則需要用戶配置kerberos參數,見下面

  • 必選:是

  • 默認值:無

3.2.3 fileType

  • 描述:文件的類型,目前只支持用戶配置爲"text"、"orc"、"rc"、"seq"、"csv"。
    text表示textfile文件格式
    orc表示orcfile文件格式
    rc表示rcfile文件格式
    seq表示sequence file文件格式
    csv表示普通hdfs文件格式(邏輯二維表)
      特別需要注意的是,HdfsReader能夠自動識別文件是orcfile、textfile或者還是其它類型的文件,但該項是必填項,HdfsReader則會只讀取用戶配置的類型的文件,忽略路徑下其他格式的文件
      另外需要注意的是,由於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格式的表

  • 必選:是

  • 默認值:無

3.2.4 column

  • 描述:讀取字段列表,type指定源數據的類型,index指定當前列來自於文本第幾列(以0開始),value指定當前類型爲常量,不從源頭文件讀取數據,而是根據value值自動生成對應的列。
    默認情況下,用戶可以全部按照String類型讀取數據,配置如下:

    "column": ["*"]
    用戶可以指定Column字段信息,配置如下:
    { "type": "long", "index": 0 //從本地文件文本第一列獲取int字段 }, { "type": "string", "value": "alibaba" //HdfsReader內部生成alibaba的字符串字段作爲當前字段 } ```

    對於用戶指定Column信息,type必須填寫,index/value必須選擇其一。

  • 必選:是 <br />

  • 默認值:全部按照string類型讀取 <br />

3.2.5 fieldDelimiter

  • 描述:讀取的字段分隔符
    另外需要注意的是,HdfsReader在讀取textfile數據時,需要指定字段分割符,如果不指定默認爲',',HdfsReader在讀取orcfile時,用戶無需指定字段分割符

  • 必選:否

  • 默認值:,

3.2.6 encoding

  • 描述:讀取文件的編碼配置。

  • 必選:否

  • 默認值:utf-8

3.2.7 nullFormat

  • 描述:文本文件中無法使用標準字符串定義null(空指針),DataX提供nullFormat定義哪些字符串可以表示爲null。
    例如如果用戶配置: nullFormat:"\N",那麼如果源頭數據是"\N",DataX視作null字段。

  • 必選:否

  • 默認值:無

3.2.8 haveKerberos

  • 描述:是否有Kerberos認證,默認false
    例如如果用戶配置true,則配置項kerberosKeytabFilePath,kerberosPrincipal爲必填。

  • 必選:haveKerberos 爲true必選

  • 默認值:false

3.2.9 kerberosKeytabFilePath

  • 描述:Kerberos認證 keytab文件路徑,絕對路徑

  • 必選:否

  • 默認值:無

3.2.10 kerberosPrincipal

  • 描述:Kerberos認證Principal名,如xxxx/[email protected]

  • 必選:haveKerberos 爲true必選

  • 默認值:無

3.2.11 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文件類型下無需填寫。

  • 必選:否

  • 默認值:無

3.2.12 hadoopConfig

  • 描述:hadoopConfig裏可以配置與Hadoop相關的一些高級參數,比如HA的配置。
 "hadoopConfig":{
         "dfs.nameservices": "testDfs",
         "dfs.ha.namenodes.testDfs": "namenode1,namenode2",
         "dfs.namenode.rpc-address.aliDfs.namenode1": "",
         "dfs.namenode.rpc-address.aliDfs.namenode2": "",
         "dfs.client.failover.proxy.provider.testDfs": "org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider"
 }
  • 必選:否

  • 默認值:無

3.2.13 csvReaderConfig

  • 描述:讀取CSV類型文件參數配置,Map類型。讀取CSV類型文件使用的CsvReader進行讀取,會有很多配置,不配置則使用默認值。

  • 必選:否

  • 默認值:無

常見配置:

"csvReaderConfig":{
        "safetySwitch": false,
        "skipEmptyRecords": false,
        "useTextQualifier": false
}

所有配置項及默認值,配置時 csvReaderConfig 的map中請嚴格按照以下字段名字進行配置:

boolean caseSensitive = true;
char textQualifier = 34;
boolean trimWhitespace = true;
boolean useTextQualifier = true;//是否使用csv轉義字符
char delimiter = 44;//分隔符
char recordDelimiter = 0;
char comment = 35;
boolean useComments = false;
int escapeMode = 1;
boolean safetySwitch = true;//單列長度是否限制100000字符
boolean skipEmptyRecords = true;//是否跳過空行
boolean captureRawRecord = true;

3.3 類型轉換

  由於textfile和orcfile文件表的元數據信息由Hive維護並存放在Hive自己維護的數據庫(如mysql)中,目前HdfsReader不支持對Hive元數據數據庫進行訪問查詢,因此用戶在進行類型轉換的時候,必須指定數據類型,如果用戶配置的column爲"*",則所有column默認轉換爲string類型。HdfsReader提供了類型轉換的建議表如下:


其中:

  1. Long是指Hdfs文件文本中使用整形的字符串表示形式,例如"123456789"。
  2. Double是指Hdfs文件文本中使用Double的字符串表示形式,例如"3.1415"。
  3. Boolean是指Hdfs文件文本中使用Boolean的字符串表示形式,例如"true"、"false"。不區分大小寫。
  4. Date是指Hdfs文件文本中使用Date的字符串表示形式,例如"2014-12-31"。

特別提醒:
Hive支持的數據類型TIMESTAMP可以精確到納秒級別,所以textfile、orcfile中TIMESTAMP存放的數據類似於"2015-08-21 22:40:47.397898389",如果轉換的類型配置爲DataX的Date,轉換之後會導致納秒部分丟失,所以如果需要保留納秒部分的數據,請配置轉換類型爲DataX的String類型。

3.4 按分區讀取

  Hive在建表的時候,可以指定分區partition,例如創建分區partition(day="20150820",hour="09"),對應的hdfs文件系統中,相應的表的目錄下則會多出/20150820和/09兩個目錄,且/20150820是/09的父目錄。瞭解了分區都會列成相應的目錄結構,在按照某個分區讀取某個表所有數據時,則只需配置好json中path的值即可。

  比如需要讀取表名叫mytable01下分區day爲20150820這一天的所有數據,則配置如下:

"path": "/user/hive/warehouse/mytable01/20150820/*"

參考:

  1. https://github.com/alibaba/DataX/blob/master/hdfsreader/doc/hdfsreader.md
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章