公式の Apache Doris Spark コネクタを使用し、必要な設定を追加することで、EMR Serverless Spark を Doris に接続できます。このトピックでは、EMR Serverless Spark 環境で Doris からデータを読み込み、Doris にデータを書き込む方法について説明します。
背景情報
Apache Doris は高性能なリアルタイム分析データベースであり、レポート分析、アドホッククエリ、データレイク上の連合クエリアクセラレーションなどのシナリオをサポートします。詳細については、「Apache Dorisの概要」をご参照ください。
EMR Serverless Spark は、オープンソース Spark と互換性のある高性能な Lakehouse 製品であり、エンタープライズグレードのフルマネージドデータプラットフォームサービスを提供します。Apache Doris と EMR Serverless Spark を組み合わせることで、データの読み込み、書き込み、分析を効率的に行い、エンドツーエンドのデータ処理ワークフローを実装できます。
前提条件
-
Serverless Spark ワークスペースが作成されていること。詳細については、「ワークスペースの作成」をご参照ください。
-
Doris クラスターが作成されていること。
Doris サービスを含む EMR on ECS OLAP クラスターを作成する場合は、「クラスターの作成」をご参照ください。このトピックでは、EMR on ECS 上に作成された Doris クラスター (EMR Doris クラスターと呼びます) を例として使用します。
制限事項
EMR Serverless Spark エンジンのバージョンは、esr-2.6.0、esr-3.2.0、esr-4.2.0 以降である必要があります。
手順
手順 1:Doris Spark コネクタ JAR ファイルの取得と Alibaba Cloud OSS へのアップロード
Apache Doris の公式ドキュメントで Spark Doris Connector をご確認ください。ドキュメントには、コネクタのバージョンと Spark エンジンのバージョン間の互換性が記載されています。ご使用の Spark のバージョンが Doris Spark Connector のバージョンと互換性があることを確認する必要があります。
-
Doris Spark コネクタのGitHubリポジトリにアクセスし、適切なバージョンをダウンロードします。
Doris Spark コネクタの JAR ファイルは、次の命名形式に従います:
spark-doris-connector-spark-${spark_version}-${connector_version}.jar。たとえば、エンジンのバージョンが esr-3.2.0 の場合は、spark-doris-connector-spark-3.4-24.0.0.jarをダウンロードします。 -
ダウンロードした Spark コネクタ JAR ファイルを Alibaba Cloud OSS にアップロードします。詳細については、「シンプルアップロード」をご参照ください。
手順 2:ネットワーク接続の作成
EMR Serverless Spark が Doris サービスにアクセスするには、EMR Doris クラスターとのネットワーク接続を確立する必要があります。ネットワーク接続の詳細については、「EMR Serverless Spark と他の VPC 間のネットワーク接続」をご参照ください。
セキュリティグループルールを追加するときは、送信先ポート範囲 で必要なポートのみを開いてください。 有効なポート値は 1 から 65535 の範囲です。 たとえば、HTTP ポート (8031)、RPC ポート (9061)、および Webサーバーポート (8041) を開きます。
手順 3:EMR Doris クラスターでのデータベースとテーブルの作成
-
SSH を使用してクラスターにログオンします。詳細については、「クラスターへのログオン」をご参照ください。
-
次のコマンドを実行して、EMR Doris クラスターに接続します。
mysql -h127.0.0.1 -P 9031 -uroot -
データベースとテーブルを作成します。
CREATE DATABASE IF NOT EXISTS testdb; USE testdb; CREATE TABLE test ( id INT, name STRING ) PROPERTIES("replication_num" = "1"); -
テストデータを挿入します。
INSERT INTO test VALUES (1, 'a'), (2, 'b'), (3, 'c'); -
データをクエリします。
SELECT * FROM test;次の出力が返されます。
MySQL [testdb]> SELECT * FROM test; +------+------+ | id | name | +------+------+ | 1 | a | | 2 | b | | 3 | c | +------+------+ 3 rows in set (0.177 sec)
手順 4:Serverless Spark を使用した Doris テーブルの読み込み
SQL セッションを使用した Doris テーブルの読み込み
-
SQL セッションを作成します。詳細については、「SQLセッションの管理」をご参照ください。
セッションを作成する際、Engine Version ドロップダウンリストからお使いの Doris Spark Connector と一致するエンジンバージョンを選択し、Normal Network Connection にはステップ 2 で作成した接続を選択し、Spark Configuration には Doris Spark Connector をロードするために次のパラメーターを追加します。
spark.emr.serverless.user.defined.jars oss://<bucketname>/path/connector.jaross://<bucketname>/path/connector.jarを、手順 1 でアップロードした Doris Spark コネクタ JAR ファイルの OSS パスに置き換えます。例:oss://emr-oss/spark/spark-doris-connector-spark-3.4-24.0.0.jar -
Development ページで SparkSQL タスクを作成し、右上隅から作成した SQL セッションを選択します。
詳細については、「SparkSQLの開発」をご参照ください。
-
次のコードを新しい SparkSQL タブにコピーし、必要に応じてパラメーターを更新後、実行 をクリックします。
CREATE TEMPORARY VIEW test USING doris OPTIONS( "table.identifier" = "testdb.test", "fenodes" = "<doris_address>:<http_port>", "user" = "<user>", "password" = "<password>" ); SELECT * FROM test;各パラメーターの説明は次のとおりです。
パラメーター
説明
例
table.identifierDoris のテーブル識別子。
-
別の Doris クラスターを使用する場合は、それに応じてパラメーターを設定してください。
-
EMR on ECS 上に作成されたクラスターを使用する場合は、次の値を使用します。
-
table.identifier: この例ではtestdb.testを使用します。 -
<doris_address>:EMR on ECS コンソールで、Doris クラスターのNodes ページに移動し、emr-master の横にあるアイコンをクリックして、プライベート IP アドレスを確認します。 -
<http_port>: デフォルトは 8031 です。 -
<user>: デフォルトのユーザー名はrootです。 -
<password>: デフォルトのパスワードは空です。
-
<doris_address>Doris サービスを実行しているノードのプライベート IP アドレス。
<http_port>Doris が HTTP リクエストをリッスンするために使用するポート番号。
<user>Doris への接続に使用するユーザー名。
<password>Doris への接続に使用するパスワード。
データが正常に返された場合、設定は正しいです。
-
ノートブックセッションを使用した Doris テーブルの読み込み
-
ノートブックセッションを作成します。詳細については、「ノートブックセッションの管理」をご参照ください。
セッションを作成するときは、Engine Version ドロップダウンリストから、ご使用の Doris Spark Connector と一致するエンジンバージョンを選択します。Normal Network Connection で、ステップ 2 で作成した接続を選択します。Spark Configuration で、次のパラメーターを追加して Doris Spark Connector をロードします。
spark.emr.serverless.user.defined.jars oss://<bucketname>/path/connector.jaross://<bucketname>/path/connector.jarを、手順 1 でアップロードした Doris Spark コネクタ JAR ファイルの OSS パスに置き換えます。例:oss://emr-oss/spark/spark-doris-connector-spark-3.4-24.0.0.jar -
Development ページで、タイプ [インタラクティブ開発] > [Notebook] のタスクを作成し、右上隅で作成した Notebook セッションを選択します。
詳細については、「ノートブックセッションの管理」をご参照ください。
-
新しい Notebook タブに次のコードをコピーし、必要に応じてパラメーターを更新して、実行 をクリックします。
dorisSparkDF = spark.read.format("doris") \ .option("doris.table.identifier", "testdb.test") \ .option("doris.fenodes", "<doris_address>:<http_port>") \ .option("user", "<user>") \ .option("password", "<password>") \ .load() dorisSparkDF.show(3)各パラメーターの説明は次のとおりです。
パラメーター
説明
例
table.identifierDoris のテーブル識別子。
-
別の Doris クラスターを使用する場合は、それに応じてパラメーターを設定してください。
-
EMR on ECS 上に作成されたクラスターを使用する場合は、次の値を使用します。
-
table.identifier: この例ではtestdb.testを使用します。 -
<doris_address>:EMR on ECS コンソールで、Doris クラスターのNodes ページに移動し、emr-master の横にあるアイコンをクリックして、プライベート IP アドレスを確認します。 -
<http_port>: デフォルトは 8031 です。 -
<user>: デフォルトのユーザー名はrootです。 -
<password>: デフォルトのパスワードは空です。
-
<doris_address>Doris サービスを実行しているノードのプライベート IP アドレス。
<http_port>Doris が HTTP リクエストをリッスンするために使用するポート番号。
<user>Doris への接続に使用するユーザー名。
<password>Doris への接続に使用するパスワード。
testdb.test テーブルの最初の 3 行が返されます。データが正常に返された場合、設定は正しいです。
-
手順 5:Serverless Spark を使用した Doris テーブルへの書き込み
SQL セッションを使用した Doris テーブルへの書き込み
前の手順で作成した SparkSQL タブに次のコードをコピーし、必要に応じてパラメーターを更新して、実行 をクリックします。
CREATE TEMPORARY VIEW test_write
USING doris
OPTIONS(
"table.identifier" = "testdb.test",
"fenodes" = "<doris_address>:<http_port>",
"user" = "<user>",
"password" = "<password>"
);
INSERT INTO test_write VALUES (4, 'd'), (5, 'e');
SELECT * FROM test_write;
次のデータが表示された場合、書き込み操作は成功です。
期待される結果には、id と name の 2 つの列があり、5 行のデータが含まれます。行 (1, a)、(2, b)、(3, c) は元の行です。行 (4, d)、(5, e) は新しく挿入された行です。
ノートブックセッションを使用した Doris テーブルへの書き込み
前の手順で作成した Notebook タブに次のコードをコピーし、必要に応じてパラメーターを更新して、実行 をクリックします。
data = [(7, 'f'), (8, 'g')]
mockDataDF = spark.createDataFrame(data, ["id", "name"])
mockDataDF.write.mode("append").format("doris") \
.option("doris.table.identifier", "testdb.test") \
.option("doris.fenodes", "<doris_address>:<http_port>") \
.option("user", "<user>") \
.option("password", "<password>") \
.save()
dorisSparkDF = spark.read.format("doris") \
.option("doris.table.identifier", "testdb.test") \
.option("doris.fenodes", "<doris_address>:<http_port>") \
.option("user", "<user>") \
.option("password", "<password>") \
.load()
dorisSparkDF.show(10)次のデータが返された場合、書き込み操作は成功です。
+---+-----+
| id| name|
+---+-----+
| 1| a|
| 2| b|
| 3| c|
| 7| f|
| 8| g|
+---+-----+