HDFS是一個Distributed File System,為您提供讀取和寫入HDFS雙向通道的功能,本文為您介紹DataWorks的HDFS資料同步的能力支援情況。
支援的版本
目前不支援阿里雲Apsara File Storage for HDFS版。
使用限制
離線讀
使用HDFS Reader時,請注意以下事項:
由於連通預設資源群組到HDFS的網路鏈路比較複雜,建議您使用獨享Data Integration資源群組完成資料同步任務。您需要確保您的獨享Data Integration資源群組具備HDFS的namenode和datanode的網路訪問能力。
HDFS預設情況下,使用網路白名單進行資料安全。基於此種情況,建議您使用獨享Data Integration資源群組完成針對HDFS的資料同步任務。
您通過指令碼模式配置HDFS同步作業,並不依賴HDFS資料來源網路連通性測試通過,針對此類錯誤您可以臨時忽略。
Data Integration同步進程以admin帳號啟動,您需要確保作業系統的admin帳號具備訪問相應HDFS檔案的讀寫權限,若無許可權,可以轉指令碼模式,添加
"hdfsUsername": "有許可權的使用者"
。
HDFS Reader支援以下功能:
支援TextFile、ORCFile、rcfile、sequence file、csv和parquet格式的檔案,且要求檔案內容存放的是一張邏輯意義上的二維表。
支援多種類型資料讀取(使用String表示),支援列裁剪,支援列常量。
支援遞迴讀取、支援Regex
*
和?
。支援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僅支援使用獨享Data Integration資源群組。
實現過程
HDFS Writer的實現過程如下所示:
根據您指定的path,建立一個HDFS檔案系統上不存在的臨時目錄。
建立規則:path_隨機。
將讀取的檔案寫入這個臨時目錄。
全部寫入後,將臨時目錄下的檔案移動到您指定的目錄(在建立檔案時保證檔案名稱不重複)。
刪除臨時目錄。如果在此過程中,發生網路中斷等情況造成無法與HDFS建立串連,需要您手動刪除已經寫入的檔案和臨時目錄。
資料同步需要使用Admin帳號,並且有訪問相應檔案的讀寫權限。
支援的欄位類型
離線讀
由於檔案表的中繼資料資訊由Hive維護,並存放在Hive自己維護的中繼資料庫(如MySQL)中。目前HDFS Reader不支援對Hive中繼資料的資料庫進行訪問查詢,因此您在進行類型轉換時,必須指定資料類型。
RCFile、ParquetFile、ORCFile、TextFile和SequenceFile中的類型,會預設轉為Data Integration支援的內部類型,如下表所示。
類型分類 | Data Integrationcolumn配置類型 | 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
。如果轉換的類型配置為Data Integration的DATE,轉換之後會導致納秒部分丟失。所以如果需要保留納秒部分的資料,請配置轉換類型為Data Integration的字串類型。
離線寫
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 |
資料同步任務開發
HDFS資料同步任務的配置入口和通用配置流程指導可參見下文的配置指導,詳細的配置參數解釋可在配置介面查看對應參數的文案提示。
建立資料來源
在進行資料同步任務開發時,您需要在DataWorks上建立一個對應的資料來源,操作流程請參見建立並管理資料來源。
單表離線同步任務配置指導
操作流程請參見通過嚮導模式配置離線同步任務、通過指令碼模式配置離線同步任務。
指令碼模式配置的全量參數和指令碼Demo請參見下文的附錄:指令碼Demo與參數說明。
附錄:指令碼Demo與參數說明
附錄:離線任務指令碼配置方式
如果您配置離線任務時使用指令碼模式的方式進行配置,您需要在任務指令碼中按照指令碼的統一格式要求編寫指令碼中的reader參數和writer參數,指令碼模式的統一要求請參見通過指令碼模式配置離線同步任務,以下為您介紹指令碼模式下的資料來源的Reader參數和Writer參數的指導詳情。
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"//欄位類型
},
{
"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": ""//文本類型
},
"name": "Reader",
"category": "reader"
},
{
"stepType": "stream",
"parameter": {},
"name": "Writer",
"category": "writer"
}
],
"setting": {
"errorLimit": {
"record": ""//錯誤記錄數
},
"speed": {
"concurrent": 3,//作業並發數
"throttle": true //當throttle值為false時,mbps參數不生效,表示不限流;當throttle值為true時,表示限流。
"mbps":"12"//限流
}
},
"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 | 要讀取的檔案路徑,如果要讀取多個檔案,可以使用簡單Regex匹配,例如
請注意以下事項:
| 是 | 無 |
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)在轉換為Data Integration支援的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(null 指標),Data Integration提供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認證檔案的絕對路徑,您需要在獨享Data Integration資源群組上使用此功能。配置樣本如下。
| 否 | 無 |
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"//欄位類型。
},
{
"name": "col2",
"type": "int"
},
{
"name": "col3",
"type": "double"
},
{
"name": "col4",
"type": "boolean"
},
{
"name": "col5",
"type": "date"
}
],
"writeMode": "",//寫入模式。
"fieldDelimiter": ",",//資料行分隔符號。
"encoding": "",//編碼格式。
"fileType": "text"//文本類型。
},
"name": "Writer",
"category": "writer"
}
],
"setting": {
"errorLimit": {
"record": ""//錯誤記錄數。
},
"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的配置,請新增和使用自訂Data Integration資源群組。
| 否 | 無 |
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認證檔案的絕對路徑,您需要在自訂資源群組上使用此功能。配置樣本如下。
| 否 | 無 |