HDFS數(shù)據(jù)源
HDFS是一個分布式文件系統(tǒng),為您提供讀取和寫入HDFS雙向通道的功能,本文為您介紹DataWorks的HDFS數(shù)據(jù)同步的能力支持情況。
支持的版本
目前不支持阿里云文件存儲HDFS版。
使用限制
離線讀
使用HDFS Reader時,請注意以下事項:
由于連通默認資源組到HDFS的網(wǎng)絡鏈路比較復雜,建議您使用Serverless資源組(推薦)和獨享數(shù)據(jù)集成資源組完成數(shù)據(jù)同步任務。您需要確保您的資源組具備HDFS的namenode和datanode的網(wǎng)絡訪問能力。
HDFS默認情況下,使用網(wǎng)絡白名單進行數(shù)據(jù)安全。基于此種情況,建議您使用Serverless資源組(推薦)和獨享數(shù)據(jù)集成資源組完成針對HDFS的數(shù)據(jù)同步任務。
您通過腳本模式配置HDFS同步作業(yè),并不依賴HDFS數(shù)據(jù)源網(wǎng)絡連通性測試通過,針對此類錯誤您可以臨時忽略。
數(shù)據(jù)集成同步進程以admin賬號啟動,您需要確保操作系統(tǒng)的admin賬號具備訪問相應HDFS文件的讀寫權限,若無權限,可以轉(zhuǎn)腳本模式,添加
"hdfsUsername": "有權限的用戶"
。
HDFS Reader支持以下功能:
支持TextFile、ORCFile、rcfile、sequence file、csv和parquet格式的文件,且要求文件內(nèi)容存放的是一張邏輯意義上的二維表。
支持多種類型數(shù)據(jù)讀取(使用String表示),支持列裁剪,支持列常量。
支持遞歸讀取、支持正則表達式
*
和?
。支持ORCFile數(shù)據(jù)壓縮,目前支持SNAPPY和ZLIB兩種壓縮方式。
支持SequenceFile數(shù)據(jù)壓縮,目前支持lZO壓縮方式。
多個File可以支持并發(fā)讀取。
CSV類型支持壓縮格式有gzip、bz2、zip、lzo、lzo_deflate和snappy。
目前插件中Hive版本為1.1.1,Hadoop版本為2.7.1(Apache適配JDK1.6],在Hadoop 2.5.0、Hadoop 2.6.0和Hive 1.2.0測試環(huán)境中寫入正常。
HDFS Reader暫不支持單個File多線程并發(fā)讀取,此處涉及到單個File內(nèi)部切分算法。
離線寫
使用HDFS Writer時,請注意以下事項:
目前HDFS Writer僅支持TextFile、ORCFile和ParquetFile三種格式的文件,且文件內(nèi)容存放的必須是一張邏輯意義上的二維表。
由于HDFS是文件系統(tǒng),不存在schema的概念,因此不支持對部分列寫入。
目前不支持DECIMAL、BINARY、ARRAYS、MAPS、STRUCTS和UNION等Hive數(shù)據(jù)類型。
對于Hive分區(qū)表目前僅支持一次寫入單個分區(qū)。
對于TextFile,需要保證寫入HDFS文件的分隔符與在Hive上創(chuàng)建表時的分隔符一致,從而實現(xiàn)寫入HDFS數(shù)據(jù)與Hive表字段關聯(lián)。
目前插件中的Hive版本為1.1.1,Hadoop版本為2.7.1(Apache為適配JDK1.7)。在Hadoop2.5.0、Hadoop2.6.0和Hive1.2.0測試環(huán)境中寫入正常。
HDFS Writer僅支持使用獨享數(shù)據(jù)集成資源組。
實現(xiàn)過程
HDFS Writer的實現(xiàn)過程如下所示:
根據(jù)您指定的path,創(chuàng)建一個HDFS文件系統(tǒng)上不存在的臨時目錄。
創(chuàng)建規(guī)則:path_隨機。
將讀取的文件寫入這個臨時目錄。
全部寫入后,將臨時目錄下的文件移動到您指定的目錄(在創(chuàng)建文件時保證文件名不重復)。
刪除臨時目錄。如果在此過程中,發(fā)生網(wǎng)絡中斷等情況造成無法與HDFS建立連接,需要您手動刪除已經(jīng)寫入的文件和臨時目錄。
數(shù)據(jù)同步需要使用Admin賬號,并且有訪問相應文件的讀寫權限。
支持的字段類型
離線讀
由于文件表的元數(shù)據(jù)信息由Hive維護,并存放在Hive自己維護的元數(shù)據(jù)庫(如MySQL)中。目前HDFS Reader不支持對Hive元數(shù)據(jù)的數(shù)據(jù)庫進行訪問查詢,因此您在進行類型轉(zhuǎn)換時,必須指定數(shù)據(jù)類型。
RCFile、ParquetFile、ORCFile、TextFile和SequenceFile中的類型,會默認轉(zhuǎn)為數(shù)據(jù)集成支持的內(nèi)部類型,如下表所示。
類型分類 | 數(shù)據(jù)集成column配置類型 | Hive數(shù)據(jù)類型 |
整數(shù)類 | long | tinyint、smallint、int和bigint |
浮點類 | double | float和double |
字符串類 | string | string、char、varchar、struct、map、array、union和binary |
日期時間類 | date | date和timestamp |
布爾類 | boolean | boolean |
long:HDFS文件中的整型類型數(shù)據(jù),例如123456789。
double:HDFS文件中的浮點類型數(shù)據(jù),例如3.1415。
bool:HDFS文件中的布爾類型數(shù)據(jù),例如true、false,不區(qū)分大小寫。
date:HDFS文件中的時間類型數(shù)據(jù),例如2014-12-31 00:00:00。
Hive支持的數(shù)據(jù)類型TIMESTAMP可以精確到納秒級別,所以TextFile、ORCFile中TIMESTAMP存放的數(shù)據(jù)類似于2015-08-21 22:40:47.397898389
。如果轉(zhuǎn)換的類型配置為數(shù)據(jù)集成的DATE,轉(zhuǎn)換之后會導致納秒部分丟失。所以如果需要保留納秒部分的數(shù)據(jù),請配置轉(zhuǎn)換類型為數(shù)據(jù)集成的字符串類型。
離線寫
HDFS Writer提供向HDFS文件系統(tǒng)指定路徑中寫入TextFile文件、 ORCFile文件以及ParquetFile格式文件,文件內(nèi)容可以與Hive中的表關聯(lián)。目前HDFS Writer支持大部分Hive類型,請注意檢查您的數(shù)據(jù)類型。
HDFS Writer針對Hive數(shù)據(jù)類型的轉(zhuǎn)換列表,如下所示。
column的配置需要和Hive表對應的列類型保持一致。
類型分類 | 數(shù)據(jù)庫數(shù)據(jù)類型 |
整數(shù)類 | TINYINT、SMALLINT、INT和BIGINT |
浮點類 | FLOAT和DOUBLE |
字符串類 | CHAR、VARCHAR和STRING |
布爾類 | BOOLEAN |
日期時間類 | DATE和TIMESTAMP |
創(chuàng)建數(shù)據(jù)源
在進行數(shù)據(jù)同步任務開發(fā)時,您需要在DataWorks上創(chuàng)建一個對應的數(shù)據(jù)源,操作流程請參見創(chuàng)建并管理數(shù)據(jù)源,詳細的配置參數(shù)解釋可在配置界面查看對應參數(shù)的文案提示。
數(shù)據(jù)同步任務開發(fā)
數(shù)據(jù)同步任務的配置入口和通用配置流程可參見下文的配置指導。
單表離線同步任務配置指導
操作流程請參見通過向?qū)J脚渲秒x線同步任務、通過腳本模式配置離線同步任務。
腳本模式配置的全量參數(shù)和腳本Demo請參見下文的附錄:腳本Demo與參數(shù)說明。
附錄:腳本Demo與參數(shù)說明
離線任務腳本配置方式
如果您配置離線任務時使用腳本模式的方式進行配置,您需要按照統(tǒng)一的腳本格式要求,在任務腳本中編寫相應的參數(shù),詳情請參見通過腳本模式配置離線同步任務,以下為您介紹腳本模式下數(shù)據(jù)源的參數(shù)配置詳情。
Reader腳本Demo
{
"type": "job",
"version": "2.0",
"steps": [
{
"stepType": "hdfs",//插件名
"parameter": {
"path": "",//要讀取的文件路徑
"datasource": "",//數(shù)據(jù)源
"hadoopConfig":{
"dfs.data.transfer.protection": "integrity",
"dfs.datanode.use.datanode.hostname" :"true",
"dfs.client.use.datanode.hostname":"true"
},
"column": [
{
"index": 0,//序列號,index從0開始(下標索引從0開始計數(shù)),表示從本地文本文件第一列開始讀取數(shù)據(jù)。
"type": "string"http://字段類型
},
{
"index": 1,
"type": "long"
},
{
"index": 2,
"type": "double"
},
{
"index": 3,
"type": "boolean"
},
{
"format": "yyyy-MM-dd HH:mm:ss", //日期格式
"index": 4,
"type": "date"
}
],
"fieldDelimiter": ",",//列分隔符
"encoding": "UTF-8",//編碼格式
"fileType": ""http://文本類型
},
"name": "Reader",
"category": "reader"
},
{
"stepType": "stream",
"parameter": {},
"name": "Writer",
"category": "writer"
}
],
"setting": {
"errorLimit": {
"record": ""http://錯誤記錄數(shù)
},
"speed": {
"concurrent": 3,//作業(yè)并發(fā)數(shù)
"throttle": true //當throttle值為false時,mbps參數(shù)不生效,表示不限流;當throttle值為true時,表示限流。
"mbps":"12"http://限流
}
},
"order": {
"hops": [
{
"from": "Reader",
"to": "Writer"
}
]
}
}
parquetSchema的HDFS Reader配置示例如下。
fileType配置項必須設置為parquet。
如果您要讀取parquet文件中的部分列,需在parquetSchema配置項中,指定完整schema結構信息,并在column中根據(jù)下標,篩選需要的同步列進行列映射。
"reader": {
"name": "hdfsreader",
"parameter": {
"path": "/user/hive/warehouse/addata.db/dw_ads_rtb_monitor_minute/thedate=20170103/hour_id=22/*",
"defaultFS": "h10s010.07100.149:8020",
"column": [
{
"index": 0,
"type": "string"
},
{
"index": 1,
"type": "long"
},
{
"index": 2,
"type": "double"
}
],
"fileType": "parquet",
"encoding": "UTF-8",
"parquetSchema": "message m { optional int32 minute_id; optional int32 dsp_id; optional int32 adx_pid; optional int64 req; optional int64 res; optional int64 suc; optional int64 imp; optional double revenue; }"
}
}
Reader腳本參數(shù)
參數(shù) | 描述 | 是否必選 | 默認值 |
path | 要讀取的文件路徑,如果要讀取多個文件,可以使用簡單正則表達式匹配,例如
請注意以下事項:
| 是 | 無 |
defaultFS | Hadoop HDFS文件系統(tǒng)namenode節(jié)點地址。公共資源組不支持Hadoop高級參數(shù)HA的配置。 | 是 | 無 |
fileType | 文件的類型,目前僅支持您配置為TEXT、ORC、RC、SEQ、CSV和parquet。HDFS Reader能夠自動識別文件的類型,并使用對應文件類型的讀取策略。HDFS Reader在做數(shù)據(jù)同步前,會檢查您配置的路徑下所有需要同步的文件格式是否和fileType一致,如果不一致任務會失敗。 fileType可以配置的參數(shù)值列表如下所示:
由于TextFile和ORCFile是兩種不同的文件格式,所以HDFS Reader對這兩種文件的解析方式也存在差異,這種差異導致Hive支持的復雜復合類型(例如map、array、struct和union)在轉(zhuǎn)換為數(shù)據(jù)集成支持的String類型時,轉(zhuǎn)換的結果格式略有差異,以map類型為例:
如上述轉(zhuǎn)換結果所示,數(shù)據(jù)本身沒有變化,但是表示的格式略有差異。所以如果您配置的文件路徑中要同步的字段在Hive中是復合類型的話,建議配置統(tǒng)一的文件格式 。 最佳實踐建議:
對于您指定的column信息,type必須填寫,index和value必須選擇其一。 | 是 | 無 |
column | 讀取字段列表,type指定源數(shù)據(jù)的類型,index指定當前列來自于文本第幾列(以0開始),value指定當前類型為常量。不從源頭文件讀取數(shù)據(jù),而是根據(jù)value值自動生成對應的列。默認情況下,您可以全部按照STRING類型讀取數(shù)據(jù),配置為 您也可以指定column字段信息(文件數(shù)據(jù)列和常量列配置二選一),配置如下。
說明
| 是 | 無 |
fieldDelimiter | 讀取的字段分隔符,HDFS Reader在讀取TextFile數(shù)據(jù)時,需要指定字段分割符,如果不指定默認為逗號(,)。HDFS Reader在讀取ORCFile時,您無需指定字段分割符,Hive本身的默認分隔符為\u0001。 說明
| 否 | , |
encoding | 讀取文件的編碼配置。 | 否 | utf-8 |
nullFormat | 文本文件中無法使用標準字符串定義null(空指針),數(shù)據(jù)集成提供nullFormat定義哪些字符串可以表示為null。 例如您配置 說明 字符串的null(n、u、l、l四個字符)和實際的null不同。 | 否 | 無 |
compress | 當fileType(文件類型)為csv下的文件壓縮方式,目前僅支持gzip、bz2、zip、lzo、lzo_deflate、hadoop-snappy和framing-snappy壓縮。 說明
| 否 | 無 |
parquetSchema | 如果您的文件格式類型為Parquet,在配置column配置項的基礎上,您還需配置parquetSchema,具體表示parquet存儲的類型說明。您需要確保填寫parquetSchema后,整體配置符合JSON語法。
parquetSchema的配置格式說明如下:
配置示例如下所示。
| 否 | 無 |
csvReaderConfig | 讀取CSV類型文件參數(shù)配置,Map類型。讀取CSV類型文件使用的CsvReader進行讀取,會有很多配置,不配置則使用默認值。 常見配置如下所示。
所有配置項及默認值,配置時csvReaderConfig的map中請嚴格按照以下字段名字進行配置。
| 否 | 無 |
hadoopConfig | hadoopConfig中可以配置與Hadoop相關的一些高級參數(shù),例如HA的配置。公共資源組不支持Hadoop高級參數(shù)HA的配置。
說明
上述參數(shù)為hdfs reader插件中配置的kerberos認證。如果您在HDFS數(shù)據(jù)源已經(jīng)配置了kerberos認證,則在hdfs reader插件中無需重復配置。配置HDFS數(shù)據(jù)源,詳情請參見配置HDFS數(shù)據(jù)源 | 否 | 無 |
haveKerberos | 是否有Kerberos認證,默認為false。例如用戶配置為true,則配置項kerberosKeytabFilePath和kerberosPrincipal為必填。 | 否 | false |
kerberosKeytabFilePath | Kerberos認證keytab文件的絕對路徑。如果haveKerberos為true,則必選。 | 否 | 無 |
kerberosPrincipal | Kerberos認證Principal名,如****/hadoopclient@**.*** 。如果haveKerberos為true,則必選。 說明 由于Kerberos需要配置keytab認證文件的絕對路徑,您需要在資源組上使用此功能。配置示例如下。
| 否 | 無 |
Writer腳本Demo
{
"type": "job",
"version": "2.0",//版本號。
"steps": [
{
"stepType": "stream",
"parameter": {},
"name": "Reader",
"category": "reader"
},
{
"stepType": "hdfs",//插件名。
"parameter": {
"path": "",//存儲到Hadoop HDFS文件系統(tǒng)的路徑信息。
"fileName": "",//HDFS Writer寫入時的文件名。
"compress": "",//HDFS文件壓縮類型。
"datasource": "",//數(shù)據(jù)源。
"column": [
{
"name": "col1",//字段名。
"type": "string"http://字段類型。
},
{
"name": "col2",
"type": "int"
},
{
"name": "col3",
"type": "double"
},
{
"name": "col4",
"type": "boolean"
},
{
"name": "col5",
"type": "date"
}
],
"writeMode": "",//寫入模式。
"fieldDelimiter": ",",//列分隔符。
"encoding": "",//編碼格式。
"fileType": "text"http://文本類型。
},
"name": "Writer",
"category": "writer"
}
],
"setting": {
"errorLimit": {
"record": ""http://錯誤記錄數(shù)。
},
"speed": {
"concurrent": 3,//作業(yè)并發(fā)數(shù)。
"throttle": false //false代表不限流,下面的限流的速度不生效;true代表限流。
}
},
"order": {
"hops": [
{
"from": "Reader",
"to": "Writer"
}
]
}
}
Writer腳本參數(shù)
參數(shù) | 描述 | 是否必選 | 默認值 |
defaultFS | Hadoop HDFS文件系統(tǒng)namenode節(jié)點地址,例如 | 是 | 無 |
fileType | 文件的類型,目前僅支持您配置為text、orc和parquet:
| 是 | 無 |
path | 存儲到Hadoop HDFS文件系統(tǒng)的路徑信息,HDFS Writer會根據(jù)并發(fā)配置在path目錄下寫入多個文件。 為了與Hive表關聯(lián),請?zhí)顚慔ive表在HDFS上的存儲路徑。例如Hive上設置的數(shù)據(jù)倉庫的存儲路徑為 | 是 | 無 |
fileName | HDFS Writer寫入時的文件名,實際執(zhí)行時會在該文件名后添加隨機的后綴作為每個線程寫入實際文件名。 | 是 | 無 |
column | 寫入數(shù)據(jù)的字段,不支持對部分列寫入。 為了與Hive中的表關聯(lián),需要指定表中所有字段名和字段類型,其中name指定字段名,type指定字段類型。 您可以指定column字段信息,配置如下。
| 是(如果filetype為parquet,此項無需填寫) | 無 |
writeMode | HDFS Writer寫入前數(shù)據(jù)清理處理模式:
說明 Parquet格式文件不支持Append,所以只能是noConflict。 | 是 | 無 |
fieldDelimiter | HDFS Writer寫入時的字段分隔符,需要您保證與創(chuàng)建的Hive表的字段分隔符一致,否則無法在Hive表中查到數(shù)據(jù)。 說明 僅支持單字符分隔符,如果輸入多字符將導致運行時報錯。 | 是(如果filetype為parquet,此項無需填寫) | 無 |
compress | HDFS文件壓縮類型,默認不填寫,則表示沒有壓縮。 其中text類型文件支持gzip和bzip2壓縮類型。 | 否 | 無 |
encoding | 寫文件的編碼配置。 | 否 | 無壓縮 |
parquetSchema | 寫Parquet格式文件時的必填項,用來描述目標文件的結構,所以此項當且僅當fileType為parquet時生效,格式如下。
配置項說明如下:
說明 每行列設置必須以分號結尾,最后一行也要寫上分號。 示例如下。
| 否 | 無 |
hadoopConfig | hadoopConfig中可以配置與Hadoop相關的一些高級參數(shù),例如HA的配置。公共資源組不支持Hadoop高級參數(shù)HA的配置,請新增和使用自定義數(shù)據(jù)集成資源組。
| 否 | 無 |
dataxParquetMode | 針對Parquet文件進行同步的模式。使用fields支持array、map和struct等復雜類型。可選值包括fields和columns。 配置dataxParquetMode為fields時,支持hdfs over oss,即HDFS的存儲為OSS,OSS的數(shù)據(jù)存儲格式為parquet。此時您可以在hadoopConfig中增加OSS相關的參數(shù),詳情如下:
訪問OSS的示例如下所示。
| 否 | columns |
haveKerberos | 是否有Kerberos認證,默認為false。如果您配置為true,則配置項kerberosKeytabFilePath和kerberosPrincipal為必填。 | 否 | false |
kerberosKeytabFilePath | Kerberos認證keytab文件的絕對路徑。 | 如果haveKerberos為true,則必選。 | 無 |
kerberosPrincipal | Kerberos認證Principal名,如****/hadoopclient@**.*** 。如果haveKerberos為true,則必選。 由于Kerberos需要配置keytab認證文件的絕對路徑,您需要在自定義資源組上使用此功能。配置示例如下。
| 否 | 無 |