Hive資料來源為您提供讀取和寫入Hive雙向通道的功能,本文為您介紹DataWorks的Hive資料同步的能力支援情況。
背景資訊
Hive是基於Hadoop的資料倉儲工具,用於解決海量結構化日誌的資料統計。Hive可以將結構化的資料檔案映射為一張表,並提供SQL查詢功能。Hive的本質是一個SQL解析引擎,其底層通過MapReduce實現資料分析,使用HDFS儲存處理的資料,將HQL轉化為MapReduce程式並在Yarn上運行。
Hive Reader外掛程式通過訪問HiveMetastore服務,擷取您配置的資料表的中繼資料資訊。您可以基於HDFS檔案和Hive JDBC兩種方式讀取資料:
基於HDFS檔案讀取資料
Hive Reader外掛程式通過訪問HiveMetastore服務,解析出您配置的資料表的HDFS檔案儲存體路徑、檔案格式、分隔字元等資訊後,再通過讀取HDFS檔案的方式讀取Hive中的表資料。
基於Hive JDBC讀取資料
Hive Reader外掛程式通過Hive JDBC用戶端串連HiveServier2服務讀取資料。Hive Reader支援通過where條件過濾資料,並支援直接通過SQL讀取資料。
Hive Writer外掛程式通過訪問Hive Metastore服務,解析出您配置的資料表的HDFS檔案儲存體路徑、檔案格式和分隔字元等資訊。通過寫HDFS檔案的方式,將資料寫入到HDFS中,再通過Hive JDBC用戶端執行LOAD DATA SQL
語句,載入HDFS檔案中的資料至Hive表。
Hive Writer底層的邏輯和HDFS Writer外掛程式一致,您可以在Hive Writer外掛程式參數中配置HDFS Writer相關的參數,配置的參數會透傳給HDFS Writer外掛程式。
支援的版本
使用限制
Hive資料來源僅支援使用獨享Data Integration資源群組。
目前僅支援讀取TextFile、ORCFile和ParquetFile三種格式的檔案。
使用Data Integration向Hive叢集進行離線同步的過程中,會在服務端側產生臨時檔案,在同步任務執行完成時,會自動刪除。您需要留意服務端HDFS目錄檔案數限制,避免非預期的檔案數達到上限導致HDFS檔案系統不可用,DataWorks平台無法保障檔案數在HDFS目錄允許範圍內。
說明服務端可以通過修改dfs.namenode.fs-limits.max-directory-items參數,定義單個目錄下不含遞迴的最大目錄數或者檔案數,預設值1048576,取值範圍1~6400000。可以將HDFS的參數dfs.namenode.fs-limits.max-directory-items調大或者清理不需要的檔案以規避此問題。
訪問Hive資料來源時目前僅支援使用Kerberos身份認證方式,如果訪問資料來源時不需要進行身份認證,則新增資料來源時特殊認證方式選擇無。
在DataWorks使用Kerberos認證身份訪問Hive資料來源時,如果HiveServer2與metastore均開啟了kerberos認證,但是兩者認證的principal存在不一致時,需要在擴充參數配置項做如下配置:
{ "hive.metastore.kerberos.principal": "your metastore principal" }
支援的欄位類型
離線讀
類型分類 | Hive資料類型 |
字串類 | CHAR、VARCHAR、STRING |
整數類 | TINYINT、SMALLINT、INT、INTEGER、BIGINT |
浮點類 | FLOAT、DOUBLE、DECIMAL |
日期時間類 | TIMESTAMP、DATE |
布爾型 | BOOLEAN |
資料同步前準備
不同的資料來源配置模式,準備工作不同,具體如下:
阿里雲執行個體模式
如果您要同步此執行個體下的OSS表,請選擇對應的訪問身份,支援阿里雲主帳號,阿里雲子帳號及RAM角色三種訪問身份。請確保選擇的OSS訪問身份有對應的OSS許可權,否則資料同步會因為讀寫權限不足失敗。
測試連通性不會校正資料讀寫權限。
串連串模式
使用DLF的配置
如果您的Hive資料來源中繼資料管理方式使用的是DLF方式,您需要在配置Hive資料來源時擴充參數一欄中增加如下內容:
{"dlf.catalog.id" : "my_catalog_xxxx"}
其中my_catalog_xxxx
是您在EMR的Hive配置參數dlf.catalog.id
裡對應的名稱。
高可用HA配置
若您要同步的EMR Hive叢集開啟了高可用,您需要在配置Hive資料來源時擴充參數一欄,配置HA的相關資訊,格式如下。您可以在EMR控制台叢集服務頁面,擷取相關配置值。
{
//HA的相關配置樣本如下。
"dfs.nameservices":"testDfs",
"dfs.ha.namenodes.testDfs":"namenode1,namenode2",
"dfs.namenode.rpc-address.testDfs.namenode1": "",
"dfs.namenode.rpc-address.testDfs.namenode2": "",
"dfs.client.failover.proxy.provider.testDfs":"org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider"
//(可選)底層儲存為OSS時,需在擴充參數中配置以下串連OSS服務所需的參數。
"fs.oss.accessKeyId":"<yourAccessKeyId>",
"fs.oss.accessKeySecret":"<yourAccessKeySecret>",
"fs.oss.endpoint":"oss-cn-<yourRegion>-internal.aliyuncs.com"
}
OSS外表配置
當底層儲存為OSS時,請注意以下問題:
defaultFS的配置請以oss://為首碼。例如,
oss://bucketName
。若您要同步的表為OSS外表,您需要在配置Hive資料來源時擴充參數一欄配置OSS相關資訊。
{ "fs.oss.accessKeyId":"<yourAccessKeyId>", "fs.oss.accessKeySecret":"<yourAccessKeySecret>", "fs.oss.endpoint":"oss-cn-<yourRegion>-internal.aliyuncs.com" }
若您要同步的表為OSS-HDFS外表,您需要在配置Hive資料來源時擴充參數一欄配置OSS-HDFS的相關資訊。
{ "fs.oss.accessKeyId":"<yourAccessKeyId>", "fs.oss.accessKeySecret":"<yourAccessKeySecret>", "fs.oss.endpoint":"cn-<yourRegion>.oss-dls.aliyuncs.com" }
資料同步任務開發
Hive資料同步任務的配置入口和通用配置流程指導可參見下文的配置指導,詳細的配置參數解釋可在配置介面查看對應參數的文案提示。
建立資料來源
在進行資料同步任務開發時,您需要在DataWorks上建立一個對應的資料來源,操作流程請參見建立並管理資料來源。
單表離線同步任務配置指導
操作流程請參見通過嚮導模式配置離線同步任務、通過指令碼模式配置離線同步任務。
指令碼模式配置的全量參數和指令碼Demo請參見下文的附錄:指令碼Demo與參數說明。
整庫離線讀同步配置指導
操作流程請參見Data Integration側同步任務配置。
附錄:指令碼Demo與參數說明
附錄:離線任務指令碼配置方式
如果您配置離線任務時使用指令碼模式的方式進行配置,您需要在任務指令碼中按照指令碼的統一格式要求編寫指令碼中的reader參數和writer參數,指令碼模式的統一要求請參見通過指令碼模式配置離線同步任務,以下為您介紹指令碼模式下的資料來源的Reader參數和Writer參數的指導詳情。
Reader指令碼Demo
您可以基於HDFS檔案和Hive JDBC讀取資料:
基於HDFS檔案讀取資料
{ "type": "job", "steps": [ { "stepType": "hive", "parameter": { "partition": "pt1=a,pt2=b,pt3=c", //分區資訊 "datasource": "hive_not_ha_****", //資料來源名稱 "column": [ //需要讀取的欄位列 "id", "pt2", "pt1" ], "readMode": "hdfs", //讀取方式 "table": "part_table_1", "hdfsUsername" : "hdfs", "hivePartitionColumn": [ { "type": "string", "value": "分區名1" }, { "type": "string", "value": "分區名2" } ] }, "name": "Reader", "category": "reader" }, { "stepType": "hive", "parameter": { }, "name": "Writer", "category": "writer" } ], "version": "2.0", "order": { "hops": [ { "from": "Reader", "to": "Writer" } ] }, "setting": { "errorLimit": { "record": "" //錯誤記錄數 }, "speed": { "concurrent": 2, //作業並發數 "throttle": true,//當throttle值為false時,mbps參數不生效,表示不限流;當throttle值為true時,表示限流。 "mbps":"12"//限流 } } }
基於Hive JDBC讀取資料
{ "type": "job", "steps": [ { "stepType": "hive", "parameter": { "querySql": "select id,name,age from part_table_1 where pt2='B'", "datasource": "hive_not_ha_****", //資料來源名稱 "column": [ //需要讀取的欄位列 "id", "name", "age" ], "where": "", "table": "part_table_1", "readMode": "jdbc" //讀取方式 }, "name": "Reader", "category": "reader" }, { "stepType": "hive", "parameter": { }, "name": "Writer", "category": "writer" } ], "version": "2.0", "order": { "hops": [ { "from": "Reader", "to": "Writer" } ] }, "setting": { "errorLimit": { "record": "" }, "speed": { "concurrent": 2, //作業並發數 "throttle": true,//當throttle值為false時,mbps參數不生效,表示不限流;當throttle值為true時,表示限流。 "mbps":"12"//限流 } } }
Reader指令碼參數
參數 | 描述 | 是否必選 | 預設值 |
datasource | 資料來源名稱,必須與添加的資料來源名稱保持一致。 | 是 | 無 |
table | 表名,用於指定需要同步的表。 說明 請注意大小寫。 | 是 | 無 |
readMode | 讀取方式:
說明
| 否 | 無 |
partition | Hive表的分區資訊:
| 否 | 無 |
column | 需要讀取的欄位列,例如
| 是 | 無 |
querySql | 當您基於Hive JDBC方式讀取資料時,可以直接配置querySql讀取資料。 | 否 | 無 |
where | 當您基於Hive JDBC方式讀取資料時,可以通過設定where條件過濾資料。 | 否 | 無 |
hdfsUsername | 基於HDFS方式讀取資料,預設會用Hive資料來源頁面配置的使用者讀取,若資料來源頁面配置匿名登入,則會預設使用admin賬戶讀取資料,同步任務時如果出現許可權問題,需要轉指令碼預設配置hdfsUsername。 | 否 | 無 |
hivePartitionColumn | 若期望把分區欄位的值,同步到下遊,可以轉指令碼模式配置hivePartitionColumn參數。 | 否 | 無 |
Writer指令碼Demo
{
"type": "job",
"steps": [
{
"stepType": "hive",
"parameter": {
},
"name": "Reader",
"category": "reader"
},
{
"stepType": "hive",
"parameter": {
"partition": "year=a,month=b,day=c", // 分區配置
"datasource": "hive_ha_shanghai", // 資料來源
"table": "partitiontable2", // 目標表
"column": [ // 列配置
"id",
"name",
"age"
],
"writeMode": "append" ,// 寫入模式
"hdfsUsername" : "hdfs"
},
"name": "Writer",
"category": "writer"
}
],
"version": "2.0",
"order": {
"hops": [
{
"from": "Reader",
"to": "Writer"
}
]
},
"setting": {
"errorLimit": {
"record": ""
},
"speed": {
"throttle":true,//當throttle值為false時,mbps參數不生效,表示不限流;當throttle值為true時,表示限流。
"concurrent":2, //作業並發數。
"mbps":"12"//限流
}
}
}
Writer指令碼參數
參數 | 描述 | 是否必選 | 預設值 |
datasource | 資料來源名稱,必須與添加的資料來源名稱保持一致。 | 是 | 無 |
column | 需要寫出的欄位列,例如
| 是 | 無 |
table | 需要寫出的Hive表名。 說明 請注意大小寫。 | 是 | 無 |
partition | Hive表的分區資訊:
| 否 | 無 |
writeMode | Hive表資料的寫出模式。資料寫出至HDFS檔案後,Hive Writer外掛程式會執行 writeMode用於表示資料的載入行為:
說明 writeMode是高危參數,請您注意資料的寫出目錄和writeMode行為,避免誤刪資料。 載入資料行為需要配合hiveConfig使用,請注意您的配置。 | 是 | 無 |
hiveConfig | 您可以在hiveConfig中配置進一步的Hive擴充參數,包括hiveCommand、jdbcUrl、username和password:
| 是 | 無 |
hdfsUsername | 向Hive表寫資料時,預設會用Hive資料來源頁面配置的使用者寫入,若資料來源頁面配置匿名登入,則會預設使用admin賬戶寫入資料,同步任務時如果出現許可權問題,需要轉指令碼預設配置hdfsUsername。 | 否 | 無 |