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