Halaman ini menunjukkan cara menggunakan Dataflow untuk membaca data dari Google Cloud Managed Service untuk Apache Kafka dan menulis data ke tabel BigQuery. Tutorial ini menggunakan template Apache Kafka ke BigQuery untuk membuat tugas Dataflow.
Ringkasan
Apache Kafka adalah platform open source untuk streaming peristiwa. Kafka umum digunakan dalam arsitektur terdistribusi untuk memungkinkan komunikasi antar-komponen yang digabungkan secara longgar. Anda dapat menggunakan Dataflow untuk membaca peristiwa dari Kafka, memprosesnya, dan menulis hasilnya ke tabel BigQuery untuk analisis lebih lanjut.
Managed Service untuk Apache Kafka adalah Google Cloud layanan yang membantu Anda menjalankan cluster Kafka yang aman dan skalabel.
Izin yang diperlukan
Akun layanan pekerja Dataflow harus memiliki peran Identity and Access Management (IAM) berikut:
- Klien Kafka Terkelola (
roles/managedkafka.client) - BigQuery Data Editor (
roles/bigquery.dataEditor)
Untuk mengetahui informasi selengkapnya, lihat Keamanan dan izin Dataflow.
Membuat cluster Kafka
Pada langkah ini, Anda akan membuat cluster Managed Service untuk Apache Kafka. Untuk mengetahui informasi selengkapnya, lihat Membuat cluster Managed Service untuk Apache Kafka.
Konsol
Buka halaman Managed Service untuk Apache Kafka > Cluster.
Klik Buat.
Di kotak Nama cluster, masukkan nama untuk cluster.
Dalam daftar Region, pilih lokasi untuk cluster.
Klik Buat.
gcloud
Gunakan
perintah managed-kafka clusters create.
gcloud managed-kafka clusters create CLUSTER \
--location=REGION \
--cpu=3 \
--memory=3GiB \
--subnets=projects/PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME
Ganti kode berikut:
CLUSTER: nama untuk clusterREGION: region tempat Anda membuat subnetPROJECT_ID: project ID AndaSUBNET_NAME: subnet tempat Anda ingin men-deploy cluster
Pembuatan cluster biasanya memerlukan waktu 20-30 menit.
Membuat topik Kafka
Setelah cluster Managed Service untuk Apache Kafka dibuat, buat topik.
Konsol
Buka halaman Managed Service untuk Apache Kafka > Cluster.
Klik nama cluster.
Di halaman detail cluster, klik Buat Topik.
Di kotak Nama topik, masukkan nama untuk topik.
Klik Buat.
gcloud
Gunakan
perintah managed-kafka topics create.
gcloud managed-kafka topics create TOPIC_NAME \
--cluster=CLUSTER \
--location=REGION \
--partitions=10 \
--replication-factor=3
Ganti kode berikut:
TOPIC_NAME: nama topik yang akan dibuat
Membuat tabel BigQuery
Pada langkah ini, Anda akan membuat tabel BigQuery dengan skema berikut:
| Nama kolom | Jenis data |
|---|---|
name |
STRING |
customer_id |
INTEGER |
Jika Anda belum memiliki set data BigQuery, buat set data terlebih dahulu. Untuk mengetahui informasi selengkapnya, lihat Membuat set data. Kemudian, buat tabel kosong baru:
Konsol
Buka halaman BigQuery.
Di panel Explorer, luaskan project Anda, lalu pilih set data.
Di bagian info Set data, klik Buat tabel.
Dalam daftar Buat tabel dari, pilih Tabel kosong.
Di kotak Tabel, masukkan nama tabel.
Di bagian Skema, klik Edit sebagai teks.
Tempelkan definisi skema berikut:
name:STRING, customer_id:INTEGERKlik Buat tabel.
gcloud
Gunakan perintah bq mk.
bq mk --table \
PROJECT_ID:DATASET_NAME.TABLE_NAME \
name:STRING,customer_id:INTEGER
Ganti kode berikut:
PROJECT_ID: project ID AndaDATASET_NAME: nama set dataTABLE_NAME: nama tabel yang akan dibuat
Menjalankan tugas Dataflow
Setelah membuat cluster Kafka dan tabel BigQuery, jalankan template Dataflow.
Konsol
Pertama, dapatkan alamat server bootstrap cluster:
Di Google Cloud konsol, buka halaman Cluster.
Klik nama cluster.
Klik tab Konfigurasi.
Salin alamat server bootstrap dari URL Bootstrap.
Selanjutnya, jalankan template untuk membuat tugas Dataflow:
Buka halaman Dataflow > Tugas.
Klik Buat tugas dari template.
Di kolom Nama Tugas, masukkan
kafka-to-bq.Untuk Endpoint regional, pilih region tempat cluster Managed Service untuk Apache Kafka Anda berada.
Pilih template "Kafka ke BigQuery".
Masukkan parameter template berikut:
- Server bootstrap Kafka: alamat server bootstrap
- Topik Kafka sumber: nama topik yang akan dibaca
- Mode autentikasi sumber Kafka:
APPLICATION_DEFAULT_CREDENTIALS - Format pesan Kafka:
JSON - Strategi nama tabel:
SINGLE_TABLE_NAME - Tabel output BigQuery: Tabel BigQuery, diformat
sebagai berikut:
PROJECT_ID:DATASET_NAME.TABLE_NAME
Di bagian Antrean pesan yang tidak terkirim, centang Tulis error ke BigQuery.
Masukkan nama tabel BigQuery untuk antrean pesan yang tidak terkirim, diformat sebagai berikut:
PROJECT_ID:DATASET_NAME.ERROR_TABLE_NAMEJangan buat tabel ini sebelumnya. Pipeline akan membuatnya.
Klik Jalankan tugas.
gcloud
Gunakan
dataflow flex-template run
perintah.
gcloud dataflow flex-template run kafka-to-bq \ --template-file-gcs-location gs://dataflow-templates/latest/flex/Kafka_to_BigQuery \ --region LOCATION \ --parameters \ readBootstrapServerAndTopic=projects/PROJECT_ID/locations/LOCATION/clusters/CLUSTER_ID/topics/TOPIC,\ persistKafkaKey=false,\ writeMode=SINGLE_TABLE_NAME,\ kafkaReadOffset=earliest,\ kafkaReadAuthenticationMode=APPLICATION_DEFAULT_CREDENTIALS,\ messageFormat=JSON,\ outputTableSpec=PROJECT_ID:DATASET_NAME.TABLE_NAME\ useBigQueryDLQ=true,\ outputDeadletterTable=PROJECT_ID:DATASET_NAME.ERROR_TABLE_NAME
Ganti variabel berikut:
LOCATION: region tempat Managed Service untuk Apache Kafka Anda beradaPROJECT_ID: nama Google Cloud projectCLUSTER_ID: nama clusterTOPIC: nama topik KafkaDATASET_NAME: nama set dataTABLE_NAME: nama tabelERROR_TABLE_NAME: nama tabel BigQuery untuk antrean pesan yang tidak terkirim
Jangan buat tabel untuk antrean pesan yang tidak terkirim sebelumnya. Pipeline akan membuatnya.
Mengirim pesan ke Kafka
Setelah tugas Dataflow dimulai, Anda dapat mengirim pesan ke Kafka, dan pipeline akan menuliskannya ke BigQuery.
Buat VM di subnet yang sama dengan cluster Kafka dan instal alat command line Kafka. Untuk mengetahui petunjuk mendetail, lihat Menyiapkan mesin klien di Memublikasikan dan menggunakan pesan dengan CLI.
Jalankan perintah berikut untuk menulis pesan ke topik Kafka:
kafka-console-producer.sh \ --topic TOPIC \ --bootstrap-server bootstrap.CLUSTER_ID.LOCATION.managedkafka.PROJECT_ID.cloud.goog:9092 \ --producer.config client.properties
Ganti variabel berikut:
TOPIC: nama topik KafkaCLUSTER_ID: nama clusterLOCATION: region tempat cluster Anda beradaPROJECT_ID: nama Google Cloud project
Pada perintah, masukkan baris teks berikut untuk mengirim pesan ke Kafka:
{"name": "Alice", "customer_id": 1} {"name": "Bob", "customer_id": 2} {"name": "Charles", "customer_id": 3}
Menggunakan antrean pesan yang tidak terkirim
Saat tugas berjalan, pipeline mungkin gagal menulis pesan individual ke BigQuery. Kemungkinan error mencakup:
- Error serialisasi, termasuk JSON yang diformat dengan buruk.
- Error konversi jenis, yang disebabkan oleh ketidakcocokan dalam skema tabel dan data JSON.
- Kolom tambahan dalam data JSON yang tidak ada dalam skema tabel.
Error ini tidak menyebabkan tugas gagal, dan tidak muncul sebagai error dalam log tugas Dataflow. Sebagai gantinya, pipeline menggunakan antrean pesan yang tidak terkirim untuk menangani jenis error ini.
Untuk mengaktifkan antrean pesan yang tidak terkirim saat Anda menjalankan template, tetapkan parameter template berikut:
useBigQueryDLQ:trueoutputDeadletterTable: nama tabel BigQuery yang sepenuhnya memenuhi syarat; misalnya,my-project:dataset1.errors
Pipeline akan otomatis membuat tabel. Jika terjadi error saat memproses pesan Kafka, pipeline akan menulis entri error ke tabel.
Contoh pesan error:
| Jenis error | Data peristiwa | errorMessage |
|---|---|---|
| Error serialisasi | "Hello world" | Gagal melakukan serialisasi json ke baris tabel: "Hello world" |
| Error konversi jenis | {"name":"Emily","customer_id":"abc"} | { "errors" : [ { "debugInfo" : "", "location" : "age", "message" : "Cannot convert value to integer (bad value): abc", "reason" : "invalid" } ], "index" : 0 } |
| Kolom tidak dikenal | {"name":"Zoe","age":34} | { "errors" : [ { "debugInfo" : "", "location" : "age", "message" : "no such field: customer_id.", "reason" : "invalid" } ], "index" : 0 } |
Bekerja dengan jenis data BigQuery
Secara internal, konektor I/O Kafka mengonversi payload pesan JSON menjadi
objek TableRow Apache Beam, dan menerjemahkan nilai kolomTableRow
ke dalam jenis BigQuery.
Tabel berikut menunjukkan representasi JSON dari jenis data BigQuery .
| Jenis BigQuery | Representasi JSON |
|---|---|
ARRAY |
[1.2,3] |
BOOL |
true |
DATE |
"2022-07-01" |
DATETIME |
"2022-07-01 12:00:00.00" |
DECIMAL |
5.2E11 |
FLOAT64 |
3.142 |
GEOGRAPHY |
"POINT(1 2)"Tentukan geografi menggunakan teks terkenal (WKT) atau GeoJSON, diformat sebagai string. Untuk mengetahui informasi selengkapnya, lihat Memuat data geospasial. |
INT64 |
10 |
INTERVAL |
"0-13 370 48:61:61" |
STRING |
"string_val" |
TIMESTAMP |
"2022-07-01T12:00:00.00Z"Gunakan metode |
Data terstruktur
Jika pesan JSON Anda mengikuti skema yang konsisten, Anda dapat merepresentasikan objek JSON
menggunakan
STRUCT jenis
data di BigQuery.
Dalam contoh berikut, kolom answers adalah objek JSON dengan dua
subkolom, a dan b:
{"name":"Emily","answers":{"a":"yes","b":"no"}}
Pernyataan SQL berikut membuat tabel BigQuery dengan skema yang kompatibel:
CREATE TABLE my_dataset.kafka_events (name STRING, answers STRUCT<a STRING, b STRING>);
Tabel yang dihasilkan akan terlihat seperti berikut:
+-------+----------------------+
| name | answers |
+-------+----------------------+
| Emily | {"a":"yes","b":"no"} |
+-------+----------------------+
Data semi-terstruktur
Jika pesan JSON Anda tidak mengikuti skema yang ketat, pertimbangkan untuk menyimpannya di
BigQuery sebagai jenis data
JSON.
Dengan menyimpan data JSON sebagai jenis JSON, Anda tidak perlu menentukan skema terlebih dahulu. Setelah penyerapan data, Anda dapat membuat kueri data menggunakan operator akses kolom (notasi titik) dan akses array di GoogleSQL. Untuk mengetahui informasi selengkapnya, lihat
Bekerja dengan data JSON di GoogleSQL.
Menggunakan UDF untuk mengubah data
Tutorial ini mengasumsikan bahwa pesan Kafka diformat sebagai JSON, dan skema tabel BigQuery cocok dengan data JSON, tanpa transformasi yang diterapkan pada data.
Secara opsional, Anda dapat menyediakan fungsi yang ditentukan pengguna (UDF) JavaScript yang mengubah data sebelum ditulis ke BigQuery. UDF juga dapat melakukan pemrosesan tambahan, seperti memfilter, menghapus informasi identitas pribadi (PII), atau memperkaya data dengan kolom tambahan.
Untuk mengetahui informasi selengkapnya, lihat Membuat fungsi yang ditentukan pengguna (UDF) untuk template Dataflow.