DataWorks の Data Integration は、HDFS リーダーと HDFS ライターのプラグインを使用して、Hadoop 分散ファイルシステム (HDFS) に対するデータの読み取りと書き込みをサポートします。
Apsara File Storage for HDFS はサポート対象外です。
サポートされているファイル形式
|
プラグイン |
サポートされているフォーマット |
|
HDFS リーダー |
TextFile、ORCFile、RCFile、SequenceFile、CSV、Parquet |
|
HDFS ライター |
TextFile、ORCFile、Parquet |
リソースグループの要件
HDFS はデータセキュリティのためネットワークホワイトリストを使用しているため、デフォルトリソースグループでは HDFS NameNode および DataNode エンドポイントへの信頼性の高いネットワークアクセスが提供されません。HDFS 同期タスクには、サーバーレスリソースグループまたはデータ統合専用リソースグループを使用してください。
|
プラグイン |
対応リソースグループ |
|
HDFS Reader |
サーバーレスリソースグループ (推奨)、データ統合専用リソースグループ |
|
HDFS Writer |
データ統合専用リソースグループのみ |
制限事項
HDFS リーダー
-
内部のチャンク分割アルゴリズムのため、単一ファイル のマルチスレッドによる並列読み取りはサポートされていません。複数のファイルを指定した場合、HDFS リーダーはそれらを並列に読み取ります。実際のスレッド数は、ファイル数と
concurrent設定のいずれか小さい方の値になります。 -
HDFS リーダーは Hive のメタストアにアクセスできません。型変換時にデータ型を明示的に指定してください。
-
TextFile および ORCFile に格納された TIMESTAMP データはナノ秒精度です (例:
2015-08-21 22:40:47.397898389) 。date型に変換すると、ナノ秒部分が切り捨てられます。ナノ秒部分を保持するには、代わりに列をstring型にマッピングしてください。 -
コードエディタで HDFS の同期タスクを設定する場合、HDFS データソースへのネットワーク接続テストが成功する必要はありません。発生したエラーは無視してください。
-
Data Integration は
adminアカウントで実行されます。オペレーティングシステムのadminアカウントには、該当する HDFS ファイルへの読み取りおよび書き込み権限が必要です。権限がない場合は、コードエディタに切り替え、スクリプトに"hdfsUsername": "user_with_permissions"を追加してください。
HDFS ライター
-
サポートされているのは、TextFile、ORCFile、および Parquet 形式のみです。RCFile、SequenceFile、または CSV への書き込みはサポートされていません。
-
一部の列への書き込みはサポートされていません。HDFS はスキーマを持たないファイルシステムであるため、すべての列を指定する必要があります。
-
次の Hive データ型はサポートされていません: DECIMAL、BINARY、ARRAY、MAP、STRUCT、および UNION。
-
Hive のパーティションテーブルでは、単一パーティションへの書き込みのみがサポートされています。
-
TextFile の場合、書き込みに使用するフィールドデリミタは、Hive テーブルの作成時に使用したデリミタと一致させる必要があります。これにより、データを Hive テーブルのフィールドに関連付けることができます。
プラグインバージョンの互換性
HDFS リーダーと HDFS ライターは、Hive 1.1.1 および Hadoop 2.7.1 (Apache、リーダーは JDK 1.6 に、ライターは JDK 1.7 に対応) をベースに構築されています。これらのプラグインは、Hadoop 2.5.0、Hadoop 2.6.0、および Hive 1.2.0 でテスト済みです。
HDFS Writer の仕組み
HDFS Writer は、ファイルの競合を回避し、他のプロセスが部分的に書き込まれたファイルを読み取るのを防ぐために、書き込みとリネーム戦略を使用します。
-
指定されたパスに基づいて、
path_random命名規則を使用して HDFS 内に一時フォルダーを作成します。 -
すべてのファイルを一時フォルダーに書き込みます。
-
すべてのファイルの書き込みが完了したら、一時フォルダーから宛先パスにファイルを移動します。
-
一時フォルダーを削除します。
ステップ 2 またはステップ 3 でネットワーク中断または接続エラーが発生した場合は、一時フォルダーと書き込まれたファイルを手動で削除してください。
admin アカウントには、関連する HDFS ファイルに対する読み取りおよび書き込み権限が必要です。
対応フィールドタイプ
HDFS リーダーのタイプマッピング
デフォルトでは、HDFS リーダーは Hive データ型を、Data Integration の内部データ型に次のように変換します。
|
タイプカテゴリ |
Data Integration のデータ型 |
Hive データ型 |
|
整数 |
|
TINYINT、SMALLINT、INT、BIGINT |
|
浮動小数点 |
|
FLOAT、DOUBLE |
|
文字列 |
|
STRING、CHAR、VARCHAR、STRUCT、MAP、ARRAY、UNION、BINARY |
|
日時 |
|
DATE、タイムスタンプ |
|
ブール |
|
BOOLEAN |
特定のデータ型に関する注記:
-
long:HDFS ファイル内の整数値 (例:123456789)。 -
double:HDFS ファイル内の浮動小数点数 (例:3.1415)。 -
boolean:ブール値 (trueまたはfalse)。大文字と小文字を区別しません。 -
date:HDFS ファイル内の時刻値 (例:2014-12-31 00:00:00)。
HDFS ライターのタイプマッピング
HDFS ライターは、以下の Hive データ型をサポートしています。カラム設定は、Hive テーブルの対応するカラムのデータ型と一致させる必要があります。
|
タイプカテゴリ |
サポートする Hive データ型 |
|
整数 |
TINYINT、SMALLINT、INT、BIGINT |
|
浮動小数点 |
FLOAT、DOUBLE |
|
文字列 |
CHAR、VARCHAR、STRING |
|
ブール |
BOOLEAN |
|
日時 |
DATE、タイムスタンプ |
同期タスクの設定
単一テーブルのオフライン同期タスクを設定するには、次をご参照ください。
コードエディタのすべてのパラメーターとスクリプトのデモについては、付録:スクリプトのデモとパラメーターの説明をご参照ください。
付録:スクリプトのデモとパラメーターの説明
Reader スクリプトのデモ
次のスクリプトは、基本的な HDFS Reader の設定を示しています。すべての例では、datasource パラメーターを使用して、DataWorks で設定された HDFS データソースを参照します。
{
"type": "job",
"version": "2.0",
"steps": [
{
"stepType": "hdfs",
"parameter": {
"datasource": "",
"path": "",
"fileType": "",
"column": [
{
"index": 0,
"type": "string"
},
{
"index": 1,
"type": "long"
},
{
"index": 2,
"type": "double"
},
{
"index": 3,
"type": "boolean"
},
{
"index": 4,
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss"
}
],
"fieldDelimiter": ",",
"encoding": "UTF-8",
"hadoopConfig": {
"dfs.data.transfer.protection": "integrity",
"dfs.datanode.use.datanode.hostname": "true",
"dfs.client.use.datanode.hostname": "true"
}
},
"name": "Reader",
"category": "reader"
},
{
"stepType": "stream",
"parameter": {},
"name": "Writer",
"category": "writer"
}
],
"setting": {
"errorLimit": {
"record": ""
},
"speed": {
"concurrent": 3,
"throttle": true,
"mbps": "12"
}
},
"order": {
"hops": [
{
"from": "Reader",
"to": "Writer"
}
]
}
}
次の例は、parquetSchema を使用して HDFS Reader を設定し、Parquet ファイルを読み取る方法を示しています。fileType を parquet に設定し、完全なスキーマを指定します。column パラメーター内の index を使用して、必要な列を選択し、マッピングします。
"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",
"fileType": "parquet",
"encoding": "UTF-8",
"column": [
{
"index": 0,
"type": "string"
},
{
"index": 1,
"type": "long"
},
{
"index": 2,
"type": "double"
}
],
"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 のパラメーター
|
パラメーター |
説明 |
必須 |
デフォルト |
|
|
読み取るファイルのパス。静的パス、ワイルドカード、パーティションパスの詳細については、「読み取りパスの指定」をご参照ください。 |
はい |
なし |
|
|
HDFS NameNode のアドレス (例: |
はい |
なし |
|
|
ファイル形式: |
はい |
なし |
|
|
読み取る列のリスト。 |
はい |
なし |
|
|
TextFile データのフィールド区切り文字。ORCFile には不要です (Hive のデフォルトの区切り文字は |
いいえ |
|
|
|
ファイルエンコーディング。 |
いいえ |
|
|
|
null 値として解釈する文字列。たとえば、 |
いいえ |
なし |
|
|
CSV ファイルの圧縮形式。サポートされている値: |
いいえ |
なし |
|
|
|
いいえ |
なし |
|
|
CSV ファイルを読み取るための高度な設定 (Map 型)。設定しない場合は、デフォルト値が使用されます。「CSV リーダーの設定」をご参照ください。 |
いいえ |
なし |
|
|
HA 設定などの高度な Hadoop パラメーター。「Hadoop HA設定」をご参照ください。 |
いいえ |
なし |
|
|
Kerberos 認証が有効かどうか。 |
いいえ |
|
|
|
Kerberos キータブファイルの絶対パス。 |
いいえ |
なし |
|
|
Kerberos プリンシパル名 (例: |
いいえ |
なし |
読み取りパスの指定
path パラメーターは、3 つのアプローチをサポートしています:
-
オプション1:静的パス。単一のファイル、またはディレクトリ内のすべてのファイルを読み取ります。単一のファイルは 1 つのスレッドを使用します。例:
/user/hive/warehouse/mytable01/data.csv。 -
オプション 2: ワイルドカードパス — パターンに一致する複数のファイルを読み取ります。HDFS Reader は
*(任意の文字に一致) と?(単一の文字に一致) をサポートしています。例:/hadoop/data_201704*。実際のスレッド数は、一致するファイルの数とconcurrent設定のうち、小さい方の値になります。 -
オプション3:パーティションパス。Hive パーティションディレクトリからデータを読み取ります。Hive テーブルがパーティション付きで作成されると (例:
partition(day="20150820", hour="09"))、パーティションは HDFS 上でディレクトリ構造として表示されます。特定の日のすべてのデータを読み取るには、パスを次のように設定します:"path": "/user/hive/warehouse/mytable01/20150820/*"
データ統合では、同期タスク内のすべてのファイルが 1 つのテーブルとして扱われます。すべてのファイルは同じスキーマに準拠する必要があり、admin アカウントには、それらのファイルに対する読み取り権限が必要です。ファイル名が時間ベースのパターンに従っている場合は、スケジューリングパラメーター を使用して、業務時間に基づいてパスを動的に置き換えることができます。
ファイル形式の解析に関する注意事項
TextFile と ORCFile では、Hive の複雑なデータ型の解析方法が異なります。map 型の場合、ORCFile は {job=80, team=60} を生成しますが、TextFile は {job:80, team:60} を生成します。データは同じですが、形式が異なります。データに Hive の複雑なデータ型が含まれている場合は、パス全体で一貫したファイル形式を使用してください。形式を統一するには、Hive クライアントで TextFile テーブルを ORCFile にエクスポートします。
Parquet スキーマ形式
message MessageTypeName {
RequiredStatus DataType ColumnName;
...;
}
-
MessageTypeName:メッセージタイプの名前。
-
RequiredStatus: 非 null 列には
requiredを、null 許容列にはoptionalを使用します。すべての列をoptionalに設定します。 -
データ型: サポートされている型は
BOOLEAN、INT32、INT64、INT96、FLOAT、DOUBLE、BINARY(文字列型に使用します)、およびFIXED_LEN_BYTE_ARRAYです。 -
最後の列定義を含め、各列定義の末尾にセミコロンを付けます。
例:
"parquetSchema": "message m { optional int32 minute_id; optional int32 dsp_id; optional int64 req; optional double revenue; }"
CSV リーダーの設定
"csvReaderConfig": {
"safetySwitch": true,
"skipEmptyRecords": true,
"useTextQualifier": true
}
利用可能なすべてのフィールドとそのデフォルト値:
boolean caseSensitive = true;
char textQualifier = 34;
boolean trimWhitespace = true;
boolean useTextQualifier = true; // CSV エスケープ文字を使用するかどうか
char delimiter = 44; // 区切り文字
char recordDelimiter = 0;
char comment = 35;
boolean useComments = false;
int escapeMode = 1;
boolean safetySwitch = true; // 単一の列を 100,000 文字に制限するかどうか
boolean skipEmptyRecords = true; // 空の行をスキップするかどうか
boolean captureRawRecord = true;
Hadoop HA 設定
"hadoopConfig": {
"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",
"dfs.data.transfer.protection": "integrity",
"dfs.datanode.use.datanode.hostname": "true",
"dfs.client.use.datanode.hostname": "true"
}
dfs.data.transfer.protection、dfs.datanode.use.datanode.hostname、およびdfs.client.use.datanode.hostnameパラメーターは、HDFS Reader プラグインで Kerberos 認証を有効にします。 HDFS データソースで Kerberos 認証がすでに設定されている場合、これらのパラメーターはプラグイン設定では必要ありません。 詳細については、「HDFS データソースを設定する」をご参照ください。
Kerberos 設定の例
"haveKerberos": true,
"kerberosKeytabFilePath": "/opt/datax/**.keytab",
"kerberosPrincipal": "**/hadoopclient@**.**"
Kerberos はキータブファイルへの絶対パスを必要とするため、この設定をリソースグループにデプロイしてください。
Writer スクリプトのデモ
次のスクリプトは、基本的な HDFS Writer の設定を示しています。
{
"type": "job",
"version": "2.0",
"steps": [
{
"stepType": "stream",
"parameter": {},
"name": "Reader",
"category": "reader"
},
{
"stepType": "hdfs",
"parameter": {
"datasource": "",
"path": "",
"fileName": "",
"fileType": "text",
"column": [
{
"name": "col1",
"type": "string"
},
{
"name": "col2",
"type": "int"
},
{
"name": "col3",
"type": "double"
},
{
"name": "col4",
"type": "boolean"
},
{
"name": "col5",
"type": "date"
}
],
"writeMode": "",
"fieldDelimiter": ",",
"encoding": "UTF-8",
"compress": ""
},
"name": "Writer",
"category": "writer"
}
],
"setting": {
"errorLimit": {
"record": ""
},
"speed": {
"concurrent": 3,
"throttle": false
}
},
"order": {
"hops": [
{
"from": "Reader",
"to": "Writer"
}
]
}
}
Writer のパラメーター
|
パラメーター |
説明 |
必須 |
デフォルト |
|
|
HDFS の NameNode アドレス、たとえば |
はい |
なし |
|
|
出力ファイル形式: |
はい |
なし |
|
|
HDFS 内の宛先パスです。 HDFS Writer は、 |
はい |
なし |
|
|
出力ファイルのベースファイル名。各スレッドの実際のファイル名を作成するために、ランダムなサフィックスが追加されます。 |
はい |
なし |
|
|
書き込むフィールドのリスト。すべてのフィールド名 ( |
はい ( |
なし |
|
|
宛先パスに同じ |
はい |
なし |
|
|
出力ファイルのフィールド区切り文字です。Hive テーブルの作成時に使用した区切り文字と一致させる必要があります。そうでない場合、Hive でデータをクエリできません。単一文字の区切り文字のみがサポートされています。 |
はい ( |
なし |
|
|
出力ファイルの圧縮タイプです。テキストファイルでは、 |
いいえ |
なし |
|
|
出力ファイルのエンコーディング形式。 |
いいえ |
|
|
|
|
はい ( |
なし |
|
|
HA 設定などの高度な Hadoop パラメーターです。Reader の |
いいえ |
なし |
|
|
Parquet ファイルを同期するためのモードです。 |
いいえ |
|
|
|
Kerberos 認証が有効かどうか。 |
いいえ |
|
|
|
Kerberos keytab ファイルの絶対パス。 |
いいえ |
なし |
|
|
Kerberos プリンシパル名。 |
いいえ |
なし |
書き込みモード
HDFS Writer は、最初に一時フォルダーに書き込み、次にファイルを宛先パスに移動する「書き込みとリネーム」戦略を採用しています。writeMode パラメーターは、書き込みが開始される前に、同じ fileName プレフィックスを持つ既存のファイルがどのように処理されるかを制御します。
|
モード |
動作 |
|
|
書き込み前にクリーンアップは行いません。HDFS Writer は、競合をチェックせずにファイルを直接追加します。 |
|
|
宛先ディレクトリに |
|
|
書き込みの前に、宛先ディレクトリで |
Parquet フォーマットはappendモードをサポートしていません。Parquet ファイルにはnonConflictを使用してください。
OSS バックエンドの HDFS への書き込み
dataxParquetMode が fields の場合、HDFS Writer は基盤となるストレージとして OSS をサポートします。hadoopConfig に次の OSS パラメーターを追加します:
"writer": {
"name": "hdfswriter",
"parameter": {
"defaultFS": "oss://test-bucket",
"fileType": "parquet",
"path": "/datasets/oss_demo/kpt",
"fileName": "test",
"writeMode": "truncate",
"encoding": "UTF-8",
"hadoopConfig": {
"fs.oss.accessKeyId": "<your-access-key-id>",
"fs.oss.accessKeySecret": "<your-access-key-secret>",
"fs.oss.endpoint": "oss-cn-hangzhou.aliyuncs.com"
},
"parquetSchema": "message test {\n required int64 id;\n optional binary name (UTF8);\n optional int64 gmt_create;\n required group map_col (MAP) {\n repeated group key_value {\n required binary key (UTF8);\n required binary value (UTF8);\n }\n }\n required group array_col (LIST) {\n repeated group list {\n required binary element (UTF8);\n }\n }\n required group struct_col {\n required int64 id;\n required binary name (UTF8);\n }\n}",
"dataxParquetMode": "fields"
}
}
次のプレースホルダーを実際の値に置き換えてください:
|
プレースホルダー |
説明 |
|
|
OSS にアクセスするための AccessKey ID |
|
|
OSS にアクセスするための AccessKey シークレット |