Hologres Spark コネクタを使用すると、必要な設定を追加することで EMR Serverless Spark を Hologres に接続できます。このトピックでは、Serverless Spark 環境で Hologres のデータを読み書きする方法について説明します。
制限事項
Spark コネクタを使用するには、Hologres のバージョンが 1.3 以降である必要があります。インスタンスのバージョンは、Hologres コンソールの Instance Details ページで確認できます。インスタンスが 1.3 より前のバージョンの場合は、インスタンスをアップグレードするか、Hologres の DingTalk グループ (ID:32314975) に参加してアップグレードを依頼してください。
アクセス方法
Hologres には 2 つの方法でアクセスできます。要件に最適な方法を選択してください:
アクセス方法 | 説明 | シナリオ | 参照 |
方法 1:タスク/セッションレベルの設定 | タスクまたはセッションごとに、Hologres の接続情報 (JDBC URL、ユーザー名、パスワード、その他のパラメータ) を個別に設定します。 |
| このトピック |
方法 2:データカタログによる一元設定 (推奨) | EMR Serverless Spark の [Data Catalogs] 機能を使用して Hologres のデータカタログを追加します。カタログを追加すると、ワークスペース内のすべてのジョブとセッションは、デフォルトで許可されたデータにアクセスできます。 説明 エンジンバージョン esr-4.9.0 以降のみサポートされます。 |
|
ワークスペースで Hologres のデータに長期的かつ頻繁にアクセスする必要がある場合は、設定の繰り返しを減らし、開発効率を向上させるために、方法 2 (データカタログ) を推奨します。
操作手順
ステップ 1:hologres-connector-spark JAR の取得とアップロード
EMR Serverless Spark の esr-4.8.0 以降には、Hologres コネクタが組み込まれています。このステップは、esr-4.8.0 より前のバージョンを使用している場合にのみ必要です。
Hologres のデータを読み書きするには、Spark にコネクタの JAR ファイルが必要です。Maven Central Repository からダウンロードできます。このトピックではバージョン 1.5.6 を使用します:hologres-connector-spark-3.x-1.5.6-jar-with-dependencies.jar。
ダウンロードした hologres-connector-spark JAR ファイルを OSS にアップロードします。手順については、「シンプルアップロード」をご参照ください。
ステップ 2:ネットワーク接続の追加
ネットワーク情報を取得します。
Hologres ページに移動し、対象の Hologres インスタンスの詳細ページに移動して、VPC と vSwitch の情報を確認します。
ネットワーク接続を追加します。
Serverless Spark が Hologres にアクセスするには、Hologres クラスターへのネットワーク接続が必要です。ネットワーク接続の詳細については、「EMR Serverless Spark と他の VPC 間のネットワーク接続」をご参照ください。
ステップ 3:Hologres データベースとテーブルの作成
Hologres インスタンスに接続します。詳細については、「インスタンスへの接続」をご参照ください。
[SQL Editor] タブで、新しい一時クエリに次の SQL 文を入力して実行します。
-- データベースを作成します。 CREATE DATABASE testdb; -- テーブルを作成します。 CREATE TABLE "public"."test" ( "id" text NULL, "name" text NULL); -- データを挿入します。 INSERT INTO public.test VALUES ('1001','jack'),('1002','tony'),('1003','mike'); -- データをクエリします。 SELECT * FROM public.test
ステップ 4:Hologres データの読み書き
例 1:SQL セッション
この例では、SQL セッションを使用して Hologres のデータを読み書きする方法を示します。
SQL セッションを作成します。詳細については、「SQL セッションの管理」をご参照ください。
セッションを作成する際に、ネットワーク接続リストから前のステップで作成したネットワーク接続を選択します。Spark Configuration セクションで、hologres-connector-spark を読み込むために次のパラメータを追加します。
# hologres-connector の JAR ファイルを追加します (esr-4.8.0 より前のバージョンでのみ必要)。 spark.emr.serverless.user.defined.jars oss://<bucket>/hologres-connector-spark-3.x-<version>.jar # Hologres カタログを設定します。 spark.sql.catalog.hologres_external_test_db com.alibaba.hologres.spark3.HoloTableCatalog spark.sql.catalog.hologres_external_test_db.username *** spark.sql.catalog.hologres_external_test_db.password *** spark.sql.catalog.hologres_external_test_db.jdbcurl jdbc:postgresql://hgpostcn-cn-***-vpc-st.hologres.aliyuncs.com:80/testdb次の表にパラメータを示します。
パラメータ
例
説明
spark.emr.serverless.user.defined.jarsoss://<bucket>/hologres-connector-spark-3.x-<version>.jarユーザー定義 JAR ファイルのパスを指定します。
spark.sql.catalog.hologres_external_test_dbcom.alibaba.hologres.spark3.HoloTableCatalogSpark 3.x では、このパラメータを使用して Hologres のデータソースを外部カタログとして設定します。この値は固定です。
spark.sql.catalog.hologres_external_test_db.usernameLTAI******Alibaba Cloud アカウントの AccessKey ID です。機密情報の取り扱いには、シークレット管理の使用を推奨します。詳細については、「シークレット管理を使用した機密情報の管理」をご参照ください。
spark.sql.catalog.hologres_external_test_db.passwordmXYV******Alibaba Cloud アカウントの AccessKey Secret です。機密情報の取り扱いには、シークレット管理の使用を推奨します。詳細については、「シークレット管理を使用した機密情報の管理」をご参照ください。
spark.sql.catalog.hologres_external_test_db.jdbcurljdbc:postgresql://hgpostcn-cn-***-vpc-st.hologres.aliyuncs.com:80/testdbHologres インスタンスの JDBC 接続 URL です。
パラメーター名の
hologres_external_test_dbの部分をカスタマイズできます。[Data Development] ページで [SparkSQL] ジョブを作成し、右上から作成した SQL セッションを選択します。
詳細については、「SparkSQL 開発」をご参照ください。
次のコードを新しい SparkSQL タブに貼り付け、Run をクリックします。
-- hologres_external_test_db カタログに切り替えます。 USE hologres_external_test_db; -- データを書き込みます。 INSERT INTO `public`.test VALUES ('1004','tom'); -- データをクエリします。 SELECT * FROM `public`.test;
例 2:ストリーミングジョブ
この PySpark の例では、Kafka からデータを読み取り、ストリーミングジョブとして Hologres に書き込む方法を示します。
Kafka と Hologres 間のネットワーク接続が確立されていることを確認してください。Kafka と Hologres は、同一の VPC と vSwitch にデプロイすることを推奨します。
このコード例では、Kafka の情報と Hologres のテーブルを実際の値に置き換えてください。
from pyspark.sql import SparkSession from pyspark.sql.functions import col # Kafka 情報を設定します。 servers = "alikafka-serverless-cn-xxxxx-vpc.alikafka.aliyuncs.com:9092" # Kafka ブートストラップサーバーに置き換えてください。 topic = "topic-name" # Kafka トピックに置き換えてください。 # SparkSession を作成します。 spark = SparkSession.builder \ .appName("test read kafka") \ .getOrCreate() # Kafka ストリームを読み取ります。 df = spark \ .readStream \ .format("kafka") \ .option("kafka.bootstrap.servers", servers) \ .option("subscribe", topic) \ .load() # Hologres に書き込む関数を定義します (マイクロバッチごとに呼び出されます)。 def write_to_hologres(batch_df, batch_id): print(f"Writing batch {batch_id} to Hologres...") batch_df.write \ .mode("append") \ .insertInto("hologres_external_test_db.public.test") # Hologres テーブルに置き換えてください。 # キーと値を文字列に変換してストリームを書き込みます。 query = df.selectExpr("CAST(key AS STRING)", "CAST(value AS STRING)") \ .writeStream \ .foreachBatch(write_to_hologres) \ .outputMode("append") \ .trigger(processingTime='30 seconds') \ .start() # ストリーミングクエリが終了するのを待ちます (これにより、ノートブックでのセル実行がブロックされます)。 query.awaitTermination()ファイルをアップロードします。
Artifacts ページで Upload File をクリックします。
Upload File ダイアログボックスで、アップロード領域をクリックして前のステップの Python ファイルを選択するか、ファイルをアップロード領域にドラッグします。
ストリーミングジョブを作成して実行します。
Development ページで、
(Create) アイコンをクリックします。表示されるダイアログボックスで Name を入力し、Application (Streaming) リストから PySpark を選択して、OK をクリックします。
新しい開発タブで、次のパラメータを設定し、その他は既定値のままにします。その後、Publish をクリックします。
パラメータ
説明
[Main Python Resources]
前のステップでアップロードした Python ファイルを選択します。
Engine Version
互換性のある Spark バージョンを選択します。この例では
esr-4.6.0を使用します。Network Connection
ステップ 2 で作成したネットワーク接続を選択します。
[Spark Configuration]
# hologres-connector の JAR ファイルを追加します (esr-4.8.0 より前のバージョンでのみ必要)。 spark.emr.serverless.user.defined.jars oss://<bucket>/test_script/hologres-connector-spark-3.x-1.5.6-jar-with-dependencies.jar # Hologres カタログを設定します。 spark.sql.catalog.hologres_external_test_db com.alibaba.hologres.spark3.HoloTableCatalog spark.sql.catalog.hologres_external_test_db.username *** spark.sql.catalog.hologres_external_test_db.password *** spark.sql.catalog.hologres_external_test_db.jdbcurl jdbc:postgresql://hgpostcn-cn-***-vpc-st.hologres.aliyuncs.com:80/testdbパラメータの詳細については、「例 1:SQL セッション」をご参照ください。
ジョブを公開したら、Go to O&M をクリックします。開いたページで Start をクリックします。
結果を確認します。
Kafka にメッセージを送信します。

Spark SQL を使用してデータをクエリします。

例 3:ノートブックセッション
ノートブックセッションを作成します。詳細については、「ノートブックセッションの管理」をご参照ください。
セッションを作成する際に、ネットワーク接続リストから前のステップで作成したネットワーク接続を選択します。Spark Configuration セクションで、hologres-connector-spark を読み込むために次のパラメータを追加します。
# hologres-connector の JAR ファイルを追加します (esr-4.8.0 より前のバージョンでのみ必要)。 spark.emr.serverless.user.defined.jars oss://<bucket>/hologres-connector-spark-3.x-<version>.jar[Data Development] ページで [Notebook] ジョブを作成し、右上から作成したノートブックセッションを選択します。
次のコードを新しい Notebook タブに貼り付け、
をクリックします。import pandas as pd from pyspark.sql import SparkSession from pyspark.sql.types import StructType, StructField, StringType, IntegerType, LongType # 1. Pandas DataFrame を準備します。 pdf = pd.DataFrame({ "id": ["1006"], "name": ["sl"] }) # 2. PySpark DataFrame に変換します。 # (任意:データ型を正しくするために、スキーマを明示的に定義します) schema = StructType([ StructField("id", StringType(), True), StructField("name", StringType(), True) ]) df = spark.createDataFrame(pdf, schema=schema) # Hologres に書き込みます。 df.write \ .format("hologres") \ .option("username", "LTAI******") \ .option("password", "mXYV******") \ .option("jdbcurl", "jdbc:postgresql://hgpostcn-cn-***-vpc-st.hologres.aliyuncs.com:80/testdb") \ .option("table", "test") \ .mode("append") \ .save() # データを読み取ります。 readDf = spark.read\ .format("hologres") \ .option("username", "LTAI******") \ .option("password", "mXYV******") \ .option("jdbcurl", "jdbc:postgresql://hgpostcn-cn-***-vpc-st.hologres.aliyuncs.com:80/testdb") \ .option("table", "test") \ .load() readDf.select("id", "name").show(10)次の表にパラメータを示します。
パラメータ
例
説明
ユーザー名LTAI******Alibaba Cloud アカウントの AccessKey ID です。機密情報の取り扱いには、シークレット管理の使用を推奨します。詳細については、「シークレット管理を使用した機密情報の管理」をご参照ください。
パスワードmXYV******Alibaba Cloud アカウントの AccessKey Secret です。機密情報の取り扱いには、シークレット管理の使用を推奨します。詳細については、「シークレット管理を使用した機密情報の管理」をご参照ください。
jdbcurljdbc:postgresql://hgpostcn-cn-***-vpc-st.hologres.aliyuncs.com:80/testdbHologres インスタンスの JDBC 接続 URL です。
結果を確認します。

一般的な Hologres カタログコマンド
Serverless Spark では、Hologres カタログを使用して、Hologres データベースを Spark SQL の 外部カタログ として接続します。各カタログは 1 つの Hologres データベースに厳密にバインドされており、データベース間のアクセスはサポートされません (同一のカタログで複数の Hologres データベースにアクセスすることはできません)。カタログ内の論理構造は Hologres と一致します:
Spark の概念 | Hologres の概念 | 説明 |
カタログ | データベース | たとえば、 |
名前空間 | スキーマ | たとえば、 |
テーブル | テーブル | テーブル名を直接参照する前に、 |
Hologres カタログの使用
Spark の Hologres カタログは、1 つの Hologres データベースにのみマッピングされ、作成後に変更できません。
USE hologres_external_test_db;すべての名前空間の表示
Spark では、名前空間は Hologres のスキーマに対応します。デフォルトのスキーマは public です。USE コマンドを使用して、セッションのデフォルトスキーマを変更できます。
-- Hologres カタログ内のすべての名前空間を表示します。これは、Hologres 内のすべてのスキーマに対応します。
SHOW NAMESPACES;名前空間内のテーブルの表示
すべてのテーブルを表示します。
SHOW TABLES;特定の名前空間内のテーブルを表示します。
USE test_schema; SHOW TABLES; -- または以下を使用します: SHOW TABLES IN test_schema;
関連ドキュメント
Spark を使用して Hologres のデータを読み書きする方法の詳細については、「Spark を使用した Hologres データの読み書き」をご参照ください。