すべてのプロダクト
Search
ドキュメントセンター

AnalyticDB:Apache Spark Confidential Computing Engine の高性能版の使用例

最終更新日:Mar 01, 2026

AnalyticDB for MySQL 常時秘匿コンピュートエンジンの高性能版は、Basic Edition の機能を基盤として構築されています。Parquet モジュラー暗号化機能をサポートし、コミュニティ版の Spark、Hadoop、Hive などのコンピュートエンジンと互換性があります。このエディションは、安全なデータ転送とストレージを保証し、データ処理効率を向上させます。このトピックでは、Apache Spark 常時秘匿コンピュートエンジンの高性能版を使用してデータを暗号化し、暗号文テーブルに対して SQL クエリを実行する方法について説明します。

前提条件

データ準備

暗号化するデータファイルは Parquet フォーマットである必要があります。以下の手順を完了するには、Spark Confidential Computing サンプルデータをダウンロードしてください。

操作手順

プレーンテキストデータは、AnalyticDB for MySQL コンソールで暗号化するか、暗号化ツールを使用して暗号化できます。暗号化したいデータがオンプレミスデバイスに保存されている場合は、暗号化ツールを使用してデータを暗号化できます。データがクラウドデータベースに保存されている場合は、AnalyticDB for MySQL コンソールでデータを暗号化できます。暗号化方法によって操作が異なります:

  • コンソールでのデータ暗号化:プレーンテキストデータを OSS にアップロードしてから暗号化します。

  • 暗号化ツールを使用したデータ暗号化:データをローカルで暗号化してから、暗号文を OSS にアップロードします。

コンソールでのデータ暗号化と暗号文テーブルの作成

  1. データ準備」セクションのプレーンテキストデータを OSS バケットにアップロードします。この例では oss://testBucketName/adb/Spark/customer を使用します。詳細については、「単純アップロード」をご参照ください。

  2. AnalyticDB for MySQL コンソールにログインします。コンソールの左上でリージョンを選択します。左側のナビゲーションウィンドウで、クラスターリスト をクリックします。管理するクラスターを見つけて、クラスター ID をクリックします。

  3. 左側のナビゲーションウィンドウで、[ジョブ開発] > [SQL 開発] を選択します。

  4. [SQLConsole] ウィンドウで、Spark エンジンとジョブリソースグループを選択します。

  5. 次の文を実行して、暗号文テーブルを作成します。

    1. Confidential Computing を有効にし、カスタマーマスターキーを設定して、データベースを作成します。

      -- ネイティブコンピューティングを有効にします。
      SET spark.adb.native.enabled=true;
      -- リソースを設定します。
      SET spark.driver.resourceSpec=medium;
      SET spark.executor.instances=2;
      SET spark.executor.resourceSpec=medium;
      SET spark.app.name=Spark SQL Encryption Test;
      -- 暗号文の読み書きを有効にし、マスターキーのリスト、KMS クライアント、CryptoFactory を設定します。これを有効にすると、エンジンはプレーンテキストと暗号文の両方をサポートします。
      SET spark.hadoop.parquet.encryption.key.list=kf:MDEyMzQ1Njc4OTAxMjM0****,kc1:bvCDwqcOJGSdZSEMLjfk****,kc2:kflI/sq+uf50Qhl1MmtG****;
      SET spark.hadoop.parquet.encryption.kms.client.class=io.glutenproject.encryption.InMemoryKMS;
      SET spark.hadoop.parquet.crypto.factory.class=org.apache.parquet.crypto.keytools.PropertiesDrivenCryptoFactory;
      -- データベースを作成します。
      CREATE database IF NOT EXISTS adb_external_db;

      パラメーターの説明:

      パラメーター

      説明

      spark.hadoop.parquet.encryption.key.list

      カスタマーマスターキー (CMK) のリスト。CMK はキー ID に対応します。複数の CMK はカンマ (,) で区切ります。各キー ID と CMK はコロン (:) で区切ります。フォーマット:<キー ID 1>:<Base64 エンコードされた CMK 1>,<キー ID 2>:<Base64 エンコードされた CMK 2>。詳細については、「キーの概要」をご参照ください。

      この例では kf:MDEyMzQ1Njc4OTAxMjdy****,kc1:bvCDwqcOJGSdZSEMLjfk****,kc2:kflI/sq+uf50Qhl1MmtG**** を使用します

      警告

      OpenSSL などの汎用ツールを使用して、カスタマーマスターキーをランダムに生成できます。カスタマーマスターキーは、暗号化されたデータにアクセスするためのルート認証情報です。キーを紛失すると、既存のデータにアクセスできなくなります。カスタマーマスターキーは安全に保管してください。

      spark.hadoop.parquet.encryption.kms.client.class

      KMS クライアントのクラス名。これを io.glutenproject.encryption.InMemoryKMS に設定します。

      spark.hadoop.parquet.crypto.factory.class

      CryptoFactory のクラス名。これを org.apache.parquet.crypto.keytools.PropertiesDrivenCryptoFactory に設定します。

    2. プレーンテキストデータを格納するために、customer という名前の外部テーブルを作成します。LOCATION パラメーターは、プレーンテキストデータの OSS パスを指定します。この例では、oss://testBucketName/adb/Spark/customer を使用します。

      SET spark.adb.native.enabled=true;
      SET spark.hadoop.parquet.encryption.key.list=kf:MDEyMzQ1Njc4OTAxMjM0****,kc1:bvCDwqcOJGSdZSEMLjfk****,kc2:kflI/sq+uf50Qhl1MmtG****;
      SET spark.hadoop.parquet.encryption.kms.client.class=io.glutenproject.encryption.InMemoryKMS;
      SET spark.hadoop.parquet.crypto.factory.class=org.apache.parquet.crypto.keytools.PropertiesDrivenCryptoFactory;
      CREATE TABLE IF NOT EXISTS adb_external_db.customer 
       (
          c_custkey long,
          c_name       string,
          c_address    string,
          c_nationkey long,
          c_phone      string,
          c_acctbal    decimal(12, 2),
          c_mktsegment string,
          c_comment    string
      )
      USING parquet 
      LOCATION 'oss://testBucketName/adb/Spark/customer';
      説明
      • adb_external_db データベースにプレーンテキストテーブルが既に存在する場合、このステップはスキップできます。

      • データが別のクラウドデータベースに保存されている場合は、対応する外部テーブルを作成します。外部テーブルを作成する構文については、「CREATE EXTERNAL TABLE」をご参照ください。

    3. 暗号文データを格納するために、enc_customer という名前の外部テーブルを作成します。この例では、enc_customer 外部テーブルは oss://testBucketName/adb/Spark/enc_customer に格納されます。

      SET spark.adb.native.enabled=true;
      SET spark.hadoop.parquet.encryption.key.list=kf:MDEyMzQ1Njc4OTAxMjM0****,kc1:bvCDwqcOJGSdZSEMLjfk****,kc2:kflI/sq+uf50Qhl1MmtG****;
      SET spark.hadoop.parquet.encryption.kms.client.class=io.glutenproject.encryption.InMemoryKMS;
      SET spark.hadoop.parquet.crypto.factory.class=org.apache.parquet.crypto.keytools.PropertiesDrivenCryptoFactory;
      CREATE TABLE IF NOT EXISTS adb_external_db.enc_customer
      USING Parquet
      OPTIONS (
       'parquet.encryption.column.keys'='kc1:c_name;kc2:c_phone',
       'parquet.encryption.footer.key'='kf'
      )
      LOCATION 'oss://testBucketName/adb/Spark/enc_customer'
      AS
      SELECT *
      FROM adb_external_db.customer;

      パラメーターの説明:

      パラメーター

      必須

      説明

      parquet.encryption.column.keys

      はい

      キー ID に対応する CMK を使用して列を暗号化します。1 つの CMK で複数の列を暗号化できます。キー ID と列名はコロン (:) で区切ります。複数の列はカンマ (,) で区切ります。異なる CMK はセミコロン (;) で区切ります。

      parquet.encryption.footer.key

      はい

      フッターキー。Parquet ファイルのメタデータなどの情報を暗号化するために使用されます。

      説明

      フッターは Parquet ファイルの末尾にあるデータ構造です。通常、バージョン番号、グループメタデータ、列メタデータ、キーメタデータなどのファイルメタデータを格納します。

      重要

      parquet.encryption.column.keysparquet.encryption.footer.key パラメーターは同時に設定する必要があります。そうしないと、ファイルは暗号化されません。

    4. (オプション) 外部テーブル customer を削除します。

      DROP TABLE IF EXISTS adb_external_db.customer;
      重要

      DROP TABLE 文は、customer 外部テーブルのメタデータのみを削除します。プレーンテキストデータの漏洩を防ぐには、対応するデータファイルを OSS から手動で削除する必要があります。

  6. enc_customer_output という名前の外部テーブルを作成し、enc_customer テーブルからの SQL 計算結果を enc_customer_output 外部テーブルに書き込みます。enc_customer_output 外部テーブルのデータは oss://testBucketName/adb/Spark/enc_customer_output に格納されます。

    SET spark.adb.native.enabled=true;
    SET spark.hadoop.parquet.encryption.key.list=kf:MDEyMzQ1Njc4OTAxMjM0****,kc1:bvCDwqcOJGSdZSEMLjfk****,kc2:kflI/sq+uf50Qhl1MmtG****;
    SET spark.hadoop.parquet.encryption.kms.client.class=io.glutenproject.encryption.InMemoryKMS;
    SET spark.hadoop.parquet.crypto.factory.class=org.apache.parquet.crypto.keytools.PropertiesDrivenCryptoFactory;
    CREATE TABLE IF NOT EXISTS adb_external_db.enc_customer_output
    USING Parquet
    OPTIONS (
     'parquet.encryption.column.keys'='kc1:c_name;kc2:c_phone',
     'parquet.encryption.footer.key'='kf'
    )
    LOCATION 'oss://testBucketName/adb/Spark/enc_customer_output'
    AS
    SELECT *
    FROM adb_external_db.enc_customer
    WHERE 
    c_custkey < 15;
  7. 計算結果を復号します。

    1. customer_output という名前の外部テーブルを作成します。enc_customer_output テーブルのデータを復号し、復号したデータを customer_output 外部テーブルに書き込みます。customer_output 外部テーブルのデータは oss://testBucketName/adb/Spark/customer_output に格納されます。

      SET spark.adb.native.enabled=true;
      SET spark.hadoop.parquet.encryption.key.list=kf:MDEyMzQ1Njc4OTAxMjM0****,kc1:bvCDwqcOJGSdZSEMLjfk****,kc2:kflI/sq+uf50Qhl1MmtG****;
      SET spark.hadoop.parquet.encryption.kms.client.class=io.glutenproject.encryption.InMemoryKMS;
      SET spark.hadoop.parquet.crypto.factory.class=org.apache.parquet.crypto.keytools.PropertiesDrivenCryptoFactory;
      CREATE TABLE IF NOT EXISTS adb_external_db.customer_output
      USING Parquet
      LOCATION 'oss://testBucketName/adb/Spark/customer_output'
      AS
      SELECT *
      FROM adb_external_db.enc_customer_output;
    2. customer_output テーブルのデータをクエリします。

      SELECT * FROM adb_external_db.customer_output;

暗号化ツールを使用したデータ暗号化と暗号文テーブルの作成

  1. 暗号化ツールを使用して、ローカルに保存されているプレーンテキストデータを暗号文データセットに暗号化します。暗号化ツールの詳細については、「Spark 暗号化ツール」をご参照ください。

    import org.apache.spark.sql.SparkSession
    import org.apache.spark.sql.functions._
    import org.apache.spark.SparkConf
    
    // SparkSession を初期化し、暗号化および復号パラメーターを入力します。
    val conf = new SparkConf()
    .set("spark.hadoop.parquet.encryption.kms.client.class", "org.apache.parquet.crypto.keytools.mocks.InMemoryKMS")
    .set("spark.hadoop.parquet.encryption.key.list", "kf:MDEyMzQ1Njc4OTAxMjM0****,kc1:bvCDwqcOJGSdZSEMLjfk****,kc2:kflI/sq+uf50Qhl1MmtG****")
    .set("spark.hadoop.parquet.crypto.factory.class", "org.apache.parquet.crypto.keytools.PropertiesDrivenCryptoFactory")
    
    val spark = SparkSession.builder().appName("SquareDataFrame").config(conf).getOrCreate()
    
    // プレーンテキストの customer ファイルを読み取ります。
    val df = spark.read.parquet("customer")
    // プレーンテキストの customer ファイルを暗号化します。name 列は kc1 で暗号化され、フッターは kf で暗号化されます。結果の暗号文ファイルは enc_customer です。
    df.write
    .option("parquet.encryption.column.keys" , "kc1:c_name")
    .option("parquet.encryption.footer.key" , "kf")
    // 暗号文データセットが保存されるローカルパス。
    .parquet("enc_customer")

    パラメーターの説明:

    パラメーター

    必須

    説明

    spark.hadoop.parquet.encryption.kms.client.class

    はい

    KMS クライアントのクラス名。

    • データをローカルで暗号化する場合は、これを org.apache.parquet.crypto.keytools.mocks.InMemoryKMS に設定します。

    • コンソールで暗号文テーブルを作成する場合は、これを io.glutenproject.encryption.InMemoryKMS に設定します。

    spark.hadoop.parquet.encryption.key.list

    はい

    CMK のリスト。CMK はキー ID に対応します。複数の CMK はカンマ (,) で区切ります。各キー ID と CMK はコロン (:) で区切ります。フォーマット:<キー ID 1>:<Base64 エンコードされた CMK 1>,<キー ID 2>:<Base64 エンコードされた CMK 2>。詳細については、「キーの概要」をご参照ください。

    この例では kf:MDEyMzQ1Njc4OTAxMjdy****,kc1:bvCDwqcOJGSdZSEMLjfk****,kc2:kflI/sq+uf50Qhl1MmtG**** を使用します

    警告

    OpenSSL などの汎用ツールを使用して、カスタマーマスターキーをランダムに生成できます。カスタマーマスターキーは、暗号化されたデータにアクセスするためのルート認証情報です。キーを紛失すると、既存のデータにアクセスできなくなります。カスタマーマスターキーは安全に保管してください。

    spark.hadoop.parquet.crypto.factory.class

    はい

    CryptoFactory のクラス名。これを org.apache.parquet.crypto.keytools.PropertiesDrivenCryptoFactory に設定します。

    parquet.encryption.column.keys

    はい

    キー ID に対応する CMK を使用して列を暗号化します。1 つの CMK で複数の列を暗号化できます。キー ID と列名はコロン (:) で区切ります。複数の列はカンマ (,) で区切ります。異なる CMK はセミコロン (;) で区切ります。

    parquet.encryption.footer.key

    はい

    フッターキー。Parquet ファイルのメタデータなどの情報を暗号化するために使用されます。

    説明

    フッターは Parquet ファイルの末尾にあるデータ構造です。通常、バージョン番号、グループメタデータ、列メタデータ、キーメタデータなどのファイルメタデータを格納します。

  2. 暗号文データセット enc_customer.parquet を OSS にアップロードします。この例では oss://testBucketName/adb/Spark/enc_customer.parquet を使用します。詳細については、「単純アップロード」をご参照ください。

  3. 暗号文テーブルを作成します。

    1. AnalyticDB for MySQL コンソールにログインします。コンソールの左上でリージョンを選択します。左側のナビゲーションウィンドウで、クラスターリスト をクリックします。管理するクラスターを見つけて、クラスター ID をクリックします。

    2. 左側のナビゲーションウィンドウで、[ジョブ開発] > [SQL 開発] を選択します。

    3. [SQLConsole] タブで、Spark エンジンとジョブリソースグループを選択します。

    4. 次の文を実行して、暗号文テーブルを作成します。

      1. ネイティブコンピューティングを有効にし、データベースを作成できます。

        -- ネイティブコンピューティングを有効にします。
        SET spark.adb.native.enabled=true;
        -- リソースを設定します。
        SET spark.driver.resourceSpec=medium;
        SET spark.executor.instances=2;
        SET spark.executor.resourceSpec=medium;
        -- 暗号文の読み書きを有効にし、マスターキーのリスト、KMS クライアント、CryptoFactory を設定します。これを有効にすると、エンジンはプレーンテキストと暗号文の両方をサポートします。
        SET spark.hadoop.parquet.encryption.key.list=kf:MDEyMzQ1Njc4OTAxMjM0****,kc1:bvCDwqcOJGSdZSEMLjfk****,kc2:kflI/sq+uf50Qhl1MmtG****;
        SET spark.hadoop.parquet.encryption.kms.client.class=io.glutenproject.encryption.InMemoryKMS;
        SET spark.hadoop.parquet.crypto.factory.class=org.apache.parquet.crypto.keytools.PropertiesDrivenCryptoFactory;
        -- データベースを作成します。
        CREATE DATABASE IF NOT EXISTS adb_external_db;
      2. 外部テーブル enc_customer を作成します。LOCATION パラメーターは、enc_customer 暗号文データセットの OSS パスを指定します。この例では oss://testBucketName/adb/Spark/enc_customer.parquet を使用します。

        SET spark.adb.native.enabled=true;
        SET spark.hadoop.parquet.encryption.key.list=kf:MDEyMzQ1Njc4OTAxMjM0****,kc1:bvCDwqcOJGSdZSEMLjfk****,kc2:kflI/sq+uf50Qhl1MmtG****;
        SET spark.hadoop.parquet.encryption.kms.client.class=io.glutenproject.encryption.InMemoryKMS;
        SET spark.hadoop.parquet.crypto.factory.class=org.apache.parquet.crypto.keytools.PropertiesDrivenCryptoFactory;
        CREATE TABLE IF NOT EXISTS adb_external_db.enc_customer 
        USING parquet
        LOCATION  'oss://testBucketName/adb/Spark/enc_customer';
  4. enc_customer_output という名前の外部テーブルを作成し、enc_customer テーブルからの SQL クエリ結果を enc_customer_output 外部テーブルに書き込みます。enc_customer_output テーブルのデータは oss://testBucketName/adb/Spark/enc_customer_output に格納されます。

    SET spark.adb.native.enabled=true;
    SET spark.hadoop.parquet.encryption.key.list=kf:MDEyMzQ1Njc4OTAxMjM0****,kc1:bvCDwqcOJGSdZSEMLjfk****,kc2:kflI/sq+uf50Qhl1MmtG****;
    SET spark.hadoop.parquet.encryption.kms.client.class=io.glutenproject.encryption.InMemoryKMS;
    SET spark.hadoop.parquet.crypto.factory.class=org.apache.parquet.crypto.keytools.PropertiesDrivenCryptoFactory;
    CREATE TABLE IF NOT EXISTS adb_external_db.enc_customer_output
    USING Parquet
    OPTIONS (
     'parquet.encryption.column.keys'='kc1:c_name;kc2:c_phone',
     'parquet.encryption.footer.key'='kf'
    )
    LOCATION 'oss://testBucketName/adb/Spark/enc_customer_output'
    AS
    SELECT *
    FROM adb_external_db.enc_customer
    WHERE 
    c_custkey < 15;
  5. 暗号文の結果をダウンロードして復号します。

    1. OSS パス oss://testBucketName/adb/Spark/enc_customer_output から暗号文の計算結果をローカルデバイスにダウンロードします。詳細については、「ファイルのダウンロード」をご参照ください。

    2. 暗号文の結果データセットを復号し、復号したファイルを customer_output として保存します。

      // 暗号文データセットを復号します。
      val conf = new SparkConf()
      .set("spark.hadoop.parquet.encryption.kms.client.class", "org.apache.parquet.crypto.keytools.mocks.InMemoryKMS")
      .set("spark.hadoop.parquet.encryption.key.list", "kf:MDEyMzQ1Njc4OTAxMjM0****,kc1:bvCDwqcOJGSdZSEMLjfk****,kc2:kflI/sq+uf50Qhl1MmtG****")
      .set("spark.hadoop.parquet.crypto.factory.class", "org.apache.parquet.crypto.keytools.PropertiesDrivenCryptoFactory")
      val spark = SparkSession.builder().appName("SquareDataFrame").config(conf).getOrCreate()
      val df2 = spark.read.parquet("enc_customer_output")
      // 復号したファイルをローカルデバイスにダウンロードします。
      df2.write
      .parquet("customer_output")