Amazon EMR で Hive と Spark を使用しながら、別の AWS アカウントにある AWS Glue データカタログをクエリするにはどうすればよいですか?

最終更新日: 2020 年 8 月 31 日

Amazon EMR で Apache Hive と Apache Spark を使用して、別のアカウントにある AWS Glue データカタログにアクセスし、クエリを実行したいと考えています。

簡単な説明

Hive と Spark の設定に、プロパティ「aws.gue.calog.calog.separator」を追加し、「/」を指定します。このプロパティーは、新規のクラスターまたは実行中のクラスターの両方で設定できます。

注: このソリューションは、Amazon EMR リリース 5.28.0 以降で有効です。EMR クラスターと AWS Glue データカタログは、同じリージョンに存在する必要があります。

解決方法

まだ設定していない場合は、AWS Glue へのクロスアカウントアクセスを設定します。AWS Glue テーブルが指す、Amazon Simple Storage Service(Amazon S3)バケットが、クロスアカウントアクセス用に設定されていることを確認します。詳細については、「 EMRFS のクロスアカウントアクセスを設定するにはどうすればよいですか?」をご参照ください。

その後、Hive および Spark のために、aws.glue.catalog.separator プロパティを / に設定します。

新しいクラスターの場合

クラスターの起動時に、次のような設定オブジェクトを追加します。

[
    {
        "Classification": "hive-site",
        "Properties": {
            "aws.glue.catalog.separator": "/"
        }
    },
    {
        "Classification": "spark-hive-site",
        "Properties": {
            "aws.glue.catalog.separator": "/"
        }
    }    
]

実行中のクラスターの場合

  1. Amazon EMR コンソールを開きます。
  2. クラスターの一覧にある [名前] の下で、再設定する有効なクラスターを選択します。
  3. クラスターの詳細ページを開き、[設定] タブを表示します。
  4. [フィルター] ドロップダウンリストで、再設定するインスタンスグループを選択します。
  5. [再設定] ドロップダウンリストで、[テーブルで編集する] を選択します。
  6. 設定分類のテーブルで、[設定を追加] をクリックした後、次のように入力します。
    [分類]: hive-site
    [プロパティ]: aws.glue.calog.separator
    []: /

    [分類]: spark-hive-site
    [プロパティ]: aws.glue.calog.separator
    []: /
  7. [この設定をすべての有効なインスタンスグループに適用する] を選択し、[変更の保存] をクリックします。

別の AWS アカウントにあるテーブルをクエリする

別の AWS アカウントにあるテーブルをクエリするためには、アカウント番号の指定が必要です。アカウント番号は、カタログ IDと同じです。たとえば、Hive のアカウント 111122223333 にある demobb.tab1 へのクエリの例を次に示します。

select * from `111122223333/demodb.tab1` limit 5;

Spark での例を次に示します(spark-submit スクリプト、またはノートブックシェルコマンドとして実行します)。

spark.sql("select * from `111122223333/demodb`.tt1 limit 5").show()

また、2 つのカタログにまたがるテーブルを結合することもできます。ハイブでの例を次に示します。

select * from `111122223333/demodb.tab1` t1 inner join  `444455556666/demodb.tab2` t2 on t1.col1 = t2.col2

Spark での例を次に示します(spark-submit スクリプト、またはノートブックシェルコマンドとして実行します)。

spark.sql(select * from `111122223333/demodb.tab1` t1 inner join  `444455556666/demodb.tab2` t2 on t1.col1 = t2.col2).show()

または、spark-submit スクリプトで --conf オプションを使用するか、ノートブックシェルコマンドとして、パラメータを渡します。次に例を示します。

pyspark --conf spark.hadoop.aws.glue.catalog.separator="/"

この記事はお役に立ちましたか?


請求に関するサポートまたは技術的なサポートが必要ですか?