IBM Cloud Databases for PostgreSQL als externen Metaspeicher verwenden
Sie können IBM Cloud Databases for PostgreSQL verwenden, um Metadaten außerhalb des Spark-Clusters von IBM Analytics Engine auszulagern.
-
Erstellen Sie eine IBM Cloud Databases for PostgreSQL-Instanz. Siehe Databases for PostgreSQL.
Wählen Sie die Konfigurationen basierend auf Ihren Anforderungen aus. Stellen Sie sicher, dass Sie Öffentliches und privates Netz für die Endpunktkonfiguration auswählen. Notieren Sie nach dem Erstellen der Instanz und der Berechtigungsnachweise für die Serviceinstanz den Datenbanknamen, den Port, den Benutzernamen, das Kennwort und das Zertifikat.
-
Laden Sie das Zertifikat Databases for PostgreSQL in ein IBM Cloud Object Storage-Bucket hoch, in dem Sie Ihren Anwendungscode verwalten.
Für den Zugriff auf Databases for PostgreSQLmüssen Sie ein Clientzertifikat bereitstellen. Rufen Sie das decodierte Zertifikat Base64 aus den Serviceberechtigungsnachweisen der Databases for PostgreSQL-Instanz ab und laden Sie die Datei hoch (z. B.
postgres.cert) zu einem Object Storage-Bucket an einer bestimmten IBM Cloud-Position. Zu einem späteren Zeitpunkt müssen Sie dieses Zertifikat herunterladen und in den Spark-Workloads der IBM Analytics Engine-Instanz verfügbar machen, um eine Verbindung zum Metaspeicher herzustellen -
Passen Sie die IBM Analytics Engine-Instanz so an, dass sie das Zertifikat Databases for PostgreSQL enthält. Siehe Scriptbasierte Anpassung.
Mit diesem Schritt wird die IBM Analytics Engine-Instanz angepasst, um das Zertifikat Databases for PostgreSQL für alle Spark-Workloads verfügbar zu machen, die über die Bibliotheksgruppe für die Instanz ausgeführt werden.
-
Laden Sie
customization_script.pyvon der Seite in Scriptbasierte Anpassung in ein IBM Cloud Object Storage-Bucket hoch. -
Führen Sie
postgres-cert-customization-submit.jsonaus, das die REST-API 'spark-submit' verwendet, um die Instanz anzupassen. Beachten Sie, dass der Code aufpostgres.certverweist, den Sie in IBM Cloud Object Storagehochgeladen haben.{ "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" } }Beachten Sie, dass der Bibliotheksgruppenname
certificate_library_setdem Wert des Databases for PostgreSQL-Metaspeicherverbindungsparametersae.spark.librarysetsentsprechen muss, den Sie angegeben haben.
-
-
Geben Sie die folgenden Databases for PostgreSQL-Metaspeicherverbindungsparameter als Teil der Spark-Anwendungsnutzdaten oder als Instanzstandardwerte an. Stellen Sie sicher, dass Sie den privaten Endpunkt für den folgenden Parameter
"spark.hadoop.javax.jdo.option.ConnectionURL"verwenden:"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" -
Richten Sie das Hive-Metaspeicherschema in der Instanz Databases for PostgreSQL ein, da das öffentliche Schema der Databases for PostgreSQL-Datenbank keine Tabellen enthält, wenn Sie die Instanz erstellen. In diesem Schritt wird die Hive-schemabezogene DDL ausgeführt, sodass Metaspeicherdaten in ihnen gespeichert werden können. Nach der Ausführung der folgenden Spark-Anwendung mit dem Namen
postgres-create-schema.pywerden die Hive-Metadatentabellen angezeigt, die für das öffentliche Schema der Instanz erstellt wurden.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() -
Führen Sie jetzt das folgende Script namens
postgres-parquet-table-create.pyaus, um eine Parquet-Tabelle mit Metadaten aus IBM Cloud Object Storage in der Datenbank Databases for PostgreSQL zu erstellen.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() -
Führen Sie das folgende PySpark-Script
postgres-parquet-table-select.pyaus, um auf diese Parquet-Tabelle mit Metadaten aus einer anderen Spark-Workload zuzugreifen: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()