このトピックでは、E-MapReduce 上の Hive を例として、MaxCompute で外部スキーマを作成し、Hadoop の Hive テーブルデータをクエリする方法について説明します。
注意事項
この機能は、中国 (杭州)、中国 (上海)、中国 (北京)、中国 (張家口)、中国 (深セン)、中国 (香港)、シンガポール、ドイツ (フランクフルト) リージョンでのみサポートされています。
操作手順
ステップ 1:前提条件
すでに Hive データをお持ちの場合は、このステップをスキップしてください。
MaxCompute プロジェクトと Hadoop クラスターは、同じリージョンに存在する必要があります。
ご利用の MaxCompute プロジェクトでスキーマサポートを有効にします。
MaxCompute コンソールにログインし、左上のコーナーでリージョンを選択します。
左側のナビゲーションウィンドウで、 を選択します。
プロジェクト管理 ページで、対象プロジェクトの 操作 列にある スキーマレベルをサポートするためのアップグレード をクリックします。
ステップ 2:Hive データの準備
すでに Hive データをお持ちの場合は、このステップをスキップしてください。
E-MapReduce コンソールにログインし、左上のコーナーでリージョンを選択します。
My Clusters ページで、Create Cluster をクリックします。
Software Configuration
トップメニューバーで、リソースグループを選択します。デフォルトでは、アカウント配下のすべてのリソースが表示されます。他のパラメーターを次のように設定します。
パラメーター
説明
Region
クラスターは選択されたリージョンに作成されます。クラスター作成後にリージョンを変更することはできません。
MaxCompute プロジェクトと Hadoop クラスターは、同じリージョンに存在する必要があります。
Business Scenario
この例では、Custom Cluster を選択します。
Product Version
バージョンを選択します。最新バージョンを推奨します。
High Service Availability
この機能はデフォルトで無効になっています。High Service Availability を有効にすると、EMR はマスターノードを異なる基盤ハードウェアに分散させ、障害のリスクを低減します。
Optional Services (Select One At Least)
この例では、
HADOOP-COMMON(3.2.1)、HDFS(3.2.1)、HIVE(3.1.3)、YARN(3.2.1)を選択します。サービス運用ログの収集を許可する
ログ収集はデフォルトで有効になっています。
サービス運用ログを収集する場合は、クラスター情報から収集ステータスを変更できます。
Metadata
この例では、Self-managed RDS インスタンスを使用します。
RDS インスタンスの作成方法の詳細については、「RDS for MySQL インスタンスの作成とデータベースの設定」をご参照ください。
For an EMR cluster that is used in the production environment, we recommend that you use independent ApsaraDB RDS for MySQL. For example, you can use ApsaraDB RDS for MySQL 5.7 of Alibaba Cloud high-availability edition.
[hivemetastore-site.xml] で RDS 接続情報を設定します:
[javax.jdo.option.ConnectionURL]
Java Database Connectivity (JDBC) メタデータ接続。例:
jdbc:mysql://rds.host.name/hive_db_name[javax.jdo.option.ConnectionUserName]
メタデータのデータベースアカウント。
javax.jdo.option.ConnectionPassword
メタデータのデータベースパスワード。
上記の設定は、この例のみを対象としています。E-MapReduce コンソールでデータレイク分析クラスターを作成する方法の詳細については、「DataLake クラスターの作成と使用」をご参照ください。
ハードウェア設定
パラメーター
説明
Billing Method
Subscription
Pay-as-you-go
テスト目的では、Pay-as-you-go を使用します。テスト完了後、クラスターをリリースし、本番用に Subscription クラスターを作成できます。
可用性ゾーン
クラスター作成後にゾーンを変更することはできません。慎重に選択してください。
VPC
リージョン内の VPC (仮想プライベートクラウド) を選択します。存在しない場合は、[VPC の作成] をクリックします。VPC を作成した後、[更新] をクリックして選択します。
vSwitch
選択した VPC のゾーンにある vSwitch を選択します。ゾーンに利用可能な vSwitch がない場合は、作成します。
Default Security Group
重要ECS で作成された高度なセキュリティグループはサポートされていません。
使用中のセキュリティグループがある場合は、それを選択するか、新しく作成することができます。
Node Group
ビジネスニーズに基づいて、マスター、コア、またはタスクノードグループを設定します。詳細については、「ハードウェアとネットワークの選択」をご参照ください。
この例では、マスターノードグループに対して Assign Public Network IP を有効にし、他のパラメーターにはデフォルト値を使用します。
クラスターのスケーリング
スケーリングルールを設定します。
基本設定
パラメーター
説明
クラスター名
クラスターの名前。名前は 1~64 文字で、漢字、英字、数字、ハイフン (-)、アンダースコア (_) を含めることができます。
Identity Credentials
Key Pair:パスワードを入力せずに ID 検証を行いたい場合は、Key Pair を使用できます。詳細については、「SSH キーペアの管理」をご参照ください。
Password:クラスターのマスターノードにリモートログインするために使用するパスワード。このパスワードはクラスターにログインする際に必要になるため、記録しておいてください。
クラスターのマスターノードにログインし、Hive でデータを準備します。
ノードのパブリック IP アドレスと名前の取得
E-MapReduce コンソールにログインし、左上のコーナーでリージョンを選択します。
対象クラスターの Nodes をクリックします。
Nodes タブで、ノードグループの行にある
アイコンをクリックして、Public IP Address と Node Name/ID を取得します。ノードのパブリック IP アドレスが空の場合、クラスター作成時に [パブリック IP のアタッチ] が有効になっていなかったことを示します。この場合、ノード ID をクリックしてインスタンス詳細を表示します。
セクションで、[EIP の関連付け] または [パブリック IP アドレスの割り当て] をクリックできます。
EIP との関連付け:EIP (Elastic IP Address) を作成して関連付けます。詳細については、「Elastic IP Address」をご参照ください。
パブリック IP アドレスの割り当て:帯域幅を 0 Mbps より大きい値に設定します。システムが自動的にパブリック IP アドレスを割り当てます。詳細については、「固定パブリック IP アドレス」をご参照ください。
パブリック IP アドレスを柔軟に管理する場合 (帯域幅の調整やリソースの切り替えなど) は EIP を使用します。頻繁に変更されない固定のパブリック出口が必要な場合は、固定パブリック IP アドレスを使用します。
クラスターのマスターノードへのログイン
E-MapReduce コンソールにログインし、左上のコーナーでリージョンを選択します。
対象クラスターの Nodes をクリックします。
Nodes タブで、ノードグループの行にある
アイコンをクリックし、次にノード ID をクリックして [インスタンス] 詳細ページに移動します。指定されたノードの[インスタンス]ページで、接続をクリックします。
リモート接続 ダイアログボックスで、デフォルトで ワークベンチ オプションが選択されている状態で、今すぐサインイン をクリックします。
ログインウィンドウで、必要に応じてインスタンス情報を入力します。
説明キーペアを作成すると、秘密鍵が自動的にダウンロードされ、.pem ファイルとして保存されます。Secure Shell (SSH) キー認証を選択し、秘密鍵ファイルをアップロードすることで、パスワードなしで ID 検証を実行できます。
Hive テストデータの準備。Workbench を使用してクラスターのマスターノードにログインした後、ターミナルで次のコマンドを実行します:
[user@emr-node ~]$ hive -- データベースを作成します。 hive> CREATE database IF NOT EXISTS myhive; -- データベースに切り替えます。 hive> USE myhive; -- 非パーティションテーブルを作成します。 hive> CREATE TABLE IF NOT EXISTS employees ( id INT, name STRING, age INT, department STRING ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE; -- データを挿入します。 hive> INSERT INTO employees VALUES(1, 'John', 25, 'Sales'), (2, 'Jane', 30, 'Marketing'), (3, 'Mike', 35, 'Engineering'), (4, 'Sarah', 28, 'HR'), (5, 'David', 32, 'Finance'), (6, 'Linda', 29, 'IT'), (7, 'Robert', 31, 'Operations'), (8, 'Emily', 27, 'Research'), (9, 'Michael', 33, 'Development'), (10, 'Chris', 26, 'Support'); -- パーティションテーブルを作成します。 hive> CREATE TABLE employees_pt ( id INT, name STRING, age INT ) PARTITIONED BY (department STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ','; -- データを挿入します。 INSERT INTO employees_pt PARTITION (department='Sales') VALUES(1, 'John', 25),(2, 'Jane', 30),(3, 'Mike', 35); INSERT INTO employees_pt PARTITION (department='Marketing') VALUES(4, 'Sarah', 28),(5, 'David', 32); INSERT INTO employees_pt PARTITION (department='Engineering') VALUES(6, 'Linda', 29),(7, 'Robert', 31); INSERT INTO employees_pt PARTITION (department='HR') VALUES(8, 'Emily', 27),(9, 'Michael', 33),(10, 'Chris', 26);非パーティションテーブルとパーティションテーブルのクエリ:
-- 非パーティションテーブルをクエリします。 hive> SELECT * FROM employees; 1 John 25 Sales 2 Jane 30 Marketing 3 Mike 35 Engineering 4 Sarah 28 HR 5 David 32 Finance 6 Linda 29 IT 7 Robert 31 Operations 8 Emily 27 Research 9 Michael 33 Development 10 Chris 26 Support -- パーティションテーブルをクエリします。 hive> SELECT * FROM employees_pt; 6 Linda 29 Engineering 7 Robert 31 Engineering 8 Emily 27 HR 9 Michael 33 HR 10 Chris 26 HR 4 Sarah 28 Marketing 5 David 32 Marketing 1 John 25 Sales 2 Jane 30 Sales 3 Mike 35 Sales
ステップ 3:Hive+HDFS 外部データソースの作成
MaxCompute コンソールにログインし、左上のコーナーでリージョンを選択します。
左側のナビゲーションウィンドウで、 を選択します。
外部データソース ページで、外部データソースの作成 をクリックします。
外部データソースの追加 ダイアログボックスで、パラメーターを設定します。以下の表にパラメーターを説明します。
パラメーター
必須
説明
外部データソースタイプ
必須
[Hive+HDFS] を選択します。
外部データソース名
必須
カスタム名を入力します。命名規則は次のとおりです:
名前は英字で始まり、小文字の英字、アンダースコア (_)、数字のみを含めることができます。
名前は 128 文字を超えることはできません。
例:hive_hdfs_mc
外部データソースの説明
任意
必要に応じて説明を入力します。
ネットワーク接続オブジェクト
必須
ネットワーク接続の名前。MaxCompute から Alibaba Cloud E-MapReduce または Hadoop VPC ネットワークへの接続を選択または作成します。
重要VPC は、MaxCompute 外部データソースおよび外部データソースがアタッチされているプロジェクトと同じリージョンにある必要があります。
パラメーターの詳細については、「VPC アクセスソリューション (直接接続)」の「MaxCompute とターゲット VPC ネットワーク間のネットワーク接続の作成」ステップをご参照ください。
クラスター名
必須
高可用性 (HA) Hadoop クラスターで NameNode を参照するために使用される名前。
EMR クラスターを例にとると、クラスター名を取得するには:
E-MapReduce コンソールにログインし、左上のコーナーでリージョンを選択します。
対象クラスターの ID をクリックして、クラスター詳細ページに移動します。
Services タブで、HDFS サービスの Configure をクリックして、Configure ページに移動します。
[hdfs-site.xml] タブに切り替えます。By Name 列で、
dfs.nameservicesを検索します。この設定項目の値が クラスター名 です。
NameNodeアドレス
必須
対象 Hadoop クラスターのアクティブおよびスタンバイ NameNode サービスのエンドポイントとポート番号。ポート番号は通常 8020 です。
EMR クラスターを例にとると、NameNode アドレスを取得するには:
E-MapReduce コンソールにログインし、左上のコーナーでリージョンを選択します。
対象クラスターの ID をクリックして、クラスター詳細ページに移動します。
Services タブで、HDFS サービスの Status をクリックして、Status ページに移動します。
Components エリアで、[NameNode] の横にある
アイコンをクリックして、トポロジーリストを展開します。master-1-1 ノードの Private IP Address を取得します。NameNodeアドレス は
内部 IP:8020の形式です。
HMSサービスアドレス
必須
対象 Hadoop クラスターのアクティブおよびスタンバイ NameNode の Hive メタデータサービスのエンドポイントとポート番号。ポート番号は通常 9083 です。
E-MapReduce コンソールにログインし、左上のコーナーでリージョンを選択します。
対象クラスターの ID をクリックして、クラスター詳細ページに移動します。
Services タブで、Hive サービスの Status をクリックして、Status ページに移動します。
Components エリアで、[HiveRuntime] の横にある
アイコンをクリックしてトポロジーリストを展開します。master-1-1 ノードの Private IP Address を取得します。HMSサービスアドレス は
内部 IP:9083の形式です。
認証タイプ
これは必須です。
現在、[認証なし] のみがサポートされています。
スイッチの作成
必須
MaxCompute は VPC を介してデータソースにアクセスします。デフォルトでは、逆アクセス 2.0 ソリューションが使用されます。このソリューションでは、メタデータアクセスリンクを確立するために、特定のゾーンに vSwitch を設定する必要があります。
各リージョンで vSwitch が利用可能なゾーンは UI に記載されています。データソースが存在する VPC で、ゾーン要件を満たす既存の vSwitch を選択するか、新しく作成します。
[OK] をクリックして外部データソースを作成します。
外部データソース ページで、対象のデータソースを見つけ、操作 列の 詳細 をクリックします。
ステップ 4:外部スキーマの作成
ご利用の MaxCompute プロジェクトに接続します。
次のコードを使用して外部スキーマを作成します:
-- スキーマ構文を有効にします。 SET odps.namespace.schema=true; CREATE EXTERNAL SCHEMA IF NOT EXISTS <YOUR_EXTERNAL_SCHEMA_NAME> WITH <YOUR_EXTERNAL_DATASOURCE_NAME> ON 'myhive' ;パラメーターの説明:
your_external_schema_name:作成する外部スキーマの名前。例:
ex_hms_hdfsyour_external_datasource_name:前のステップで MaxCompute に作成した外部データソースの名前。外部スキーマが属するプロジェクトは、外部データソースと同じリージョンにある必要があります。例:
hive_hdfs_mcmyhive:Hive データを準備する際に作成した Hive データベースの名前。
ステップ 5:SQL を使用した Hadoop Hive データへのアクセス
外部スキーマ内のテーブルをクエリします。
SET odps.namespace.schema=true; SHOW tables IN <YOUR_EXTERNAL_SCHEMA_NAME>; -- 次の結果が返されます。 ALIYUN$xxx:employees ALIYUN$xxx:employees_pt OK重要クエリが失敗した場合は、RDS コンソールにログインして、MaxCompute の VPC とセキュリティグループが RDS のホワイトリストに追加されているかを確認してください。セキュリティグループを追加した後、ホワイトリストが有効になるまで少なくとも 5 分かかります。
外部スキーマテーブルの詳細をクエリします。
-- 非パーティションテーブルをクエリします。 SELECT * FROM <YOUR_EXTERNAL_SCHEMA_NAME>.employees; -- 結果 +------------+------------+------------+------------+ | id | name | age | department | +------------+------------+------------+------------+ | 1 | John | 25 | Sales | | 2 | Jane | 30 | Marketing | | 3 | Mike | 35 | Engineering | | 4 | Sarah | 28 | HR | | 5 | David | 32 | Finance | | 6 | Linda | 29 | IT | | 7 | Robert | 31 | Operations | | 8 | Emily | 27 | Research | | 9 | Michael | 33 | Development | | 10 | Chris | 26 | Support | +------------+------------+------------+------------+ -- パーティションテーブルをクエリします。 SELECT * FROM <YOUR_EXTERNAL_SCHEMA_NAME>.employees_pt WHERE department='HR'; -- 結果 +------------+------------+------------+------------+ | id | name | age | department | +------------+------------+------------+------------+ | 8 | Emily | 27 | HR | | 9 | Michael | 33 | HR | | 10 | Chris | 26 | HR | +------------+------------+------------+------------+
ステップ 6:Hadoop データソースへの新しいデータの追加
EMR で作成したクラスターのマスターノードにログインし、Hive のパーティションテーブルに新しいパーティションデータを挿入します:
INSERT INTO employees_pt PARTITION (department='Computer') VALUES(11, 'Cily', 29),(12, 'Miky', 35); -- Hive 側でパーティションテーブルをクエリします。 hive> SELECT * FROM employees_pt; -- クエリ結果 OK 11 Cily 29 Computer 12 Miky 35 Computer 6 Linda 29 Engineering 7 Robert 31 Engineering 8 Emily 27 HR 9 Michael 33 HR 10 Chris 26 HR 4 Sarah 28 Marketing 5 David 32 Marketing 1 John 25 Sales 2 Jane 30 Sales 3 Mike 35 SalesMaxCompute クライアントにログインし、MaxCompute 側で新しいパーティションデータをクエリします:
SELECT * FROM <YOUR_EXTERNAL_SCHEMA_NAME>.employees_pt WHERE department='Computer'; -- 結果 +------------+------------+------------+------------+ | id | name | age | department | +------------+------------+------------+------------+ | 11 | Cily | 29 | Computer | | 12 | Miky | 35 | Computer | +------------+------------+------------+------------+
ステップ 7:フェデレーション外部テーブルからデータウェアハウスへのデータコピー
-- フェデレーション外部テーブルからデータウェアハウスにデータをコピーします。
CREATE TABLE employees_copy AS SELECT * FROM <YOUR_EXTERNAL_SCHEMA_NAME>.employees;
-- データウェアハウスにコピーされたテーブルデータをクエリします。
SELECT * FROM employees_copy;
-- 次の結果が返されます。
+------------+------------+------------+-------------+
| id | name | age | department |
+------------+------------+------------+-------------+
| 1 | John | 25 | Sales |
| 2 | Jane | 30 | Marketing |
| 3 | Mike | 35 | Engineering |
| 4 | Sarah | 28 | HR |
| 5 | David | 32 | Finance |
| 6 | Linda | 29 | IT |
| 7 | Robert | 31 | Operations |
| 8 | Emily | 27 | Research |
| 9 | Michael | 33 | Development |
| 10 | Chris | 26 | Support |
+------------+------------+------------+-------------+