このトピックでは、EMR on ECS 環境で Paimon 仮想ファイルシステム (PVFS) にアクセスする方法について説明します。
前提条件
バージョン 5.12.0 以降の EMR クラスターが作成され、Spark3 および Paimon コンポーネントが選択されていること。異なるバージョンが必要な場合は、DingTalk グループ (ID: 106575000021) に参加して DLF 開発者に連絡してください。
DLF カタログが作成されています。
EMR クラスターと DLF サービスが同じリージョンにあり、EMR クラスターの VPC が DLF ホワイトリストに追加されていること。
ロールへの DLF 権限の付与
AliyunECSInstanceForEMRRole ロールに RAM 権限を付与します。EMR プロダクト化統合が完了した後は、このステップをスキップできます。
Alibaba Cloud アカウントまたは RAM 管理者として、Resource Access Management (RAM) コンソールにログインします。
をクリックします。AliyunECSInstanceForEMRRole ロールを検索します。
[操作] 列で、[承認の追加] をクリックします。[承認の追加] ページが開きます。
[アクセス権限ポリシー] で、AliyunDLFFullAccess を検索して選択し、[承認の確認] をクリックします。

DLF カタログに対する AliyunECSInstanceForEMRRole ロールの権限を付与します。
Data Lake Formation コンソールにログインします。
[カタログ] リストページで、カタログ名をクリックしてカタログ詳細ページを開きます。
[権限] タブをクリックし、[承認] をクリックします。
[承認] ページで、次のパラメーターを設定し、[OK] をクリックします。
[プリンシパル]: RAM ユーザー/RAM ロールを選択します。
[プリンシパルの選択]: ドロップダウンリストから AliyunECSInstanceForEMRRole を選択します。
説明AliyunECSInstanceForEMRRole がドロップダウンリストにない場合は、ユーザー管理ページに移動して [同期] をクリックします。
[事前設定された権限タイプ]: Data Editor を選択します。
クラスター Paimon 依存関係のアップグレード
次の依存関係パッケージをバージョン 1.3 以降にアップグレードします。
ご利用の Spark バージョンに対応する paimon-spark 依存関係パッケージを選択し、バージョン 1.3 以降にアップグレードします。
「Maven リポジトリ」で、対応する依存関係パッケージを選択します。たとえば、Spark 3.2 を使用している場合は、
paimon-spark-3.2-1.3.0またはそれ以降のバージョンを選択します。
依存関係パッケージのインポート
4 つの依存関係パッケージを OSS にアップロードします。ファイルの権限を公開読み取りに設定します。詳細については、「シンプルアップロード」をご参照ください。
スクリプトを作成して OSS にアップロード
#!/bin/bash echo 'prepare paimon-vfs in hadoop classpath' cd /opt/apps/JINDOSDK/jindosdk-current/lib rm -rf paimon-* wget ${paimon_vfs_jar} wget ${paimon_jindo_jar} wget ${paimon_bundle_jar} echo 'prepare paimon-spark in spark classpath' rm -rf /opt/apps/PAIMON/paimon-dlf rm -rf /opt/apps/PAIMON/paimon-dlf.tar.gz.* mkdir -p /opt/apps/PAIMON/paimon-dlf/lib/spark3 cd /opt/apps/PAIMON/paimon-dlf/lib/spark3 wget ${paimon_spark_jar} rm -f /opt/apps/PAIMON/paimon-current ln -sf /opt/apps/PAIMON/paimon-dlf /opt/apps/PAIMON/paimon-current重要スクリプト内のプレースホルダー
${paimon_vfs_jar}、${paimon_jindo_jar}、${paimon_bundle_jar}、および${paimon_spark_jar}を、対応する OSS オブジェクトのダウンロードパスに置き換えます。デフォルトでは、ECS クラスター上の EMR はインターネットにアクセスできません。例:内部エンドポイント:
https://{bucket}.oss-cn-hangzhou-internal.aliyuncs.com/jars/paimon-jindo-1.3.0.jar。パブリックエンドポイント:
https://{bucket}.oss-cn-hangzhou.aliyuncs.com/jars/paimon-jindo-1.3.0.jar。
EMR クラスターのブートストラップアクションとしてスクリプトを実行します。詳細については、「スクリプトの手動実行」をご参照ください。
EMR コンソールで、ご利用のクラスターのページに移動し、 を選択します。[作成して実行] をクリックします。
表示されるダイアログボックスで、次のパラメーターを設定し、[OK] をクリックします。
[名前]: スクリプトのカスタム名を入力します。
[スクリプトの場所]: OSS にアップロードしたアップグレードスクリプトを選択します。スクリプトパスは oss://**/*.sh 形式である必要があります。
[実行範囲]: [クラスター] を選択します。
スクリプトの実行後、変更を有効にするため、Spark および Hive サービスを再起動します。
EMR クラスター設定の更新
EMR コンソールで、クラスターのページに移動し、 を選択します。
core-site.xml タブで、[設定項目の追加] をクリックします。
キー
値
fs.AbstractFileSystem.pvfs.impl
org.apache.paimon.vfs.hadoop.Pvfs
fs.pvfs.impl
org.apache.paimon.vfs.hadoop.PaimonVirtualFileSystem
fs.pvfs.uri
cn-hangzhou-vpc.dlf.aliyuncs.com
説明実際のリージョンに置き換えます。詳細については、「エンドポイント」をご参照ください。
fs.pvfs.token.provider
dlf
fs.pvfs.dlf.token-loader
ecs
DLF 内のファイルへのアクセス
オブジェクトテーブルを作成します。その後、PVFS を使用してオブジェクトテーブルのデータにアクセスできます。
Hadoop Shell を使用したアクセス
Hadoop Shell を使用して、CSV ファイルをオブジェクトテーブルにアップロードします。
# CSV ファイルをアップロードします
echo "James,Sales,3000" >> employee.csv
hadoop fs -put employee.csv pvfs://catalog_name/default/object_table/
# object_table 内のすべてのファイルをクエリします
hadoop fs -ls pvfs://catalog_name/default/object_table/
# CSV ファイルを表示します
hadoop fs -cat pvfs://catalog_name/default/object_table/employee.csvHive を使用したアクセス
Hive を使用して、オブジェクトテーブル内の CSV ファイルをクエリします。
# Hive に接続します
beeline -u jdbc:hive2://localhost:10000
# CSV ファイルをマッピングするための一時テーブルを作成します
CREATE TEMPORARY TABLE temp_table (
employee_name STRING,
department STRING,
salary INT
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE
LOCATION 'pvfs://catalog_name/default/object_table/';
# 一時テーブルをクエリします
SELECT * FROM temp_table;Spark を使用したアクセス
Spark を使用して、オブジェクトテーブル内の CSV ファイルをクエリします。
# spark-sql を起動します
spark-sql
# CSV ファイルをマッピングするための一時ビューを作成します
CREATE TEMPORARY VIEW temp_table
USING csv
OPTIONS (
path 'pvfs://catalog_name/default/object_table',
inferSchema 'false',
schema 'employee_name STRING, department STRING, salary INT'
);
# 一時ビューをクエリします
SELECT * FROM temp_table;