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