Halaman ini menjelaskan cara menggunakan konektor Dataflow untuk Spanner guna mengimpor, mengekspor, dan mengubah data di database logika Google SQL Spanner dan database logika PostgreSQL.
Dataflow adalah layanan terkelola untuk mengubah dan memperkaya data. Konektor Dataflow untuk Spanner memungkinkan Anda membaca data dari dan menulis data ke Spanner dalam pipeline Dataflow, dengan opsi mengubah atau memodifikasi data. Anda juga dapat membuat pipeline yang mentransfer data antara Spanner dan produk Google Cloud lainnya.
Konektor Dataflow adalah metode yang direkomendasikan untuk memindahkan data secara massal ke dalam dan ke luar Spanner secara efisien. Ini juga merupakan metode yang direkomendasikan untuk melakukan transformasi besar ke database yang tidak didukung oleh DML Berpartisi, seperti pemindahan tabel dan penghapusan massal yang memerlukan JOIN. Saat menggunakan database individual, ada metode lain yang dapat Anda gunakan untuk mengimpor dan mengekspor data:
- Gunakan konsol Google Cloud untuk mengekspor setiap database dari Spanner ke Cloud Storage dalam format Avro.
- Gunakan konsol Google Cloud untuk mengimpor database kembali ke Spanner dari file yang Anda ekspor ke Cloud Storage.
- Gunakan REST API atau Google Cloud CLI untuk menjalankan tugas ekspor atau impor dari Spanner ke Cloud Storage dan sebaliknya juga menggunakan format Avro.
Konektor Dataflow untuk Spanner adalah bagian dari
Apache Beam Java SDK, dan menyediakan API untuk melakukan tindakan
sebelumnya. Untuk informasi selengkapnya tentang beberapa konsep yang dibahas di halaman ini,
seperti objek dan transformasi PCollection
, lihat panduan pemrograman
Apache Beam.
Menambahkan konektor ke project Maven Anda
Untuk menambahkan konektor Google Cloud Dataflow ke project
Maven, tambahkan artefak Maven beam-sdks-java-io-google-cloud-platform
ke
file pom.xml
sebagai dependensi.
Misalnya, dengan asumsi bahwa file pom.xml
menetapkan beam.version
ke
nomor versi yang sesuai, Anda akan menambahkan dependensi berikut:
<dependency>
<groupId>org.apache.beam</groupId>
<artifactId>beam-sdks-java-io-google-cloud-platform</artifactId>
<version>${beam.version}</version>
</dependency>
Membaca data dari Spanner
Untuk membaca dari Spanner, terapkan transformasi SpannerIO.read
. Konfigurasikan pembacaan menggunakan metode di
class SpannerIO.Read
. Menerapkan transformasi akan menampilkan
PCollection<Struct>
, dengan setiap elemen dalam koleksi
mewakili setiap baris yang ditampilkan oleh operasi baca. Anda dapat membaca dari
Spanner dengan dan tanpa kueri SQL tertentu, bergantung pada
output yang diperlukan.
Menerapkan transformasi SpannerIO.read
akan menampilkan tampilan data yang konsisten dengan
melakukan pembacaan yang kuat. Kecuali jika Anda menentukan lain, hasil pembacaan
akan diambil snapshot-nya pada saat Anda memulai pembacaan. Lihat pembacaan untuk mengetahui informasi
selengkapnya tentang berbagai jenis pembacaan yang dapat dilakukan
Spanner.
Membaca data menggunakan kueri
Untuk membaca kumpulan data tertentu dari Spanner, konfigurasikan
transformasi menggunakan metode SpannerIO.Read.withQuery
untuk
menentukan kueri SQL. Contoh:
Membaca data tanpa menentukan kueri
Untuk membaca dari database tanpa menggunakan kueri, Anda dapat menentukan nama tabel menggunakan metode SpannerIO.Read.withTable
, dan menentukan daftar kolom yang akan dibaca menggunakan metode SpannerIO.Read.withColumns
. Contoh:
GoogleSQL
PostgreSQL
Untuk membatasi baris yang dibaca, Anda dapat menentukan kumpulan kunci utama yang akan dibaca menggunakan
metode SpannerIO.Read.withKeySet
.
Anda juga dapat membaca tabel menggunakan indeks sekunder yang ditentukan. Seperti halnya
panggilan readUsingIndex
API,
indeks harus berisi semua data yang muncul dalam hasil kueri.
Untuk melakukannya, tentukan tabel seperti yang ditunjukkan pada contoh sebelumnya, dan tentukan
indeks yang berisi nilai kolom yang diperlukan menggunakan
metode SpannerIO.Read.withIndex
. Indeks harus menyimpan semua
kolom yang perlu dibaca transformasi. Kunci utama tabel dasar disimpan secara implisit. Misalnya, untuk membaca tabel Songs
menggunakan indeks
SongsBySongName
, Anda menggunakan
kode berikut:
GoogleSQL
PostgreSQL
Mengontrol keusangan data transaksi
Transformasi dijamin akan dieksekusi pada snapshot data yang konsisten. Untuk
mengontrol ketidak-berlakuan data, gunakan
metode SpannerIO.Read.withTimestampBound
. Lihat
transaksi untuk mengetahui informasi selengkapnya.
Membaca dari beberapa tabel dalam transaksi yang sama
Jika Anda ingin membaca data dari beberapa tabel pada titik waktu yang sama untuk
memastikan konsistensi data, lakukan semua operasi baca dalam satu transaksi. Untuk melakukannya, terapkan transformasi createTransaction
, yang membuat
objek PCollectionView<Transaction>
yang kemudian membuat transaksi. Tampilan
yang dihasilkan dapat diteruskan ke operasi baca menggunakan
SpannerIO.Read.withTransaction
.
GoogleSQL
PostgreSQL
Membaca data dari semua tabel yang tersedia
Anda dapat membaca data dari semua tabel yang tersedia di database Spanner.
GoogleSQL
PostgreSQL
Memecahkan masalah kueri yang tidak didukung
Konektor Dataflow hanya mendukung kueri SQL Spanner
dengan operator pertama dalam rencana eksekusi kueri adalah Union
Terdistribusi. Jika Anda mencoba membaca data dari Spanner menggunakan kueri dan mendapatkan pengecualian yang menyatakan bahwa kueri does not have a
DistributedUnion at the root
, ikuti langkah-langkah di Memahami cara Spanner menjalankan kueri untuk mengambil rencana eksekusi kueri menggunakan konsol Google Cloud.
Jika kueri SQL Anda tidak didukung, sederhanakan menjadi kueri yang memiliki penggabungan terdistribusi sebagai operator pertama dalam rencana eksekusi kueri. Hapus fungsi agregat, penggabungan tabel, serta operator DISTINCT
, GROUP BY
, dan ORDER
, karena operator tersebut kemungkinan besar akan mencegah kueri berfungsi.
Membuat mutasi untuk operasi tulis
Gunakan metode newInsertOrUpdateBuilder
class Mutation
, bukan metode
newInsertBuilder
, kecuali jika benar-benar diperlukan untuk pipeline Java. Untuk pipeline Python, gunakan
SpannerInsertOrUpdate
, bukan
SpannerInsert
. Dataflow memberikan
jaminan minimal sekali, yang berarti mutasi mungkin ditulis
beberapa kali. Akibatnya, mutasi INSERT
saja yang dapat menghasilkan error com.google.cloud.spanner.SpannerException: ALREADY_EXISTS
yang menyebabkan pipeline gagal. Untuk mencegah error ini, gunakan mutasi INSERT_OR_UPDATE
, yang menambahkan baris baru atau memperbarui nilai kolom jika baris sudah ada. Mutasi INSERT_OR_UPDATE
dapat diterapkan lebih dari sekali.
Menulis ke Spanner dan mengubah data
Anda dapat menulis data ke Spanner dengan konektor Dataflow menggunakan transformasi SpannerIO.write
untuk menjalankan kumpulan mutasi baris input. Konektor Dataflow mengelompokkan mutasi menjadi batch untuk efisiensi.
Contoh berikut menunjukkan cara menerapkan transformasi tulis ke PCollection
mutasi:
GoogleSQL
PostgreSQL
Jika transformasi tiba-tiba berhenti sebelum selesai, mutasi yang telah diterapkan tidak akan di-roll back.
Menerapkan grup mutasi secara atomik
Anda dapat menggunakan class MutationGroup
untuk memastikan bahwa
sekelompok mutasi diterapkan secara bersama secara atomik. Mutasi dalam
MutationGroup
dijamin akan dikirim dalam transaksi yang sama, tetapi
transaksi mungkin dicoba lagi.
Grup mutasi berperforma terbaik jika digunakan untuk mengelompokkan mutasi yang memengaruhi data yang disimpan berdekatan di ruang kunci. Karena Spanner menyisipkan data tabel induk dan turunan bersama-sama dalam tabel induk, data tersebut selalu berdekatan dalam ruang kunci. Sebaiknya strukturkan grup mutasi agar berisi satu mutasi yang diterapkan ke tabel induk dan mutasi tambahan yang diterapkan ke tabel turunan, atau agar semua mutasinya mengubah data yang berdekatan di ruang kunci. Untuk informasi selengkapnya tentang cara Spanner menyimpan data tabel induk dan turunan, lihat Skema dan model data. Jika Anda tidak mengatur grup mutasi berdasarkan hierarki tabel yang direkomendasikan, atau jika data yang diakses tidak berdekatan di ruang kunci, Spanner mungkin perlu melakukan commit dua fase, yang menghasilkan performa yang lebih lambat. Untuk informasi selengkapnya, lihat Kompromi lokalitas.
Untuk menggunakan MutationGroup
, build transform SpannerIO.write
dan panggil
metode SpannerIO.Write.grouped
, yang menampilkan
transformasi yang kemudian dapat Anda terapkan ke PCollection
objek MutationGroup
.
Saat membuat MutationGroup
, mutasi pertama yang tercantum menjadi
mutasi utama. Jika grup mutasi Anda memengaruhi tabel induk dan turunan, mutasi utama harus berupa mutasi ke tabel induk. Jika tidak,
Anda dapat menggunakan mutasi apa pun sebagai mutasi utama. Konektor Dataflow menggunakan mutasi primer untuk menentukan batas partisi agar dapat mengelompokkan mutasi secara efisien.
Misalnya, bayangkan bahwa aplikasi Anda memantau perilaku dan menandai
perilaku pengguna yang bermasalah untuk ditinjau. Untuk setiap perilaku yang ditandai, Anda ingin
memperbarui tabel Users
untuk memblokir akses pengguna ke aplikasi Anda, dan Anda
juga perlu mencatat insiden tersebut di tabel PendingReviews
. Untuk memastikan
bahwa kedua tabel diperbarui secara atomik, gunakan MutationGroup
:
GoogleSQL
PostgreSQL
Saat membuat grup mutasi, mutasi pertama yang diberikan sebagai argumen
menjadi mutasi utama. Dalam hal ini, kedua tabel tidak terkait, sehingga
tidak ada mutasi utama yang jelas. Kita telah memilih userMutation
sebagai utama dengan
menempatkannya terlebih dahulu. Menerapkan kedua mutasi secara terpisah akan lebih cepat, tetapi tidak akan menjamin atomitas, sehingga grup mutasi adalah pilihan terbaik dalam situasi ini.
Langkah selanjutnya
- Pelajari lebih lanjut cara mendesain pipeline data Apache Beam.
- Ekspor dan impor database Spanner di konsol Google Cloud menggunakan Dataflow.