使用 IBM Cloud Databases for PostgreSQL 作為外部 meta 儲存庫 

您可以使用 IBM Cloud Databases for PostgreSQL,將 IBM Analytics Engine Spark 叢集外的 meta 資料外部化。

  1. 建立 IBM Cloud Databases for PostgreSQL 實例。 請參閱 Databases for PostgreSQL

    根據您的需求選擇配置。 請務必選擇 公用及專用網路兩者,以進行端點配置。 建立實例及服務實例認證之後,請記下資料庫名稱、埠、使用者名稱、密碼及憑證。

  2. 將 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 儲存庫

  3. 自訂 IBM Analytics Engine 實例以包括 Databases for PostgreSQL 憑證。 請參閱 Script 型自訂作業

    此步驟會自訂 IBM Analytics Engine 實例,以讓 Databases for PostgreSQL 憑證可用於透過程式庫集針對實例執行的所有 Spark 工作量。

    1. customization_script.pyScript 型自訂作業 中的頁面上傳至 IBM Cloud Object Storage 儲存區。

    2. 執行使用 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 的值。

  4. 將下列 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"
    
  5. 在 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()
    
  6. 現在,執行下列 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()
    
  7. 執行下列稱為 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()