BigQuery Connector untuk Apache Spark memungkinkan Data Scientist memadukan kecanggihan teknologi BigQuery SQL engine yang skalabel tanpa hambatan dengan Machine Learning Apache Spark kemampuan IT. Dalam tutorial ini, kami menunjukkan cara menggunakan Dataproc, BigQuery dan Apache Spark ML untuk menjalankan machine learning pada set data.
Tujuan
Gunakan regresi linier untuk membangun model berat lahir sebagai fungsi dari lima faktor:- minggu kehamilan
- usia ibu
- usia ayah
- pertambahan berat ibu selama kehamilan
- Skor Apgar
Gunakan alat berikut:
- BigQuery, untuk menyiapkan tabel input regresi linear, yaitu yang ditulis ke project Google Cloud Anda
- Python, untuk membuat kueri dan mengelola data di BigQuery
- Apache Spark, untuk mengakses tabel regresi linear yang dihasilkan
- Spark ML, untuk membangun dan mengevaluasi model
- Tugas Dataproc PySpark, untuk memanggil fungsi Spark ML
Biaya
Dalam dokumen ini, Anda menggunakan komponen Google Cloud yang dapat ditagih berikut:
- Compute Engine
- Dataproc
- BigQuery
Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda,
gunakan kalkulator harga.
Sebelum memulai
Cluster Dataproc memiliki komponen Spark, termasuk Spark ML, yang terinstal. Untuk menyiapkan cluster Dataproc dan menjalankan kode dalam contoh ini, Anda akan perlu melakukan (atau telah melakukan) hal berikut:
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.
-
Aktifkan API Dataproc, BigQuery, Compute Engine.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.
-
Aktifkan API Dataproc, BigQuery, Compute Engine.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
- Buat cluster Dataproc di proyek. Cluster Anda harus menjalankan Versi Dataproc dengan Spark 2.0 atau yang lebih tinggi, (termasuk library machine learning).
Membuat Subkumpulan data natality
BigQuery
Di bagian ini, Anda akan membuat set data di project Anda, lalu membuat tabel tempat Anda menyalin {i>subset<i} data tingkat kelahiran dari kelahiran yang tersedia untuk umum set data BigQuery. Nanti dalam tutorial ini, Anda akan menggunakan {i>subset data<i} dalam tabel ini untuk memprediksi berat lahir sebagai fungsi usia ibu, usia ayah, dan minggu kehamilan.
Anda dapat membuat {i>subset <i}data menggunakan Konsol Google Cloud atau menjalankan skrip Python di komputer lokal Anda.
Konsol
Buat set data di project Anda.
- Buka UI Web BigQuery.
- Di panel navigasi kiri, klik nama proyek Anda, lalu klik BUAT SET DATA.
- Dalam dialog Create dataset:
- Untuk Dataset ID, masukkan "natality_regression".
- Untuk Lokasi data, Anda dapat memilih
lokasi
untuk set data. Lokasi nilai default adalah
US multi-region
. Setelah set data dibuat, lokasi tidak dapat diubah. - Untuk Masa berlaku tabel default, pilih salah satu opsi berikut:
- Never (default): Anda harus menghapus tabel secara manual.
- Jumlah hari: Tabel akan dihapus setelah jumlah hari yang ditentukan sejak waktu pembuatannya.
- Untuk Enkripsi, pilih salah satu opsi berikut:
- Kunci yang dimiliki Google dan dikelola Google (default).
- Kunci yang dikelola pelanggan: Lihat daftar Melindungi data dengan kunci Cloud KMS.
- Klik Create dataset.
Jalankan kueri terhadap {i>dataset<i} kelahiran publik, lalu simpan kueri tersebut menghasilkan tabel baru dalam {i>dataset<i} Anda.
- Salin dan tempel kueri berikut ke dalam Editor Kueri, lalu
klik Run.
CREATE OR REPLACE TABLE natality_regression.regression_input as SELECT weight_pounds, mother_age, father_age, gestation_weeks, weight_gain_pounds, apgar_5min FROM `bigquery-public-data.samples.natality` WHERE weight_pounds IS NOT NULL AND mother_age IS NOT NULL AND father_age IS NOT NULL AND gestation_weeks IS NOT NULL AND weight_gain_pounds IS NOT NULL AND apgar_5min IS NOT NULL
- Setelah kueri selesai (dalam waktu sekitar satu menit), hasilnya
disimpan sebagai "regression_input" Tabel BigQuery
dalam set data
natality_regression
di project Anda.
- Salin dan tempel kueri berikut ke dalam Editor Kueri, lalu
klik Run.
Python
Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Python di Panduan memulai Dataproc menggunakan library klien. Untuk informasi selengkapnya, lihat API Python Dataproc dokumentasi referensi.
Untuk mengautentikasi ke Dataproc, siapkan Kredensial Default Aplikasi. Untuk informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.
Lihat Menyiapkan Lingkungan Pengembangan Python untuk mendapatkan petunjuk tentang cara menginstal Python dan Library Klien Google Cloud untuk Python (diperlukan untuk menjalankan kode). Menginstal dan menggunakan Python
virtualenv
direkomendasikan.Salin dan tempel kode
natality_tutorial.py
, di bawah, ke dalam shellpython
di komputer lokal Anda. Tekan tombol<return>
di shell untuk menjalankan kode guna membuat "natality_regression" set data BigQuery di setelan default project Google Cloud dengan "regression_input" tabel yang diisi dengan subset publik Datanatality
.Konfirmasi pembuatan set data
natality_regression
dan tabelregression_input
.
Menjalankan regresi linear
Di bagian ini, Anda akan menjalankan regresi linear PySpark dengan mengirimkan
tugas ke layanan Dataproc menggunakan konsol Google Cloud
atau dengan menjalankan perintah gcloud
dari terminal lokal.
Konsol
Salin dan tempel kode berikut ke
natality_sparkml.py
baru file di komputer lokal Anda."""Run a linear regression using Apache Spark ML. In the following PySpark (Spark Python API) code, we take the following actions: * Load a previously created linear regression (BigQuery) input table into our Cloud Dataproc Spark cluster as an RDD (Resilient Distributed Dataset) * Transform the RDD into a Spark Dataframe * Vectorize the features on which the model will be trained * Compute a linear regression using Spark ML """ from pyspark.context import SparkContext from pyspark.ml.linalg import Vectors from pyspark.ml.regression import LinearRegression from pyspark.sql.session import SparkSession # The imports, above, allow us to access SparkML features specific to linear # regression as well as the Vectors types. # Define a function that collects the features of interest # (mother_age, father_age, and gestation_weeks) into a vector. # Package the vector in a tuple containing the label (`weight_pounds`) for that # row. def vector_from_inputs(r): return (r["weight_pounds"], Vectors.dense(float(r["mother_age"]), float(r["father_age"]), float(r["gestation_weeks"]), float(r["weight_gain_pounds"]), float(r["apgar_5min"]))) sc = SparkContext() spark = SparkSession(sc) # Read the data from BigQuery as a Spark Dataframe. natality_data = spark.read.format("bigquery").option( "table", "natality_regression.regression_input").load() # Create a view so that Spark SQL queries can be run against the data. natality_data.createOrReplaceTempView("natality") # As a precaution, run a query in Spark SQL to ensure no NULL values exist. sql_query = """ SELECT * from natality where weight_pounds is not null and mother_age is not null and father_age is not null and gestation_weeks is not null """ clean_data = spark.sql(sql_query) # Create an input DataFrame for Spark ML using the above function. training_data = clean_data.rdd.map(vector_from_inputs).toDF(["label", "features"]) training_data.cache() # Construct a new LinearRegression object and fit the training data. lr = LinearRegression(maxIter=5, regParam=0.2, solver="normal") model = lr.fit(training_data) # Print the model summary. print("Coefficients:" + str(model.coefficients)) print("Intercept:" + str(model.intercept)) print("R^2:" + str(model.summary.r2)) model.summary.residuals.show()
Menyalin file
natality_sparkml.py
lokal ke Cloud Storage bucket tertentu di project Anda.gcloud storage cp natality_sparkml.py gs://bucket-name
Menjalankan regresi dari Dataproc Halaman Mengirim tugas.
Di kolom Main python file, masukkan URI
gs://
dari bucket Cloud Storage tempat salinannatality_sparkml.py
Anda file tersebut ditemukan.Pilih
PySpark
sebagai Jenis pekerjaan.Sisipkan
gs://spark-lib/bigquery/spark-bigquery-latest_2.12.jar
di kolom Jar files. Hal ini membuat konektor spark-bigquery-tersedia ke aplikasi PySpark saat runtime agar aplikasi PySpark dapat membaca BigQuery data ke dalam Spark DataFrame.Isi kolom Job ID, Region, dan Cluster.
Klik Submit untuk menjalankan tugas di cluster Anda.
Setelah tugas selesai, ringkasan model output regresi linear muncul di jendela detail Tugas Dataproc.
gcloud
Salin dan tempel kode berikut ke
natality_sparkml.py
baru file di komputer lokal Anda."""Run a linear regression using Apache Spark ML. In the following PySpark (Spark Python API) code, we take the following actions: * Load a previously created linear regression (BigQuery) input table into our Cloud Dataproc Spark cluster as an RDD (Resilient Distributed Dataset) * Transform the RDD into a Spark Dataframe * Vectorize the features on which the model will be trained * Compute a linear regression using Spark ML """ from pyspark.context import SparkContext from pyspark.ml.linalg import Vectors from pyspark.ml.regression import LinearRegression from pyspark.sql.session import SparkSession # The imports, above, allow us to access SparkML features specific to linear # regression as well as the Vectors types. # Define a function that collects the features of interest # (mother_age, father_age, and gestation_weeks) into a vector. # Package the vector in a tuple containing the label (`weight_pounds`) for that # row. def vector_from_inputs(r): return (r["weight_pounds"], Vectors.dense(float(r["mother_age"]), float(r["father_age"]), float(r["gestation_weeks"]), float(r["weight_gain_pounds"]), float(r["apgar_5min"]))) sc = SparkContext() spark = SparkSession(sc) # Read the data from BigQuery as a Spark Dataframe. natality_data = spark.read.format("bigquery").option( "table", "natality_regression.regression_input").load() # Create a view so that Spark SQL queries can be run against the data. natality_data.createOrReplaceTempView("natality") # As a precaution, run a query in Spark SQL to ensure no NULL values exist. sql_query = """ SELECT * from natality where weight_pounds is not null and mother_age is not null and father_age is not null and gestation_weeks is not null """ clean_data = spark.sql(sql_query) # Create an input DataFrame for Spark ML using the above function. training_data = clean_data.rdd.map(vector_from_inputs).toDF(["label", "features"]) training_data.cache() # Construct a new LinearRegression object and fit the training data. lr = LinearRegression(maxIter=5, regParam=0.2, solver="normal") model = lr.fit(training_data) # Print the model summary. print("Coefficients:" + str(model.coefficients)) print("Intercept:" + str(model.intercept)) print("R^2:" + str(model.summary.r2)) model.summary.residuals.show()
Menyalin file
natality_sparkml.py
lokal ke Cloud Storage bucket tertentu di project Anda.gcloud storage cp natality_sparkml.py gs://bucket-name
Kirim tugas Pyspark ke layanan Dataproc dengan menjalankan Perintah
gcloud
, yang ditampilkan di bawah, dari jendela terminal di komputer lokal Anda.- Nilai flag --jars akan menyediakan spark-bigquery-connector
ke tugas PySpark saat runtime agar tugas dapat dibaca
Data BigQuery ke dalam Spark DataFrame.
gcloud dataproc jobs submit pyspark \ gs://your-bucket/natality_sparkml.py \ --cluster=cluster-name \ --region=region \ --jars=gs://spark-lib/bigquery/spark-bigquery-with-dependencies_SCALA_VERSION-CONNECTOR_VERSION.jar
- Nilai flag --jars akan menyediakan spark-bigquery-connector
ke tugas PySpark saat runtime agar tugas dapat dibaca
Data BigQuery ke dalam Spark DataFrame.
Output regresi linear (ringkasan model) muncul di jendela terminal ketika tugas selesai.
<<< # Mencetak ringkasan model. ... cetak "Koefisien:" + str(model.coefficients) Coefficients:[0.0166657454602,-0.00296751984046,0.235714392936,0.00213002070133,-0.00048577251587] <<< cetak "Mencegat:" + str(model.intersepsi) Mencegat:-2.26130330748 <<< cetak "R^2" + str(model.summary.r2) R^2:0,295200579035 <<< model.summary.residuals.show() +--------------------+ | residual| +--------------------+ | -0,7234737533344147| | -0,985466980630501| | -0,6669710598385468| | 1,4162434829714794| |-0,09373154375186754| |-0,15461747949235072| | 0,32659061654192545| | 1,5053877697929803| | -0,640142797263989| | 1,229530260294963| |-0,03776160295256...| | -0,5160734239126814| | -1,5165972740062887| | 1,3269085258245008| | 1,7604670124710626| | 1,2348130901905972| | 2,318660276655887| | 1,0936947030883175| | 1,0169768511417363| | -1,7744915698181583| +--------------------+ yang hanya menampilkan 20 baris teratas.
Pembersihan
Setelah menyelesaikan tutorial, Anda dapat membersihkan resource yang dibuat agar resource tersebut berhenti menggunakan kuota dan dikenai biaya. Bagian berikut menjelaskan cara menghapus atau menonaktifkan resource ini.
Menghapus project
Cara termudah untuk menghilangkan penagihan adalah dengan menghapus project yang Anda buat untuk tutorial.
Untuk menghapus project:
- Di konsol Google Cloud, buka halaman Manage resource.
- Pada daftar project, pilih project yang ingin Anda hapus, lalu klik Delete.
- Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project.
Menghapus cluster Dataproc
Baca artikel Menghapus cluster.