Data Integration di DataWorks mendukung pembacaan dari dan penulisan ke Hadoop Distributed File System (HDFS) melalui plugin HDFS Reader dan HDFS Writer.
Apsara File Storage for HDFS tidak didukung.
Format file yang didukung
|
Plugin |
Format yang didukung |
|
HDFS Reader |
TextFile, ORCFile, RCFile, SequenceFile, CSV, Parquet |
|
HDFS Writer |
TextFile, ORCFile, Parquet |
Persyaratan kelompok sumber daya
HDFS menggunakan daftar putih jaringan untuk keamanan data, dan kelompok sumber daya default tidak menyediakan akses jaringan yang andal ke titik akhir HDFS NameNode dan DataNode. Gunakan serverless resource group atau exclusive resource group for Data Integration untuk tugas sinkronisasi HDFS.
|
Plugin |
Kelompok sumber daya yang didukung |
|
HDFS Reader |
Serverless resource group (direkomendasikan), exclusive resource group for Data Integration |
|
HDFS Writer |
Kelompok sumber daya eksklusif hanya untuk Data Integration |
Batasan
HDFS Reader
-
Pembacaan konkuren multi-thread pada file tunggal tidak didukung karena algoritma chunking internal. Saat beberapa file ditentukan, HDFS Reader membacanya secara konkuren—jumlah thread aktual adalah nilai terkecil antara jumlah file dan pengaturan
concurrent. -
HDFS Reader tidak dapat mengakses metastore Hive. Tentukan tipe data secara eksplisit selama konversi tipe.
-
Data TIMESTAMP yang disimpan dalam TextFile dan ORCFile memiliki presisi hingga nanodetik (misalnya,
2015-08-21 22:40:47.397898389). Mengonversinya ke tipedateakan menghilangkan bagian nanodetik. Untuk mempertahankannya, petakan kolom tersebut ke tipestringsebagai gantinya. -
Saat mengonfigurasi tugas sinkronisasi HDFS di editor kode, tugas tersebut tidak memerlukan pengujian konektivitas jaringan yang berhasil untuk sumber data HDFS. Abaikan kesalahan yang muncul.
-
Integrasi Data berjalan di bawah akun
admin. Akunadminsistem operasi harus memiliki izin baca dan tulis pada file HDFS terkait. Jika tidak, beralihlah ke editor kode dan tambahkan"hdfsUsername": "user_with_permissions"ke skrip.
HDFS Writer
-
Hanya format TextFile, ORCFile, dan Parquet yang didukung. Menulis ke RCFile, SequenceFile, atau CSV tidak didukung.
-
Menulis ke subset kolom tidak didukung. Karena HDFS adalah sistem file tanpa skema, semua kolom harus ditentukan.
-
Tipe data Hive berikut tidak didukung: DECIMAL, BINARY, ARRAY, MAP, STRUCT, dan UNION.
-
Untuk tabel partisi Hive, hanya penulisan satu partisi yang didukung.
-
Untuk TextFile, delimiter bidang yang digunakan untuk menulis harus sesuai dengan delimiter yang digunakan saat tabel Hive dibuat, agar data dapat dikaitkan dengan bidang tabel Hive.
Kompatibilitas versi plugin
HDFS Reader dan HDFS Writer dibangun di atas Hive 1.1.1 dan Hadoop 2.7.1 (Apache, disesuaikan untuk JDK 1.6 untuk Reader dan JDK 1.7 untuk Writer). Plugin ini telah diuji dengan Hadoop 2.5.0, Hadoop 2.6.0, dan Hive 1.2.0.
Cara kerja HDFS Writer
HDFS Writer menggunakan strategi write-and-rename untuk menghindari konflik file dan mencegah proses lain membaca file yang belum selesai ditulis:
-
Membuat folder sementara di HDFS berdasarkan path yang ditentukan, menggunakan aturan penamaan
path_random. -
Menulis semua file ke folder sementara.
-
Setelah semua file ditulis, memindahkannya dari folder sementara ke jalur tujuan.
-
Menghapus folder sementara.
Jika terjadi gangguan jaringan atau kesalahan koneksi selama langkah 2 atau 3, hapus secara manual folder sementara dan file apa pun yang telah ditulis.
Akun admin harus memiliki izin baca dan tulis pada file HDFS terkait.
Tipe bidang yang didukung
Pemetaan tipe HDFS Reader
Secara default, HDFS Reader mengonversi tipe data Hive ke tipe internal Integrasi Data sebagai berikut:
|
Kategori tipe |
Tipe Integrasi Data |
Tipe data Hive |
|
Integer |
|
TINYINT, SMALLINT, INT, BIGINT |
|
Floating-point |
|
FLOAT, DOUBLE |
|
String |
|
STRING, CHAR, VARCHAR, STRUCT, MAP, ARRAY, UNION, BINARY |
|
Date/Time |
|
DATE, TIMESTAMP |
|
Boolean |
|
BOOLEAN |
Catatan tentang tipe tertentu:
-
`long`: Nilai integer dalam file HDFS, seperti
123456789. -
`double`: Nilai floating-point dalam file HDFS, seperti
3.1415. -
`boolean`: Nilai Boolean (
trueataufalse). Tidak peka huruf besar/kecil. -
`date`: Nilai waktu dalam file HDFS, seperti
2014-12-31 00:00:00.
Pemetaan tipe HDFS Writer
HDFS Writer mendukung tipe data Hive berikut. Konfigurasi kolom harus sesuai dengan tipe kolom yang sesuai di tabel Hive.
|
Kategori tipe |
Tipe data Hive yang didukung |
|
Integer |
TINYINT, SMALLINT, INT, BIGINT |
|
Floating-point |
FLOAT, DOUBLE |
|
String |
CHAR, VARCHAR, STRING |
|
Boolean |
BOOLEAN |
|
Date/Time |
DATE, TIMESTAMP |
Konfigurasi tugas sinkronisasi
Untuk mengonfigurasi tugas sinkronisasi offline tabel tunggal, lihat:
Untuk semua parameter dan contoh skrip untuk editor kode, lihat Lampiran: Demo skrip dan deskripsi parameter.
Lampiran: Demo skrip dan deskripsi parameter
Demo skrip Reader
Skrip berikut menunjukkan konfigurasi dasar HDFS Reader. Semua contoh menggunakan parameter datasource untuk mereferensikan sumber data HDFS yang dikonfigurasi di DataWorks.
{
"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"
}
]
}
}
Contoh berikut menunjukkan cara mengonfigurasi HDFS Reader untuk membaca file Parquet menggunakan parquetSchema. Atur fileType ke parquet dan tentukan skema lengkapnya. Gunakan index dalam parameter column untuk memilih dan memetakan kolom yang diperlukan.
"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; }"
}
}
Parameter Reader
|
Parameter |
Deskripsi |
Wajib |
Default |
|
|
Jalur file yang akan dibaca. Lihat Menentukan jalur baca untuk detail mengenai jalur statis, wildcard, dan jalur partisi. |
Ya |
Tidak ada |
|
|
Alamat HDFS NameNode, misalnya, |
Ya |
Tidak ada |
|
|
Format file: |
Ya |
Tidak ada |
|
|
Daftar kolom yang akan dibaca. |
Ya |
Tidak ada |
|
|
Delimiter bidang untuk data TextFile. Tidak diperlukan untuk ORCFile (delimiter default Hive adalah |
Tidak |
|
|
|
Encoding file. |
Tidak |
|
|
|
String yang diinterpretasikan sebagai nilai null. Misalnya, mengatur |
Tidak |
Tidak ada |
|
|
Format kompresi untuk file CSV. Nilai yang didukung: |
Tidak |
Tidak ada |
|
|
Diperlukan ketika |
Tidak |
Tidak ada |
|
|
Konfigurasi lanjutan untuk membaca file CSV (tipe Map). Jika tidak diatur, nilai default akan digunakan. Lihat Konfigurasi reader CSV. |
Tidak |
Tidak ada |
|
|
Parameter Hadoop lanjutan, seperti konfigurasi HA. Lihat Konfigurasi HA Hadoop. |
Tidak |
Tidak ada |
|
|
Apakah autentikasi Kerberos diaktifkan. Jika |
Tidak |
|
|
|
Jalur mutlak file keytab Kerberos. Wajib jika |
Tidak |
Tidak ada |
|
|
Nama principal Kerberos, seperti |
Tidak |
Tidak ada |
Menentukan jalur baca
Parameter path mendukung tiga pendekatan:
-
Opsi 1: Jalur statis — Membaca satu file atau semua file dalam direktori. Satu file menggunakan satu thread. Contoh:
/user/hive/warehouse/mytable01/data.csv. -
Opsi 2: Jalur wildcard — Membaca beberapa file yang cocok dengan pola. HDFS Reader mendukung
*(mencocokkan karakter apa pun) dan?(mencocokkan satu karakter). Contoh:/hadoop/data_201704*. Jumlah thread aktual adalah nilai terkecil antara jumlah file yang cocok dan pengaturanconcurrent. -
Opsi 3: Jalur partisi — Membaca data dari direktori partisi Hive. Saat tabel Hive dibuat dengan partisi (misalnya,
partition(day="20150820", hour="09")), partisi tersebut muncul sebagai struktur direktori di HDFS. Untuk membaca semua data untuk hari tertentu, atur jalurnya sebagai berikut:"path": "/user/hive/warehouse/mytable01/20150820/*"
Integrasi Data memperlakukan semua file dalam tugas sinkronisasi sebagai satu tabel. Semua file harus mengikuti skema yang sama, dan akun admin harus memiliki izin baca pada file-file tersebut. Jika nama file mengikuti pola berbasis waktu, gunakan parameter penjadwalan untuk mengganti jalur secara dinamis berdasarkan Waktu bisnis.
Catatan penguraian format file
TextFile dan ORCFile mengurai tipe Hive kompleks secara berbeda. Untuk tipe map, ORCFile menghasilkan {job=80, team=60} sedangkan TextFile menghasilkan {job:80, team:60}. Datanya sama, tetapi formatnya berbeda. Jika data Anda mencakup tipe Hive kompleks, gunakan format file yang konsisten di seluruh jalur. Untuk menyatukan format, ekspor tabel TextFile ke ORCFile di klien Hive.
Format skema Parquet
message MessageTypeName {
RequiredStatus DataType ColumnName;
...;
}
-
MessageTypeName: Nama untuk tipe pesan.
-
RequiredStatus: Gunakan
requireduntuk kolom non-null danoptionaluntuk kolom nullable. Atur semua kolom keoptional. -
DataType: Tipe yang didukung adalah
BOOLEAN,INT32,INT64,INT96,FLOAT,DOUBLE,BINARY(gunakan untuk tipe string), danFIXED_LEN_BYTE_ARRAY. -
Akhiri setiap definisi kolom dengan titik koma, termasuk yang terakhir.
Contoh:
"parquetSchema": "message m { optional int32 minute_id; optional int32 dsp_id; optional int64 req; optional double revenue; }"
Konfigurasi reader CSV
"csvReaderConfig": {
"safetySwitch": false,
"skipEmptyRecords": false,
"useTextQualifier": false
}
Semua field yang tersedia dan nilai default-nya:
boolean caseSensitive = true;
char textQualifier = 34;
boolean trimWhitespace = true;
boolean useTextQualifier = true; // Apakah akan menggunakan karakter escape CSV
char delimiter = 44; // Pemisah
char recordDelimiter = 0;
char comment = 35;
boolean useComments = false;
int escapeMode = 1;
boolean safetySwitch = true; // Apakah membatasi satu kolom hingga 100.000 karakter
boolean skipEmptyRecords = true; // Apakah melewati baris kosong
boolean captureRawRecord = true;
Konfigurasi HA Hadoop
"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"
}
Parameterdfs.data.transfer.protection,dfs.datanode.use.datanode.hostname, dandfs.client.use.datanode.hostnamemengaktifkan autentikasi Kerberos di plugin HDFS Reader. Jika autentikasi Kerberos sudah dikonfigurasi pada sumber data HDFS, parameter ini tidak diperlukan dalam konfigurasi plugin. Lihat Konfigurasi sumber data HDFS.
Contoh konfigurasi Kerberos
"haveKerberos": true,
"kerberosKeytabFilePath": "/opt/datax/**.keytab",
"kerberosPrincipal": "**/hadoopclient@**.**"
Karena Kerberos memerlukan jalur mutlak ke file keytab, deploy konfigurasi ini pada kelompok sumber daya.
Demo skrip Writer
Skrip berikut menunjukkan konfigurasi dasar 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"
}
]
}
}
Parameter Writer
|
Parameter |
Deskripsi |
Wajib |
Default |
|
|
Alamat NameNode untuk HDFS, misalnya, |
Ya |
Tidak ada |
|
|
Format file output: |
Ya |
Tidak ada |
|
|
Jalur tujuan di HDFS. HDFS Writer menulis beberapa file ke direktori ini berdasarkan pengaturan |
Ya |
Tidak ada |
|
|
Nama dasar file output. Akhiran acak ditambahkan untuk membuat nama file aktual untuk setiap thread. |
Ya |
Tidak ada |
|
|
Daftar bidang yang akan ditulis. Tentukan semua nama bidang ( |
Ya (tidak diperlukan untuk |
Tidak ada |
|
|
Perilaku ketika file dengan awalan |
Ya |
Tidak ada |
|
|
Delimiter bidang untuk file output. Harus sesuai dengan delimiter yang digunakan saat membuat tabel Hive, jika tidak data tidak dapat diquery di Hive. Hanya delimiter satu karakter yang didukung. Tidak diperlukan ketika |
Ya (tidak diperlukan untuk |
Tidak ada |
|
|
Tipe kompresi untuk file output. Untuk file teks, |
Tidak |
Tidak ada |
|
|
Format encoding untuk file output. |
Tidak |
|
|
|
Diperlukan ketika |
Tidak |
Tidak ada |
|
|
Parameter Hadoop lanjutan, seperti konfigurasi HA. Menggunakan format yang sama dengan |
Tidak |
Tidak ada |
|
|
Mode untuk menyinkronkan file Parquet. |
Tidak |
|
|
|
Apakah autentikasi Kerberos diaktifkan. Jika |
Tidak |
|
|
|
Jalur mutlak file keytab Kerberos. Wajib jika |
Tidak |
Tidak ada |
|
|
Nama principal Kerberos. Wajib jika |
Tidak |
Tidak ada |
Mode penulisan
HDFS Writer menggunakan strategi write-and-rename: pertama-tama menulis ke folder sementara, lalu memindahkan file ke jalur tujuan. Parameter writeMode mengontrol bagaimana file yang sudah ada dengan awalan fileName yang sama ditangani sebelum penulisan dimulai.
|
Mode |
Perilaku |
|
|
Tidak ada pembersihan sebelum menulis. HDFS Writer menambahkan file secara langsung tanpa memeriksa konflik. |
|
|
Gagal menjalankan tugas jika ada file dengan awalan |
|
|
Menghapus semua file dengan awalan |
Format Parquet tidak mendukung modeappend. GunakannonConflictuntuk file Parquet.
Menulis ke HDFS berbasis OSS
Ketika dataxParquetMode adalah fields, HDFS Writer mendukung OSS sebagai penyimpanan dasar. Tambahkan parameter OSS berikut ke hadoopConfig:
"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"
}
}
Ganti placeholder berikut dengan nilai aktual:
|
Placeholder |
Deskripsi |
|
|
ID AccessKey untuk mengakses OSS |
|
|
Rahasia AccessKey untuk mengakses OSS |