Mengatur tabel Hive untuk menjalankan perintah Hive - Amazon EMR

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Mengatur tabel Hive untuk menjalankan perintah Hive

Apache Hive adalah aplikasi gudang data yang dapat Anda gunakan untuk membuat kueri data yang terkandung dalam klaster Amazon EMR menggunakan bahasa mirip SQL. Untuk informasi selengkapnya tentang Hive, lihat http://hive.apache.org/.

Prosedur berikut mengasumsikan Anda telah membuat sebuah klaster dan menentukan pasangan kunci Amazon EC2. Untuk mempelajari cara memulai membuat klaster, lihat Memulai Amazon EMR dalam Panduan Pengelolaan Amazon EMR.

Konfigurasikan Hive untuk menggunakan MapReduce

Bila Anda menggunakan Hive di Amazon EMR untuk membuat kueri tabel DynamoDB, kesalahan dapat terjadi jika Hive menggunakan mesin eksekusi default, Tez. Untuk alasan ini, ketika Anda membuat sebuah klaster dengan Hive yang terintegrasi dengan DynamoDB seperti yang dijelaskan dalam bagian ini, kami rekomendasikan Anda untuk menggunakan klasifikasi konfigurasi yang mengatur Hive untuk menggunakan MapReduce. Untuk informasi selengkapnya, lihat Konfigurasikan aplikasi.

Potongan berikut menunjukkan klasifikasi konfigurasi dan properti yang harus digunakan untuk mengatur MapReduce sebagai mesin eksekusi untuk Hive:

[ { "Classification": "hive-site", "Properties": { "hive.execution.engine": "mr" } } ]
Untuk menjalankan perintah Hive secara interaktif
  1. Connect ke simpul utama. Untuk informasi selengkapnya, lihat Connect ke simpul utama menggunakan SSH dalam Panduan Pengelolaan Amazon EMR.

  2. Pada prompt perintah untuk simpul utama saat ini, ketik hive.

    Anda akan melihat prompt Hive: hive>

  3. Masukkan perintah Hive yang memetakan tabel dalam aplikasi Hive ke data di DynamoDB. Tabel ini bertindak sebagai referensi ke data yang disimpan di Amazon DynamoDB; data tidak disimpan secara lokal di Hive dan setiap kueri yang menggunakan tabel ini berjalan berlawanan data langsung di DynamoDB, menghabiskan kapasitas baca atau tulis tabel setiap kali perintah dijalankan. Jika Anda berharap untuk menjalankan beberapa perintah Hive atas set data yang sama, pertimbangkan untuk mengekspornya terlebih dahulu.

    Berikut ini menunjukkan sintaks untuk pemetaan tabel Hive ke tabel DynamoDB.

    CREATE EXTERNAL TABLE hive_tablename (hive_column1_name column1_datatype, hive_column2_name column2_datatype...) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "dynamodb_tablename", "dynamodb.column.mapping" = "hive_column1_name:dynamodb_attribute1_name,hive_column2_name:dynamodb_attribute2_name...");

    Bila Anda membuat tabel di Hive dari DynamoDB, Anda harus membuatnya sebagai tabel eksternal menggunakan kata kunci EXTERNAL. Perbedaan antara tabel eksternal dan internal adalah bahwa data dalam tabel internal dihapus ketika tabel internal dibuang. Ini bukan perilaku yang diinginkan ketika terhubung ke Amazon DynamoDB, dan dengan demikian hanya tabel eksternal yang didukung.

    Misalnya, perintah Hive berikut membuat tabel bernama hivetable1 di Hive yang melakukan referensi pada tabel DynamoDB bernama dynamodbtable1. DynamoDB tabel dynamodbtable1 memiliki skema kunci hash-and-range primer. Elemen kunci hash adalah name (tipe string), elemen kunci range adalah year (tipe numerik), dan setiap item memiliki nilai atribut untuk holidays (tipe set string).

    CREATE EXTERNAL TABLE hivetable1 (col1 string, col2 bigint, col3 array<string>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "dynamodbtable1", "dynamodb.column.mapping" = "col1:name,col2:year,col3:holidays");

    Baris 1 menggunakan pernyataan CREATE EXTERNAL TABLE HiveQL. Untuk hivetable1, Anda perlu menetapkan kolom untuk setiap pasangan atribut nama-nilai dalam tabel DynamoDB, dan memberikan tipe data. Nilai-nilai ini tidak peka huruf besar kecil, dan Anda dapat memberikan kolom ini nama apapun (kecuali kata-kata yang tersimpan).

    Baris 2 menggunakan pernyataan STORED BY. Nilai dari STORED BY adalah nama kelas yang menangani hubungan antara Hive dan DynamoDB. Ia harus diatur ke 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler'.

    Baris 3 menggunakan pernyataan TBLPROPERTIES untuk mengasosiasikan "hivetable1" dengan tabel dan skema yang benar di DynamoDB. Berikan TBLPROPERTIES nilai-nilai untuk parameter dynamodb.table.name dan parameter dynamodb.column.mapping. Nilai ini adalah peka huruf besar kecil.

    catatan

    Semua nama atribut DynamoDB untuk tabel harus memiliki kolom yang sesuai dalam tabel Hive. Tergantung pada versi Amazon EMR Anda, skenario berikut terjadi jika one-to-one pemetaan tidak ada:

    • Pada Amazon EMR versi 5.27.0 dan setelahnya, konektor memiliki validasi yang memastikan one-to-one pemetaan antara nama atribut DynamoDB dan kolom dalam tabel Hive. Kesalahan akan terjadi jika one-to-one pemetaan tidak ada.

    • Pada Amazon EMR versi 5.26.0 dan sebelumnya, tabel Hive tidak akan berisi pasangan nama-nilai dari DynamoDB. Jika Anda tidak memetakan atribut kunci utama DynamoDB, maka Hive akan menghasilkan kesalahan. Jika Anda tidak memetakan atribut kunci non-utama, tidak ada kesalahan yang dihasilkan, tetapi Anda tidak akan melihat data dalam tabel Hive. Jika tipe data tidak cocok, nilainya nol.

Kemudian Anda dapat mulai menjalankan operasi Hive pada hivetable1. Kueri berjalan terhadap hivetable1 secara internal dijalankan terhadap tabel DynamoDB dynamodbtable1 akun DynamoDB Anda, menghabiskan unit baca atau tulis dengan setiap eksekusi.

Ketika Anda menjalankan kueri Hive terhadap tabel DynamoDB, Anda perlu memastikan bahwa Anda telah menetapkan unit kapasitas baca dengan jumlah yang cukup.

Misalnya, anggaplah bahwa Anda telah menetapkan 100 unit kapasitas baca untuk tabel DynamoDB Anda. Ini akan memungkinkan Anda melakukan 100 baca, atau 409,600 byte, per detik. Jika tabel yang berisi 20GB data (21.474.836.480 byte), dan kueri Hive Anda melakukan pindai tabel penuh, Anda dapat memperkirakan berapa lama kueri dijalankan:

21.474.836.480/409.600 = 52.429 detik = 14,56 jam

Satu-satunya cara untuk mengurangi waktu yang diperlukan adalah menyesuaikan unit kapasitas baca pada tabel DynamoDB sumber. Menambahkan lebih banyak simpul Amazon EMR tidak akan membantu.

Dalam output Hive, persentase penyelesaian diperbarui ketika satu proses pemeta atau lebih telah selesai. Untuk tabel DynamoDB besar dengan pengaturan kapasitas baca ditetapkan yang rendah, output persentase penyelesaian mungkin tidak diperbarui dalam waktu yang lama; dalam kasus di atas, tugas akan muncul menjadi selesai 0% dalam beberapa jam. Untuk status yang lebih rinci pada kemajuan tugas Anda, buka konsol Amazon EMR; Anda akan dapat melihat status tugas pemeta individu, dan statistik untuk baca data. Anda juga dapat masuk ke antarmuka Hadoop pada simpul utama dan melihat statistik Hadoop. Ini akan menunjukkan status tugas peta masing-masing dan beberapa statistik baca data. Untuk informasi selengkapnya, lihat topik berikut:

Untuk informasi lebih lanjut tentang pernyataan HiveQL contoh untuk melakukan tugas-tugas seperti mengekspor atau mengimpor data dari DynamoDB dan menggabungkan tabel, lihat Contoh perintah Hive untuk mengekspor, mengimpor, dan membuat kueri data di DynamoDB.

Untuk membatalkan permintaan Hive

Ketika Anda menjalankan kueri Hive, respon awal dari server termasuk perintah untuk membatalkan permintaan. Untuk membatalkan permintaan kapan saja dalam proses, gunakan Perintah Bunuh dari respon server.

  1. Masukkan Ctrl+C untuk keluar dari klien baris perintah.

  2. Pada shell prompt, masukkan Perintah Bunuh dari respon server awal untuk permintaan Anda.

    Atau, Anda dapat menjalankan perintah berikut dari baris perintah dari simpul utama untuk membunuh tugas Hadoop, di mana ID tugas menjadi pengenal dari tugas Hadoop dan dapat diambil dari antarmuka pengguna Hadoop.

    hadoop job -kill job-id

Jenis data untuk Hive dan DynamoDB

Tabel berikut menunjukkan tipe data Hive yang tersedia, tipe DynamoDB default yang sesuai dengannya, dan tipe DynamoDB alternatif yang juga dapat dipetakan kepadanya.

Tipe Hive Tipe DynamoDB default Tipe DynamoDB alternatif
string

string (S)

bigint atau ganda

nomor (N)

biner

biner (B)

boolean

boolean (BOOL)

array daftar (L)

set nomor (NS), set string (SS), atau set biner (BS)

peta<string,string> Item

peta (M)

peta<string,? > peta (M)
nol (NULL)

Jika Anda ingin menulis data Hive Anda sebagai tipe DynamoDB alternatif yang sesuai, atau jika data DynamoDB Anda berisi nilai atribut dari tipe DynamoDB alternatif, maka Anda dapat menentukan kolom dan tipe DynamoDB dengan parameter dynamodb.type.mapping. Contoh berikut menunjukkan sintaks untuk menentukan pemetaan tipe alternatif.

CREATE EXTERNAL TABLE hive_tablename (hive_column1_name column1_datatype, hive_column2_name column2_datatype...) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "dynamodb_tablename", "dynamodb.column.mapping" = "hive_column1_name:dynamodb_attribute1_name,hive_column2_name:dynamodb_attribute2_name...", "dynamodb.type.mapping" = "hive_column1_name:dynamodb_attribute1_datatype");

Tipe pemetaan parameter bersifat opsional, dan hanya harus ditentukan untuk kolom yang menggunakan tipe alternatif.

Misalnya, perintah Hive berikut membuat tabel bernama hivetable2 yang membuat referensi pada tabel DynamoDB dynamodbtable2. Hal ini mirip dengan hivetable1, kecuali bahwa ia memetakan kolom col3 ke tipe set string (SS).

CREATE EXTERNAL TABLE hivetable2 (col1 string, col2 bigint, col3 array<string>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "dynamodbtable2", "dynamodb.column.mapping" = "col1:name,col2:year,col3:holidays", "dynamodb.type.mapping" = "col3:SS");

Di Hive, hivetable1 dan hivetable2 bersifat identik. Namun, ketika data dari tabel tersebut ditulis ke tabel DynamoDB yang sesuai, dynamodbtable1 akan berisi daftar, sementara dynamodbtable2 akan berisi set string.

Jika Anda ingin menulis nilai null Hive sebagai atribut tipe null DynamoDB, maka Anda dapat melakukannya dengan parameter dynamodb.null.serialization. Contoh berikut menunjukkan sintaks untuk menentukan serialisasi null.

CREATE EXTERNAL TABLE hive_tablename (hive_column1_name column1_datatype, hive_column2_name column2_datatype...) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "dynamodb_tablename", "dynamodb.column.mapping" = "hive_column1_name:dynamodb_attribute1_name,hive_column2_name:dynamodb_attribute2_name...", "dynamodb.null.serialization" = "true");

Parameter serialisasi nol bersifal opsional, dan diatur menjadi false jika tidak ditentukan. Perhatikan bahwa atribut null DynamoDB dibaca sebagai nilai null dalam Hive terlepas dari pengaturan parameternya. Koleksi Hive dengan nilai null dapat ditulis ke DynamoDB hanya jika parameter serialisasi nol ditentukan sebagai true. Jika tidak, muncul kesalahan Hive.

Tipe bigint di Hive adalah sama dengan tipe panjang Java, dan tipe ganda Hive adalah sama dengan tipe ganda Java dalam hal presisi. Ini berarti bahwa jika Anda memiliki data numerik yang disimpan dalam DynamoDB yang memiliki presisi lebih tinggi daripada yang tersedia dalam tipe data Hive, dengan menggunakan Hive untuk mengekspor, impor, atau referensi data DynamoDB dapat menyebabkan kehilangan presisi atau kegagalan kueri Hive.

Ekspor tipe biner dari DynamoDB ke Amazon Simple Storage Service (Amazon S3) atau HDFS disimpan sebagai string Base64-encoded. Jika Anda mengimpor data dari Amazon S3 atau HDFS ke dalam tipe biner DynamoDB, maka data itu harus dikodekan sebagai string Base64.

Pilihan Hive

Anda dapat mengatur pilihan Hive berikut untuk mengelola transfer data dari Amazon DynamoDB. Pilihan ini hanya bertahan untuk sesi Hive saat ini. Jika Anda menutup prompt perintah Hive dan membukanya kembali nanti pada klaster, pengaturan ini akan kembali ke nilai default.

Pilihan Hive Deskripsi
dynamodb.throughput.read.percent

Atur tingkat operasi baca untuk menjaga tingkat tingkat throughput ditetapkan DynamoDB Anda berada dalam kisaran dialokasikan untuk tabel Anda. Nilainya adalah antara 0.1 dan 1.5, secara inklusif.

Nilai 0,5 adalah tingkat baca default, yang berarti bahwa Hive akan mencoba untuk menggunakan setengah dari baca yang ditetapkan di seluruh sumber daya dalam tabel. Menaikkan nilai ini di atas 0,5 akan meningkatkan tingkat permintaan baca. Menurunkannya di bawah 0,5 akan menurunkan tingkat permintaan baca. Tingkat baca ini hanya perkiraan. Tingkat baca sebenarnya akan tergantung pada faktor-faktor seperti apakah ada distribusi kunci yang seragam dalam DynamoDB.

Jika Anda menemukan throughput ditetapkan Anda sering dilampaui oleh operasi Hive, atau jika lalu lintas baca langsung yang di-throttling terlalu banyak, maka kurangi nilainya menjadi kurang dari 0.5. Jika Anda memiliki kapasitas yang cukup dan ingin operasi Hive lebih cepat, atur nilai ini di atas 0.5. Anda juga dapat melakukan oversubscribe dengan mengaturnya hingga 1,5 jika Anda yakin ada operasi input/output yang tidak terpakai yang tersedia.

dynamodb.throughput.write.percent

Atur tingkat operasi tulis untuk menjaga tingkat throughput ditetapkan DynamoDB Anda berada dalam kisaran yang dialokasikan untuk tabel Anda. Nilainya adalah antara 0.1 dan 1.5, secara inklusif.

Nilai 0,5 adalah tingkat tulis default, yang berarti bahwa Hive akan mencoba untuk menggunakan setengah dari tulis yang ditetapkan di seluruh sumber daya dalam tabel. Menaikkan nilai ini di atas 0,5 akan meningkatkan tingkat permintaan tulis. Menurunkannya di bawah 0,5 akan menurunkan tingkat permintaan tulis. Tingkat tulis ini hanya perkiraan. Tingkat tulis sebenarnya akan tergantung pada faktor-faktor seperti apakah ada distribusi kunci yang seragam dalam DynamoDB

Jika Anda menemukan throughput ditetapkan Anda sering dilampaui oleh operasi Hive, atau jika lalu lintas tulis langsung yang di-throttling terlalu banyak, maka kurangi nilainya menjadi kurang dari 0.5. Jika Anda memiliki kapasitas yang cukup dan ingin operasi Hive lebih cepat, atur nilai ini di atas 0.5. Anda juga dapat melakukan oversubscribe dengan mengaturnya hingga 1,5 jika Anda yakin ada operasi input/output yang tidak terpakai yang tersedia atau ini adalah data awal yang diunggah ke tabel dan belum ada lalu lintas langsung.

dynamodb.endpoint

Tentukan titik akhir untuk layanan DynamoDB. Untuk informasi selengkapnya tentang titik akhir DynamoDB yang tersedia, lihat Wilayah dan titik akhir.

dynamodb.max.map.tasks

Tentukan jumlah maksimum tugas peta saat membaca data dari DynamoDB. Nilai ini harus sama dengan atau lebih besar dari 1.

dynamodb.retry.duration

Tentukan jumlah menit yang akan digunakan sebagai durasi batas waktu untuk mencoba kembali perintah Hive. Nilai ini harus integer yang sama dengan atau lebih besar dari 0. Durasi batas waktu default adalah dua menit.

Pilihan ini diatur menggunakan perintah SET seperti yang ditunjukkan dalam contoh berikut.

SET dynamodb.throughput.read.percent=1.0; INSERT OVERWRITE TABLE s3_export SELECT * FROM hiveTableName;