Menjalankan kueri Apache Hive dengan Apache Hadoop di HDInsight menggunakan REST

Pelajari cara menggunakan WebHCat REST API untuk menjalankan kueri Apache Hive dengan Apache Hadoop pada kluster Azure HDInsight.

Prasyarat

URI dasar untuk Rest API

Base Uniform Resource Identifier (URI) untuk REST API pada HDInsight adalah https://CLUSTERNAME.azurehdinsight.net/api/v1/clusters/CLUSTERNAME, dengan CLUSTERNAME sebagai nama kluster Anda. Nama kluster dalam URI peka huruf besar/kecil. Meski nama klaster dalam bagian nama domain yang sepenuhnya memenuhi syarat (FQDN) dari URI (CLUSTERNAME.azurehdinsight.net) tidak peka huruf besar/kecil, kejadian lain dalam URI peka huruf besar/kecil.

Autentikasi

Saat menggunakan cURL atau komunikasi REST lainnya dengan WebHCat, Anda harus mengautentikasi permintaan dengan memberikan nama pengguna dan kata sandi untuk administrator kluster Microsoft Azure HDInsight. REST API diamankan melalui autentikasi dasar. Untuk membantu memastikan bahwa kredensial Anda dikirim dengan aman ke server, Anda harus membuat permintaan menggunakan HTTP Aman (HTTPS).

Penyiapan (Mempertahankan kredensial)

Pertahankan kredensial Anda untuk menghindari memasukkannya kembali untuk setiap contoh. Nama klaster akan dipertahankan dalam langkah terpisah.

J. Bash
Edit skrip di bawah ini dengan mengganti PASSWORD dengan sandi Anda yang sebenarnya. Kemudian masukkan perintah.

export PASSWORD='PASSWORD'

B. PowerShell Jalankan kode di bawah ini dan masukkan kredensial Anda di jendela pop-up:

$creds = Get-Credential -UserName "admin" -Message "Enter the HDInsight login"

Identifikasi nama kluster dengan penggunaan huruf besar/kecil yang benar

Penggunaan huruf besar/kecil aktual nama kluster mungkin berbeda dari yang Anda duga, tergantung pada cara kluster dibuat. Langkah-langkah di sini akan menunjukkan penggunaan huruf besar/kecil aktual, kemudian menyimpannya dalam variabel untuk semua contoh nanti.

Edit skrip di bawah ini untuk mengganti CLUSTERNAME dengan nama klaster Anda. Kemudian masukkan perintah. (Nama kluster untuk FQDN tidak peka huruf besar/kecil.)

export CLUSTER_NAME=$(curl -u admin:$PASSWORD -sS -G "https://CLUSTERNAME.azurehdinsight.net/api/v1/clusters" | jq -r '.items[].Clusters.cluster_name')
echo $CLUSTER_NAME
# Identify properly cased cluster name
$resp = Invoke-WebRequest -Uri "https://CLUSTERNAME.azurehdinsight.net/api/v1/clusters" `
    -Credential $creds -UseBasicParsing
$clusterName = (ConvertFrom-Json $resp.Content).items.Clusters.cluster_name;

# Show cluster name
$clusterName

Menjalankan kueri Apache Hive

  1. Untuk memverifikasi bahwa Anda dapat tersambung ke kluster HDInsight, gunakan salah satu perintah berikut:

    curl -u admin:$PASSWORD -G https://$CLUSTER_NAME.azurehdinsight.net/templeton/v1/status
    
    $resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/templeton/v1/status" `
       -Credential $creds `
       -UseBasicParsing
    $resp.Content
    

    Anda menerima output yang mirip dengan teks berikut:

    {"status":"ok","version":"v1"}
    

    Parameter yang digunakan dalam perintah ini adalah sebagai berikut:

    • -u - Nama pengguna dan kata sandi yang digunakan untuk mengautentikasi permintaan.
    • -G - Menunjukkan bahwa permintaan ini adalah operasi GET.
  2. Awal URL, https://$CLUSTERNAME.azurehdinsight.net/templeton/v1, sama untuk semua permintaan. Jalurnya, /status, menunjukkan bahwa permintaan akan mengembalikan status WebHCat (juga dikenal sebagai Templeton) untuk server. Anda juga dapat meminta versi Hive menggunakan perintah berikut:

    curl -u admin:$PASSWORD -G https://$CLUSTER_NAME.azurehdinsight.net/templeton/v1/version/hive
    
    $resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/templeton/v1/version/hive" `
       -Credential $creds `
       -UseBasicParsing
    $resp.Content
    

    Permintaan ini mengembalikan respons yang mirip dengan teks berikut:

    {"module":"hive","version":"1.2.1000.2.6.5.3008-11"}
    
  3. Gunakan hal berikut ini untuk membuat tabel bernama log4jLogs:

    JOB_ID=$(curl -s -u admin:$PASSWORD -d user.name=admin -d execute="DROP+TABLE+log4jLogs;CREATE+EXTERNAL+TABLE+log4jLogs(t1+string,t2+string,t3+string,t4+string,t5+string,t6+string,t7+string)+ROW+FORMAT+DELIMITED+FIELDS+TERMINATED+BY+' '+STORED+AS+TEXTFILE+LOCATION+'/example/data/';SELECT+t4+AS+sev,COUNT(*)+AS+count+FROM+log4jLogs+WHERE+t4+=+'[ERROR]'+AND+INPUT__FILE__NAME+LIKE+'%25.log'+GROUP+BY+t4;" -d statusdir="/example/rest" https://$CLUSTER_NAME.azurehdinsight.net/templeton/v1/hive | jq -r .id)
    echo $JOB_ID
    
    $reqParams = @{"user.name"="admin";"execute"="DROP TABLE log4jLogs;CREATE EXTERNAL TABLE log4jLogs(t1 string, t2 string, t3 string, t4 string, t5 string, t6 string, t7 string) ROW FORMAT DELIMITED BY ' ' STORED AS TEXTFILE LOCATION '/example/data/;SELECT t4 AS sev,COUNT(*) AS count FROM log4jLogs WHERE t4 = '[ERROR]' GROUP BY t4;";"statusdir"="/example/rest"}
    $resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/templeton/v1/hive" `
       -Credential $creds `
       -Body $reqParams `
       -Method POST `
       -UseBasicParsing
    $jobID = (ConvertFrom-Json $resp.Content).id
    $jobID
    

    Permintaan ini menggunakan metode POST yang mengirim data sebagai bagian dari permintaan ke REST API. Nilai data berikut dikirim dengan permintaan:

    • user.name - Pengguna yang menjalankan perintah.
    • execute - Pernyataan HiveQL untuk dieksekusi.
    • statusdir - Direktori tempat status untuk pekerjaan ini ditulis.

    Pernyataan-pernyataan ini melaksanakan tindakan berikut:

    • DROP TABLE - Jika tabel sudah ada, itu dihapus.

    • CREATE EXTERNAL TABLE: Membuat tabel 'eksternal' baru di Hive. Tabel eksternal hanya menyimpan definisi tabel di Hive. Data tetap berada di lokasi asal.

      Catatan

      Tabel eksternal harus digunakan saat Anda mengharapkan data yang mendasarinya diperbarui oleh sumber eksternal. Misalnya, proses pengunggahan data otomatis atau operasi MapReduce lainnya.

      Menghilangkan tabel eksternal tidak menghapus data, hanya definisi tabel.

    • ROW FORMAT - Cara data diformat. Dalam hal ini, bidang di setiap log dipisahkan oleh spasi.

    • STORED AS TEXTFILE LOCATION - Tempat data disimpan (contoh/direktori data), dan data disimpan sebagai teks.

    • SELECT - Memilih jumlah semua baris tempat kolom t4 berisi nilai [KESALAHAN] . Pernyataan ini mengembalikan nilai 3 karena ada tiga baris yang berisi nilai ini.

      Catatan

      Perhatikan bahwa spasi antara pernyataan HiveQL digantikan oleh karakter + saat digunakan dengan Curl. Nilai yang dikutip yang berisi spasi, seperti pemisah, tidak boleh digantikan oleh +.

      Perintah ini mengembalikan ID pekerjaan yang dapat digunakan untuk memeriksa status pekerjaan.

  4. Untuk memeriksa status pekerjaan, gunakan perintah berikut:

    curl -u admin:$PASSWORD -d user.name=admin -G https://$CLUSTER_NAME.azurehdinsight.net/templeton/v1/jobs/$jobid | jq .status.state
    
    $reqParams=@{"user.name"="admin"}
    $resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/templeton/v1/jobs/$jobID" `
       -Credential $creds `
       -Body $reqParams `
       -UseBasicParsing
    # ConvertFrom-JSON can't handle duplicate names with different case
    # So change one to prevent the error
    $fixDup=$resp.Content.Replace("jobID","job_ID")
    (ConvertFrom-Json $fixDup).status.state
    

    Jika pekerjaan telah selesai, statusnya adalah BERHASIL.

  5. Setelah status pekerjaan berubah menjadi BERHASIL, Anda dapat mengambil hasil pekerjaan dari penyimpanan Azure Blob. Parameter statusdir yang diteruskan dengan kueri berisi lokasi file output; dalam hal ini, /example/rest. Alamat ini menyimpan output di direktori example/curldalam penyimpanan default kluster.

    Anda dapat mencantumkan dan mengunduh file-file ini menggunakan Azure CLI. Untuk informasi selengkapnya tentang menggunakan Azure CLI dengan Azure Storage, lihat dokumen Menggunakan Azure CLI dengan Azure Storage.

Langkah berikutnya

Informasi tentang cara lain untuk bekerja dengan Hadoop di Microsoft Azure HDInsight:

Untuk informasi selengkapnya tentang REST API yang digunakan dalam dokumen ini, lihat dokumen referensi WebHCat.