使用 IBM Cloud Databases for PostgreSQL 作為外部 meta 儲存庫
您可以使用 IBM Cloud Databases for PostgreSQL,將 IBM Analytics Engine Spark 叢集外的 meta 資料外部化。
-
建立 IBM Cloud Databases for PostgreSQL 實例。 請參閱 Databases for PostgreSQL。
根據您的需求選擇配置。 請務必選擇 公用及專用網路兩者,以進行端點配置。 建立實例及服務實例認證之後,請記下資料庫名稱、埠、使用者名稱、密碼及憑證。
-
將 Databases for PostgreSQL 憑證上傳至您要在其中維護應用程式碼的 IBM Cloud Object Storage 儲存區。
若要存取 Databases for PostgreSQL,您需要提供用戶端憑證。 從 Databases for PostgreSQL 實例的服務認證取得 Base64 解碼的憑證,並上傳檔案 (名稱:
postgres.cert) 至特定 IBM Cloud 位置中的 Object Storage 儲存區。 稍後,您將需要下載此憑證,並使其可在 IBM Analytics Engine 實例 Spark 工作量中使用,以連接至 meta 儲存庫 -
自訂 IBM Analytics Engine 實例以包括 Databases for PostgreSQL 憑證。 請參閱 Script 型自訂作業。
此步驟會自訂 IBM Analytics Engine 實例,以讓 Databases for PostgreSQL 憑證可用於透過程式庫集針對實例執行的所有 Spark 工作量。
-
將
customization_script.py從 Script 型自訂作業 中的頁面上傳至 IBM Cloud Object Storage 儲存區。 -
執行使用 spark-submit REST API 來自訂實例的
postgres-cert-customization-submit.json。 請注意,程式碼會參照您上傳至 IBM Cloud Object Storage的postgres.cert。{ "application_details": { "application": "/opt/ibm/customization-scripts/customize_instance_app.py", "arguments": ["{\"library_set\":{\"action\":\"add\",\"name\":\"certificate_library_set\",\"script\":{\"source\":\"py_files\",\"params\":[\"https://s3.direct.<CHANGME>.cloud-object-storage.appdomain.cloud\",\"<CHANGEME_BUCKET_NAME>\",\"postgres.cert\",\"<CHANGEME_ACCESS_KEY>\",\"<CHANGEME_SECRET_KEY>\"]}}}"], "py-files": "cos://CHANGEME_BUCKET_NAME.mycosservice/customization_script.py" } }請注意,程式庫集名稱
certificate_library_set必須符合您指定的 Databases for PostgreSQL meta 儲存庫連線參數ae.spark.librarysets的值。
-
-
將下列 Databases for PostgreSQL meta 儲存庫連線參數指定為 Spark 應用程式有效負載的一部分或實例預設值。 請確定您使用下列
"spark.hadoop.javax.jdo.option.ConnectionURL"參數的專用端點:"spark.hadoop.javax.jdo.option.ConnectionDriverName": "org.postgresql.Driver", "spark.hadoop.javax.jdo.option.ConnectionUserName": "ibm_cloud_<CHANGEME>", "spark.hadoop.javax.jdo.option.ConnectionPassword": "<CHANGEME>", "spark.sql.catalogImplementation": "hive", "spark.hadoop.hive.metastore.schema.verification": "false", "spark.hadoop.hive.metastore.schema.verification.record.version": "false", "spark.hadoop.datanucleus.schema.autoCreateTables":"true", "spark.hadoop.javax.jdo.option.ConnectionURL": "jdbc:postgresql://<CHANGEME>.databases.appdomain.CHANGEME/ibmclouddb?sslmode=verify-ca&sslrootcert=/home/spark/shared/user-libs/certificate_library_set/custom/postgres.cert&socketTimeout=30", "ae.spark.librarysets":"certificate_library_set" -
在 Databases for PostgreSQL 實例中設定 Hive meta 儲存庫綱目,因為當您建立實例時,Databases for PostgreSQL 資料庫的公用綱目中沒有表格。 此步驟會執行 Hive 綱目相關 DDL,以便 meta 儲存庫資料可以儲存在其中。 執行名為
postgres-create-schema.py的下列 Spark 應用程式之後,您將看到針對實例的「公用」綱目建立的 Hive meta 資料表格。from pyspark.sql import SparkSession import time def init_spark(): spark = SparkSession.builder.appName("postgres-create-schema").getOrCreate() sc = spark.sparkContext return spark,sc def create_schema(spark,sc): tablesDF=spark.sql("SHOW TABLES") tablesDF.show() time.sleep(30) def main(): spark,sc = init_spark() create_schema(spark,sc) if __name__ == '__main__': main() -
現在,執行下列 Script (稱為
postgres-parquet-table-create.py),以在 Databases for PostgreSQL 資料庫中使用 IBM Cloud Object Storage 中的 meta 資料來建立 Parquet 表格。from pyspark.sql import SparkSession import time def init_spark(): spark = SparkSession.builder.appName("postgres-create-parquet-table-test").getOrCreate() sc = spark.sparkContext return spark,sc def generate_and_store_data(spark,sc): data =[("1","Romania","Bucharest","81"),("2","France","Paris","78"),("3","Lithuania","Vilnius","60"),("4","Sweden","Stockholm","58"),("5","Switzerland","Bern","51")] columns=["Ranking","Country","Capital","BroadBandSpeed"] df=spark.createDataFrame(data,columns) df.write.parquet("cos://<CHANGEME-BUCKET>.mycosservice/broadbandspeed") def create_table_from_data(spark,sc): spark.sql("CREATE TABLE MYPARQUETBBSPEED (Ranking STRING, Country STRING, Capital STRING, BroadBandSpeed STRING) STORED AS PARQUET location 'cos://CHANGEME-BUCKET.mycosservice/broadbandspeed/'") df2=spark.sql("SELECT * from MYPARQUETBBSPEED") df2.show() def main(): spark,sc = init_spark() generate_and_store_data(spark,sc) create_table_from_data(spark,sc) time.sleep(30) if __name__ == '__main__': main() -
執行下列稱為
postgres-parquet-table-select.py的 PySpark Script,以使用來自另一個 Spark 工作量的 meta 資料來存取此 Parquet 表格:from pyspark.sql import SparkSession import time def init_spark(): spark = SparkSession.builder.appName("postgres-select-parquet-table-test").getOrCreate() sc = spark.sparkContext return spark,sc def select_data_from_table(spark,sc): df=spark.sql("SELECT * from MYPARQUETBBSPEED") df.show() def main(): spark,sc = init_spark() select_data_from_table(spark,sc) time.sleep(60) if __name__ == '__main__': main()