Hcatalog-quick-guide

提供:Dev Guides
移動先:案内検索

HCatalog-はじめに

HCatalogとは何ですか?

HCatalogは、Hadoop用のテーブルストレージ管理ツールです。 Hiveメタストアの表形式データを他のHadoopアプリケーションに公開します。 さまざまなデータ処理ツール(Pig、MapReduce)を使用するユーザーがグリッドにデータを簡単に書き込むことができます。 これにより、ユーザーはデータが保存されている場所や形式を気にする必要がなくなります。

HCatalogはHiveの重要なコンポーネントのように機能し、ユーザーがデータを任意の形式と構造で保存できるようにします。

HCatalogを選ぶ理由

適切なジョブに適切なツールを有効にする

Hadoopエコシステムには、Hive、Pig、MapReduceなどのデータ処理用のさまざまなツールが含まれています。 これらのツールはメタデータを必要としませんが、メタデータが存在する場合でもメタデータを活用できます。 また、メタデータストアを共有すると、ツール間でユーザーがデータをより簡単に共有できるようになります。 MapReduceまたはPigを使用してデータをロードおよび正規化し、Hiveを介して分析するワークフローは非常に一般的です。 これらすべてのツールが1つのメタストアを共有している場合、各ツールのユーザーは別のツールで作成されたデータにすぐにアクセスできます。 ロードまたは転送の手順は必要ありません。

処理状態をキャプチャして共有を有効にします

HCatalogは分析結果を公開できます。 そのため、他のプログラマは「REST」経由で分析プラットフォームにアクセスできます。 あなたが公開しているスキーマは、他のデータサイエンティストにも役立ちます。 他のデータサイエンティストは、あなたの発見を後続の発見への入力として使用します。

Hadoopをすべてと統合する

処理およびストレージ環境としてのHadoopは、企業に多くの機会をもたらします。ただし、採用を促進するには、既存のツールと連携して機能を強化する必要があります。 Hadoopは、分析プラットフォームへの入力として機能するか、運用データストアおよびWebアプリケーションと統合する必要があります。 組織は、まったく新しいツールセットを学ぶ必要なく、Hadoopの価値を享受する必要があります。 RESTサービスは、使い慣れたAPIとSQLに似た言語で企業にプラットフォームを提供します。 エンタープライズデータ管理システムはHCatalogを使用して、Hadoopプラットフォームとより深く統合します。

HCatalogアーキテクチャ

次の図は、HCatalogの全体的なアーキテクチャを示しています。

アーキテクチャ

HCatalogは、 SerDe (serializer-deserializer)を書き込むことができる任意の形式のファイルの読み取りと書き込みをサポートしています。 デフォルトでは、HCatalogはRCFile、CSV、JSON、SequenceFile、およびORCファイル形式をサポートしています。 カスタム形式を使用するには、InputFormat、OutputFormat、およびSerDeを提供する必要があります。

HCatalogはHiveメタストアの上に構築され、HiveのDDLを組み込みます。 HCatalogは、PigおよびMapReduceの読み取りおよび書き込みインターフェイスを提供し、Hiveのコマンドラインインターフェイスを使用して、データ定義およびメタデータ探索コマンドを発行します。

HCatalog-インストール

Hive、Pig、HBaseなどのすべてのHadoopサブプロジェクトは、Linuxオペレーティングシステムをサポートしています。 したがって、システムにLinuxフレーバーをインストールする必要があります。 HCatalogは、2013年3月26日にHive Installationと統合されます。 バージョンHive-0.11.0以降、HCatalogにはHiveがインストールされています。 そのため、以下に示す手順に従ってHiveをインストールすると、システムにHCatalogが自動的にインストールされます。

ステップ1:JAVAインストールの確認

Hiveをインストールする前に、Javaをシステムにインストールする必要があります。 次のコマンドを使用して、システムにJavaがすでにインストールされているかどうかを確認できます-

$ java –version

Javaがすでにシステムにインストールされている場合、次の応答が表示されます-

java version "1.7.0_71"
Java(TM) SE Runtime Environment (build 1.7.0_71-b13)
Java HotSpot(TM) Client VM (build 25.0-b02, mixed mode)

システムにJavaがインストールされていない場合は、以下の手順に従う必要があります。

ステップ2:Javaのインストール

次のリンクhttp://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260l[[[1]] oracle.com/]

次に、 jdk-7u71-linux-x64.tar.gz がシステムにダウンロードされます。

通常、ダウンロードしたJavaファイルは、ダウンロードフォルダーにあります。 それを確認し、次のコマンドを使用して jdk-7u71-linux-x64.gz ファイルを抽出します。

$ cd Downloads/
$ ls
jdk-7u71-linux-x64.gz

$ tar zxf jdk-7u71-linux-x64.gz
$ ls
jdk1.7.0_71 jdk-7u71-linux-x64.gz

Javaをすべてのユーザーが利用できるようにするには、Javaを「/usr/local/」の場所に移動する必要があります。 ルートを開き、次のコマンドを入力します。

$ su
password:
# mv jdk1.7.0_71/usr/local/
# exit
*PATH* および *JAVA_HOME* 変数を設定するには、*〜/.bashrc *ファイルに次のコマンドを追加します。
export JAVA_HOME=/usr/local/jdk1.7.0_71
export PATH=PATH:$JAVA_HOME/bin

上記で説明したように、ターミナルからコマンド java -version を使用してインストールを検証します。

ステップ3:Hadoopインストールの検証

Hiveをインストールする前に、Hadoopをシステムにインストールする必要があります。 次のコマンドを使用してHadoopのインストールを確認しましょう-

$ hadoop version

Hadoopが既にシステムにインストールされている場合、次の応答が表示されます-

Hadoop 2.4.1
Subversion https://svn.apache.org/repos/asf/hadoop/common -r 1529768
Compiled by hortonmu on 2013-10-07T06:28Z
Compiled with protoc 2.5.0
From source with checksum 79e53ce7994d1628b240f09af91e1af4

Hadoopがシステムにインストールされていない場合は、次の手順に進みます-

ステップ4:Hadoopのダウンロード

次のコマンドを使用して、Apache Software FoundationからHadoop 2.4.1をダウンロードして抽出します。

$ su
password:
# cd/usr/local
# wget http://apache.claz.org/hadoop/common/hadoop-2.4.1/
hadoop-2.4.1.tar.gz
# tar xzf hadoop-2.4.1.tar.gz
# mv hadoop-2.4.1/* to hadoop/
# exit

ステップ5:疑似分散モードでのHadoopのインストール

*Hadoop 2.4.1* を擬似分散モードでインストールするには、次の手順を使用します。

Hadoopのセットアップ

次のコマンドを*〜/.bashrc *ファイルに追加することにより、Hadoop環境変数を設定できます。

export HADOOP_HOME=/usr/local/hadoop
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin

すべての変更を現在実行中のシステムに適用します。

$ source ~/.bashrc

Hadoop設定

すべてのHadoop設定ファイルは、「$ HADOOP_HOME/etc/hadoop」の場所にあります。 Hadoopインフラストラクチャに応じて、これらの構成ファイルに適切な変更を加える必要があります。

$ cd $HADOOP_HOME/etc/hadoop

Javaを使用してHadoopプログラムを開発するには、 JAVA_HOME 値をシステム内のJavaの場所に置き換えて、 hadoop-env.sh ファイルのJava環境変数をリセットする必要があります。

export JAVA_HOME=/usr/local/jdk1.7.0_71

以下に、Hadoopを構成するために編集する必要があるファイルのリストを示します。

core-site.xml

*core-site.xml* ファイルには、Hadoopインスタンスに使用されるポート番号、ファイルシステムに割り当てられたメモリ、データを保存するためのメモリ制限、読み取り/書き込みバッファのサイズなどの情報が含まれています。

core-site.xmlを開き、<configuration>タグと</configuration>タグの間に次のプロパティを追加します。

<configuration>
   <property>
      <name>fs.default.name</name>
      <value>hdfs://localhost:9000</value>
   </property>
</configuration>

hdfs-site.xml

*hdfs-site.xml* ファイルには、レプリケーションデータの値、namenodeパス、ローカルファイルシステムのdatanodeパスなどの情報が含まれています。 これは、Hadoopインフラストラクチャを保存する場所を意味します。

次のデータを想定します。

dfs.replication (data replication value) = 1

(In the following path/hadoop/is the user name.
hadoopinfra/hdfs/namenode is the directory created by hdfs file system.)

namenode path =//home/hadoop/hadoopinfra/hdfs/namenode

(hadoopinfra/hdfs/datanode is the directory created by hdfs file system.)
datanode path =//home/hadoop/hadoopinfra/hdfs/datanode

このファイルを開き、このファイルの<configuration>タグと</configuration>タグの間に次のプロパティを追加します。

<configuration>
   <property>
      <name>dfs.replication</name>
      <value>1</value>
   </property>

   <property>
      <name>dfs.name.dir</name>
      <value>file:///home/hadoop/hadoopinfra/hdfs/namenode</value>
   </property>

   <property>
      <name>dfs.data.dir</name>
      <value>file:///home/hadoop/hadoopinfra/hdfs/datanode</value>
   </property>
</configuration>

-上記のファイルでは、すべてのプロパティ値はユーザー定義であり、Hadoopインフラストラクチャに応じて変更できます。

yarn-site.xml

このファイルは、Hadoopに糸を設定するために使用されます。 yarn-site.xmlファイルを開き、このファイルの<configuration>タグと</configuration>タグの間に次のプロパティを追加します。

<configuration>
   <property>
      <name>yarn.nodemanager.aux-services</name>
      <value>mapreduce_shuffle</value>
   </property>
</configuration>

mapred-site.xml

このファイルは、使用しているMapReduceフレームワークを指定するために使用されます。 デフォルトでは、Hadoopにはyarn-site.xmlのテンプレートが含まれています。 まず、次のコマンドを使用して、 mapred-site、xml.template から mapred-site.xml ファイルにファイルをコピーする必要があります。

$ cp mapred-site.xml.template mapred-site.xml

mapred-site.xmlファイルを開き、このファイルの<configuration>タグと</configuration>タグの間に次のプロパティを追加します。

<configuration>
   <property>
      <name>mapreduce.framework.name</name>
      <value>yarn</value>
   </property>
</configuration>

ステップ6:Hadoopインストールの検証

次の手順を使用して、Hadoopのインストールを確認します。

ネームノードのセットアップ

次のようにコマンド「hdfs namenode -format」を使用してネームノードを設定します-

$ cd ~
$ hdfs namenode -format

期待される結果は次のとおりです-

10/24/14 21:30:55 INFO namenode.NameNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG: host = localhost/192.168.1.11
STARTUP_MSG: args = [-format]
STARTUP_MSG: version = 2.4.1
...
...
10/24/14 21:30:56 INFO common.Storage: Storage directory
/home/hadoop/hadoopinfra/hdfs/namenode has been successfully formatted.
10/24/14 21:30:56 INFO namenode.NNStorageRetentionManager: Going to retain 1
images with txid >= 0 10/24/14 21:30:56 INFO util.ExitUtil: Exiting with status 0
10/24/14 21:30:56 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at localhost/192.168.1.11
************************************************************/

Hadoop DFSの検証

DFSを開始するには、次のコマンドを使用します。 このコマンドを実行すると、Hadoopファイルシステムが起動します。

$ start-dfs.sh

予想される出力は次のとおりです-

10/24/14 21:37:56 Starting namenodes on [localhost]
localhost: starting namenode, logging to
/home/hadoop/hadoop-2.4.1/logs/hadoop-hadoop-namenode-localhost.out localhost:
starting datanode, logging to
  /home/hadoop/hadoop-2.4.1/logs/hadoop-hadoop-datanode-localhost.out
Starting secondary namenodes [0.0.0.0]

糸スクリプトの検証

次のコマンドを使用して、Yarnスクリプトを開始します。 このコマンドを実行すると、Yarnデーモンが起動します。

$ start-yarn.sh

予想される出力は次のとおりです-

starting yarn daemons
starting resourcemanager, logging to/home/hadoop/hadoop-2.4.1/logs/
yarn-hadoop-resourcemanager-localhost.out
localhost: starting nodemanager, logging to
  /home/hadoop/hadoop-2.4.1/logs/yarn-hadoop-nodemanager-localhost.out

ブラウザでHadoopにアクセスする

Hadoopにアクセスするためのデフォルトのポート番号は50070です。 次のURLを使用して、ブラウザーでHadoopサービスを取得します。

http://localhost:50070/

HADOOPへのアクセス

クラスターのすべてのアプリケーションを検証する

クラスターのすべてのアプリケーションにアクセスするためのデフォルトのポート番号は8088です。 このサービスにアクセスするには、次のURLを使用してください。

http://localhost:8088/

クラスター

Hadoopのインストールが完了したら、次の手順に進み、Hiveをシステムにインストールします。

ステップ7:Hiveのダウンロード

このチュートリアルでは、hive-0.14.0を使用します。 次のリンク* http://apache.petsads.us/hive/hive-0.14.0/にアクセスしてダウンロードできます。 */Downloads ディレクトリにダウンロードされると仮定しましょう。 ここでは、このチュートリアル用に「 apache-hive-0.14.0-bin.tar.gz 」という名前のHiveアーカイブをダウンロードします。 次のコマンドは、ダウンロードを確認するために使用されます-

$ cd Downloads
$ ls

ダウンロードが成功すると、次の応答が表示されます-

apache-hive-0.14.0-bin.tar.gz

ステップ8:Hiveのインストール

システムにHiveをインストールするには、次の手順が必要です。 Hiveアーカイブが /Downloads ディレクトリにダウンロードされると仮定しましょう。

Hiveアーカイブの抽出と検証

次のコマンドを使用して、ダウンロードを確認し、Hiveアーカイブを抽出します-

$ tar zxvf apache-hive-0.14.0-bin.tar.gz
$ ls

ダウンロードが成功すると、次の応答が表示されます-

apache-hive-0.14.0-bin apache-hive-0.14.0-bin.tar.gz

====/usr/local/hiveディレクトリへのファイルのコピー

スーパーユーザー「su-」からファイルをコピーする必要があります。 次のコマンドは、抽出されたディレクトリから /usr/local/hive ”ディレクトリにファイルをコピーするために使用されます。

$ su -
passwd:
# cd/home/user/Download
# mv apache-hive-0.14.0-bin/usr/local/hive
# exit

Hiveの環境をセットアップする

次の行を*〜/.bashrc *ファイルに追加することにより、Hive環境をセットアップできます-

export HIVE_HOME=/usr/local/hive
export PATH=$PATH:$HIVE_HOME/bin
export CLASSPATH=$CLASSPATH:/usr/local/Hadoop/lib/*:.
export CLASSPATH=$CLASSPATH:/usr/local/hive/lib/*:.

〜/.bashrcファイルを実行するには、次のコマンドを使用します。

$ source ~/.bashrc

ステップ9:Hiveの構成

HadoopでHiveを構成するには、 $ HIVE_HOME/conf ディレクトリにある hive-env.sh ファイルを編集する必要があります。 次のコマンドは、Hive config フォルダーにリダイレクトし、テンプレートファイルをコピーします-

$ cd $HIVE_HOME/conf
$ cp hive-env.sh.template hive-env.sh

次の行を追加して、 hive-env.sh ファイルを編集します-

export HADOOP_HOME=/usr/local/hadoop

これで、Hiveのインストールが完了しました。 メタストアを構成するには、外部データベースサーバーが必要になりました。 Apache Derbyデータベースを使用します。

ステップ10:Apache Derbyのダウンロードとインストール

Apache Derbyをダウンロードしてインストールするには、以下の手順に従ってください-

Apache Derbyのダウンロード

Apache Derbyをダウンロードするには、次のコマンドを使用します。 ダウンロードには時間がかかります。

$ cd ~
$ wget http://archive.apache.org/dist/db/derby/db-derby-10.4.2.0/db-derby-10.4.2.0-bin.tar.gz

次のコマンドは、ダウンロードを確認するために使用されます-

$ ls

ダウンロードが成功すると、次の応答が表示されます-

db-derby-10.4.2.0-bin.tar.gz

Derbyアーカイブの抽出と検証

次のコマンドは、Derbyアーカイブの抽出と検証に使用されます-

$ tar zxvf db-derby-10.4.2.0-bin.tar.gz
$ ls

ダウンロードが成功すると、次の応答が表示されます-

db-derby-10.4.2.0-bin db-derby-10.4.2.0-bin.tar.gz

====/usr/local/derbyディレクトリへのファイルのコピー

スーパーユーザー「su-」からコピーする必要があります。 次のコマンドは、抽出されたディレクトリから /usr/local/derby ディレクトリにファイルをコピーするために使用されます-

$ su -
passwd:
# cd/home/user
# mv db-derby-10.4.2.0-bin/usr/local/derby
# exit

Derbyの環境のセットアップ

次の行を*〜/.bashrc *ファイルに追加することで、Derby環境を設定できます-

export DERBY_HOME=/usr/local/derby
export PATH=$PATH:$DERBY_HOME/bin
export CLASSPATH=$CLASSPATH:$DERBY_HOME/lib/derby.jar:$DERBY_HOME/lib/derbytools.jar

次のコマンドは、*〜/.bashrc file *を実行するために使用されます-

$ source ~/.bashrc

メタストアのディレクトリを作成する

$ DERBY_HOMEディレクトリに data という名前のディレクトリを作成して、メタストアデータを保存します。

$ mkdir $DERBY_HOME/data

これで、Derbyのインストールと環境設定が完了しました。

ステップ11:Hiveメタストアの構成

メタストアの構成とは、データベースの保存場所をHiveに指定することを意味します。 これを行うには、 $ HIVE_HOME/conf ディレクトリにある hive-site.xml ファイルを編集します。 まず、次のコマンドを使用してテンプレートファイルをコピーします-

$ cd $HIVE_HOME/conf
$ cp hive-default.xml.template hive-site.xml
*hive-site.xml* を編集し、<configuration>タグと</configuration>タグの間に次の行を追加します-
<property>
   <name>javax.jdo.option.ConnectionURL</name>
   <value>jdbc:derby://localhost:1527/metastore_db;create = true</value>
   <description>JDBC connect string for a JDBC metastore</description>
</property>
*jpox.properties* という名前のファイルを作成し、それに次の行を追加します-
javax.jdo.PersistenceManagerFactoryClass = org.jpox.PersistenceManagerFactoryImpl

org.jpox.autoCreateSchema = false
org.jpox.validateTables = false
org.jpox.validateColumns = false
org.jpox.validateConstraints = false

org.jpox.storeManagerType = rdbms
org.jpox.autoCreateSchema = true
org.jpox.autoStartMechanismMode = checked
org.jpox.transactionIsolation = read_committed

javax.jdo.option.DetachAllOnCommit = true
javax.jdo.option.NontransactionalRead = true
javax.jdo.option.ConnectionDriverName = org.apache.derby.jdbc.ClientDriver
javax.jdo.option.ConnectionURL = jdbc:derby://hadoop1:1527/metastore_db;create = true
javax.jdo.option.ConnectionUserName = APP
javax.jdo.option.ConnectionPassword = mine

ステップ12:Hiveインストールの検証

Hiveを実行する前に、HDFSに /tmp フォルダーと別のHiveフォルダーを作成する必要があります。 ここでは、 /user/hive/warehouse フォルダーを使用します。 以下に示すように、これらの新しく作成されたフォルダの書き込み権限を設定する必要があります-

chmod g+w

Hiveを検証する前に、HDFSでそれらを設定します。 次のコマンドを使用します-

$ $HADOOP_HOME/bin/hadoop fs -mkdir/tmp
$ $HADOOP_HOME/bin/hadoop fs -mkdir/user/hive/warehouse
$ $HADOOP_HOME/bin/hadoop fs -chmod g+w/tmp
$ $HADOOP_HOME/bin/hadoop fs -chmod g+w/user/hive/warehouse

次のコマンドは、Hiveのインストールを確認するために使用されます-

$ cd $HIVE_HOME
$ bin/hive

Hiveが正常にインストールされると、次の応答が表示されます-

Logging initialized using configuration in
   jar:file:/home/hadoop/hive-0.9.0/lib/hive-common-0.9.0.jar!/
hive-log4j.properties Hive history
   =/tmp/hadoop/hive_job_log_hadoop_201312121621_1494929084.txt
………………….
hive>

次のサンプルコマンドを実行して、すべてのテーブルを表示できます-

hive> show tables;
OK Time taken: 2.798 seconds
hive>

ステップ13:HCatalogインストールの検証

次のコマンドを使用して、HCatalogホームのシステム変数 HCAT_HOME を設定します。

export HCAT_HOME = $HiVE_HOME/HCatalog

次のコマンドを使用して、HCatalogのインストールを確認します。

cd $HCAT_HOME/bin
./hcat

インストールが成功した場合、次の出力が表示されます-

SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
usage: hcat { -e "<query>" | -f "<filepath>" }
   [ -g "<group>" ] [ -p "<perms>" ]
   [ -D"<name> = <value>" ]

-D <property = value>    use hadoop value for given property
-e <exec>                hcat command given from command line
-f <file>                hcat commands in file
-g <group>               group for the db/table specified in CREATE statement
-h,--help                Print help information
-p <perms>               permissions for the db/table specified in CREATE statement

HCatalog-CLI

HCatalogコマンドラインインターフェイス(CLI)は、コマンド $ HIVE_HOME/HCatalog/bin/hcat から呼び出すことができます。$ HIVE_HOMEはHiveのホームディレクトリです。 hcat は、HCatalogサーバーを初期化するために使用されるコマンドです。

次のコマンドを使用して、HCatalogコマンドラインを初期化します。

cd $HCAT_HOME/bin
./hcat

インストールが正しく行われている場合、次の出力が得られます-

SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
usage: hcat { -e "<query>" | -f "<filepath>" }
   [ -g "<group>" ] [ -p "<perms>" ]
   [ -D"<name> = <value>" ]

-D <property = value>    use hadoop value for given property
-e <exec>                hcat command given from command line
-f <file>                hcat commands in file
-g <group>               group for the db/table specified in CREATE statement
-h,--help                Print help information
-p <perms>               permissions for the db/table specified in CREATE statement

HCatalog CLIは、これらのコマンドラインオプションをサポートしています-

Sr.No Option Example & Description
1 -g

hcat -g mygroup …​

作成するテーブルには、グループ「mygroup」が必要です。

2 -p

hcat -p rwxr-xr-x …​

作成するテーブルには、読み取り、書き込み、実行の権限が必要です。

3 -f

hcat -f myscript.HCatalog …​

myscript.HCatalogは、実行するDDLコマンドを含むスクリプトファイルです。

4 -e

hcat -e 'create table mytable(a int);' …​

次の文字列をDDLコマンドとして扱い、実行します。

5 -D

hcat -Dkey = value …​

キーと値のペアをJavaシステムプロパティとしてHCatalogに渡します。

6 -

hcat

使用法メッセージを出力します。

注-

  • -g および -p オプションは必須ではありません。
  • 一度に、両方ではなく、-e *または *-f オプションのいずれかを指定できます。 *オプションの順序は重要ではありません。オプションは任意の順序で指定できます。
Sr.No DDL Command & Description
1
  • CREATE TABLE*

HCatalogを使用してテーブルを作成します。 CLUSTERED BY句を使用してテーブルを作成した場合、PigまたはMapReduceを使用してテーブルに書き込むことはできません。

2

ALTER TABLE

REBUILDおよびCONCATENATEオプションを除いてサポートされています。 その動作は、Hiveと同じです。

3

DROP TABLE

サポートされています。 Hiveと同じ動作(完全なテーブルと構造を削除)。

4

CREATE/ALTER/DROP VIEW

サポートされています。 Hiveと同じ動作。

注意-PigおよびMapReduceは、ビューからの読み取りまたはビューへの書き込みを行えません。

5

SHOW TABLES

テーブルのリストを表示します。

6

SHOW PARTITIONS

パーティションのリストを表示します。

7

Create/Drop Index

CREATEおよびDROP FUNCTION操作はサポートされていますが、作成された関数は引き続きPigに登録し、MapReduceのCLASSPATHに配置する必要があります。

8

DESCRIBE

サポートされています。 Hiveと同じ動作。 構造を説明してください。

上記の表の一部のコマンドについては、以降の章で説明します。

HCatalog-テーブルの作成

この章では、テーブルの作成方法とデータの挿入方法について説明します。 HCatalogでテーブルを作成する規則は、Hiveを使用してテーブルを作成することに非常に似ています。

テーブルステートメントの作成

Create Tableは、HCatalogを使用してHiveメタストアにテーブルを作成するために使用されるステートメントです。 その構文と例は次のとおりです-

構文

CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.] table_name
[(col_name data_type [COMMENT col_comment], ...)]
[COMMENT table_comment]
[ROW FORMAT row_format]
[STORED AS file_format]

*CREATE TABLE* ステートメントを使用して *employee* という名前のテーブルを作成する必要があると仮定します。 次の表は、 *employee* テーブルのフィールドとそのデータ型を示しています-
Sr.No Field Name Data Type
1 Eid int
2 Name String
3 Salary Float
4 Designation string

以下のデータは、 CommentField terminatorLines terminatorStored File type などの行形式フィールドなどのサポートされているフィールドを定義しています。

COMMENT ‘Employee details’
FIELDS TERMINATED BY ‘\t’
LINES TERMINATED BY ‘\n’
STORED IN TEXT FILE

次のクエリは、上記のデータを使用して employee という名前のテーブルを作成します。

./hcat –e "CREATE TABLE IF NOT EXISTS employee ( eid int, name String,
   salary String, destination String) \
COMMENT 'Employee details' \
ROW FORMAT DELIMITED \
FIELDS TERMINATED BY ‘\t’ \
LINES TERMINATED BY ‘\n’ \
STORED AS TEXTFILE;"

オプション IF NOT EXISTS を追加すると、HCatalogは、テーブルが既に存在する場合にステートメントを無視します。

テーブルの作成が成功すると、次の応答が表示されます-

OK
Time taken: 5.905 seconds

データの読み込みステートメント

一般に、SQLでテーブルを作成した後、Insertステートメントを使用してデータを挿入できます。 ただし、HCatalogでは、LOAD DATAステートメントを使用してデータを挿入します。

HCatalogにデータを挿入する際、LOAD DATAを使用してバルクレコードを保存することをお勧めします。 データをロードするには2つの方法があります。1つは*ローカルファイルシステム*から、もう1つは* Hadoopファイルシステム*からです。

構文

LOAD DATAの構文は次のとおりです-

LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename
[PARTITION (partcol1=val1, partcol2=val2 ...)]
  • LOCALは、ローカルパスを指定する識別子です。 オプションです。
  • OVERWRITEは、テーブル内のデータを上書きするためのオプションです。
  • PARTITIONはオプションです。

次のデータをテーブルに挿入します。 これは、 /home/user ディレクトリにある sample.txt という名前のテキストファイルです。

1201  Gopal        45000    Technical manager
1202  Manisha      45000    Proof reader
1203  Masthanvali  40000    Technical writer
1204  Kiran        40000    Hr Admin
1205  Kranthi      30000    Op Admin

次のクエリは、指定されたテキストをテーブルにロードします。

./hcat –e "LOAD DATA LOCAL INPATH '/home/user/sample.txt'
OVERWRITE INTO TABLE employee;"

ダウンロードが成功すると、次の応答が表示されます-

OK
Time taken: 15.905 seconds

HCatalog-テーブルの変更

この章では、テーブル名の変更、列名の変更、列の追加、列の削除または置換など、表の属性を変更する方法について説明します。

テーブルの変更ステートメント

ALTER TABLEステートメントを使用して、Hiveのテーブルを変更できます。

構文

このステートメントは、テーブル内で変更する属性に基づいて、次の構文のいずれかを使用します。

ALTER TABLE name RENAME TO new_name
ALTER TABLE name ADD COLUMNS (col_spec[, col_spec ...])
ALTER TABLE name DROP [COLUMN] column_name
ALTER TABLE name CHANGE column_name new_name new_type
ALTER TABLE name REPLACE COLUMNS (col_spec[, col_spec ...])

いくつかのシナリオを以下で説明します。

名前を変更…ステートメント

次のクエリは、テーブルの名前を employee から emp に変更します。

./hcat –e "ALTER TABLE employee RENAME TO emp;"

変更ステートメント

次の表には、 employee テーブルのフィールドが含まれており、変更するフィールドを太字で示しています。

Field Name Convert from Data Type Change Field Name Convert to Data Type
eid int eid int
name String ename String
salary Float salary Double
designation String designation String

次のクエリは、上記のデータを使用して列名と列データ型の名前を変更します-

./hcat –e "ALTER TABLE employee CHANGE name ename String;"
./hcat –e "ALTER TABLE employee CHANGE salary salary Double;"

列ステートメントの追加

次のクエリは、 dept という名前の列を employee テーブルに追加します。

./hcat –e "ALTER TABLE employee ADD COLUMNS (dept STRING COMMENT 'Department name');"

置換ステートメント

次のクエリは、 employee テーブルからすべての列を削除し、 emp および name 列に置き換えます-

./hcat – e "ALTER TABLE employee REPLACE COLUMNS ( eid INT empid Int, ename STRING name String);"

テーブルステートメントの削除

この章では、HCatalogでテーブルを削除する方法について説明します。 メタストアからテーブルを削除すると、テーブル/列のデータとそのメタデータが削除されます。 通常のテーブル(メタストアに格納)または外部テーブル(ローカルファイルシステムに格納)のいずれかです。 HCatalogは、タイプに関係なく、両方を同じ方法で扱います。

構文は次のとおりです-

DROP TABLE [IF EXISTS] table_name;

次のクエリは、 employee という名前のテーブルを削除します-

./hcat –e "DROP TABLE IF EXISTS employee;"

クエリが正常に実行されると、次の応答が表示されます-

OK
Time taken: 5.3 seconds

HCatalog-表示

この章では、HCatalogで view を作成および管理する方法について説明します。 データベースビューは、 CREATE VIEW ステートメントを使用して作成されます。 ビューは、単一のテーブル、複数のテーブル、または別のビューから作成できます。

ビューを作成するには、特定の実装に応じて適切なシステム権限が必要です。

ビューステートメントの作成

*CREATE VIEW* は、指定された名前でビューを作成します。 同じ名前のテーブルまたはビューが既に存在する場合、エラーがスローされます。 *IF NOT EXISTS* を使用してエラーをスキップできます。

列名が指定されていない場合、ビューの列の名前は defining SELECT expression から自動的に導出されます。

注意-SELECTにx + yなどのエイリアスのないスカラー式が含まれる場合、結果のビュー列名は_C0、_C1などの形式で生成されます。

列の名前を変更するときに、列のコメントも提供できます。 コメントは、基になる列から自動的に継承されません。

ビューの*定義SELECT式*が無効な場合、CREATE VIEWステートメントは失敗します。

構文

CREATE VIEW [IF NOT EXISTS] [db_name.]view_name [(column_name [COMMENT column_comment], ...) ]
[COMMENT view_comment]
[TBLPROPERTIES (property_name = property_value, ...)]
AS SELECT ...;

以下は従業員テーブルのデータです。 ここで、給与が35,000を超える従業員のフィールドid、name、Designation、salaryを含む Emp_Deg_View という名前のビューを作成する方法を見てみましょう。

+------+-------------+--------+-------------------+-------+
|  ID  |    Name     | Salary |    Designation    | Dept  |
+------+-------------+--------+-------------------+-------+
| 1201 |    Gopal    | 45000  | Technical manager |  TP   |
| 1202 |   Manisha   | 45000  | Proofreader       |  PR   |
| 1203 | Masthanvali | 30000  | Technical writer  |  TP   |
| 1204 |    Kiran    | 40000  | Hr Admin          |  HR   |
| 1205 |   Kranthi   | 30000  | Op Admin          | Admin |
+------+-------------+--------+-------------------+-------+

以下は、上記のデータに基づいてビューを作成するコマンドです。

./hcat –e "CREATE VIEW Emp_Deg_View (salary COMMENT ' salary more than 35,000')
   AS SELECT id, name, salary, designation FROM employee WHERE salary ≥ 35000;"

出力

OK
Time taken: 5.3 seconds

ドロップビューステートメント

DROP VIEWは、指定されたビューのメタデータを削除します。 他のビューによって参照されているビューをドロップする場合、警告は表示されません(依存するビューは無効であるため、ユーザーがドロップまたは再作成する必要があります)。

構文

DROP VIEW [IF EXISTS] view_name;

次のコマンドを使用して、 Emp_Deg_View という名前のビューを削除します。

DROP VIEW Emp_Deg_View;

HCatalog-テーブルの表示

多くの場合、データベース内のすべてのテーブルをリストするか、テーブル内のすべての列をリストします。 明らかに、すべてのデータベースには、テーブルと列をリストする独自の構文があります。

*Show Tables* ステートメントは、すべてのテーブルの名前を表示します。 デフォルトでは、指定されたデータベースの現在のデータベースから、または *IN* 句を使用してテーブルをリストします。

この章では、HCatalogの現在のデータベースからすべてのテーブルをリストする方法について説明します。

テーブルの表示ステートメント

SHOW TABLESの構文は次のとおりです-

SHOW TABLES [IN database_name] ['identifier_with_wildcards'];

次のクエリは、テーブルのリストを表示します-

./hcat –e "Show tables;"

クエリが正常に実行されると、次の応答が表示されます-

OK
emp
employee
Time taken: 5.3 seconds

HCatalog-パーティションの表示

パーティションは、個別のテーブルまたはビューを作成するために使用される表形式データの条件です。 SHOW PARTITIONSは、指定された実表の既存のパーティションをすべてリストします。 パーティションはアルファベット順にリストされています。 Hive 0.6以降、パーティション仕様の一部を指定して、結果のリストをフィルタリングすることもできます。

SHOW PARTITIONSコマンドを使用して、特定のテーブルに存在するパーティションを表示できます。 この章では、HCatalogの特定のテーブルのパーティションをリストする方法について説明します。

パーティションステートメントを表示

構文は次のとおりです-

SHOW PARTITIONS table_name;

次のクエリは、 employee という名前のテーブルを削除します-

./hcat –e "Show partitions employee;"

クエリが正常に実行されると、次の応答が表示されます-

OK
Designation = IT
Time taken: 5.3 seconds

動的パーティション

HCatalogは、テーブルをパーティションに編成します。 これは、日付、都市、部門などのパーティション化された列の値に基づいて、テーブルを関連部分に分割する方法です。 パーティションを使用すると、データの一部を簡単に照会できます。

たとえば、 Tab1 という名前のテーブルには、id、name、dept、yoj(参加年)などの従業員データが含まれます。 2012年に参加したすべての従業員の詳細を取得する必要があるとします。 クエリは、テーブル全体から必要な情報を検索します。 ただし、従業員データを年で分割し、別のファイルに保存すると、クエリの処理時間が短縮されます。 次の例は、ファイルとそのデータを分割する方法を示しています-

次のファイルには employeedata テーブルが含まれています。

====/tab1/employeedata/file1

id, name,   dept, yoj
1,  gopal,   TP, 2012
2,  kiran,   HR, 2012
3,  kaleel,  SC, 2013
4, Prasanth, SC, 2013

上記のデータは、年を使用して2つのファイルに分割されます。

====/tab1/employeedata/2012/file2

1, gopal, TP, 2012
2, kiran, HR, 2012

====/tab1/employeedata/2013/file3

3, kaleel,   SC, 2013
4, Prasanth, SC, 2013

パーティションを追加する

テーブルを変更することで、テーブルにパーティションを追加できます。 Id、Name、Salary、Designation、Dept、yojなどのフィールドを持つ employee というテーブルがあると仮定します。

構文

ALTER TABLE table_name ADD [IF NOT EXISTS] PARTITION partition_spec
[LOCATION 'location1'] partition_spec [LOCATION 'location2'] ...;
partition_spec:
: (p_column = p_col_value, p_column = p_col_value, ...)

次のクエリは、 employee テーブルにパーティションを追加するために使用されます。

./hcat –e "ALTER TABLE employee ADD PARTITION (year = '2013') location '/2012/part2012';"

パーティションの名前を変更する

RENAME-TOコマンドを使用して、パーティションの名前を変更できます。 その構文は次のとおりです-

./hact –e "ALTER TABLE table_name PARTITION partition_spec RENAME TO PARTITION partition_spec;"

次のクエリは、パーティションの名前を変更するために使用されます-

./hcat –e "ALTER TABLE employee PARTITION (year=’1203’) RENAME TO PARTITION (Yoj='1203');"

パーティションの削除

パーティションを削除するために使用されるコマンドの構文は次のとおりです-

./hcat –e "ALTER TABLE table_name DROP [IF EXISTS] PARTITION partition_spec,.
   PARTITION partition_spec,...;"

次のクエリは、パーティションを削除するために使用されます-

./hcat –e "ALTER TABLE employee DROP [IF EXISTS] PARTITION (year=’1203’);"

HCatalog-インデックス

インデックスを作成する

インデックスは、テーブルの特定の列へのポインタにすぎません。 インデックスの作成とは、テーブルの特定の列にポインターを作成することを意味します。 その構文は次のとおりです-

CREATE INDEX index_name
ON TABLE base_table_name (col_name, ...)
AS 'index.handler.class.name'
[WITH DEFERRED REBUILD]
[IDXPROPERTIES (property_name = property_value, ...)]
[IN TABLE index_table_name]
[PARTITIONED BY (col_name, ...)][
   [ ROW FORMAT ...] STORED AS ...
   | STORED BY ...
]
[LOCATION hdfs_path]
[TBLPROPERTIES (...)]

インデックスの概念を理解するための例を見てみましょう。 Id、Name、Salary、Designation、Deptの各フィールドで以前に使用したものと同じ employee テーブルを使用します。 employee テーブルの salary 列に index_salary という名前のインデックスを作成します。

次のクエリは、インデックスを作成します-

./hcat –e "CREATE INDEX inedx_salary ON TABLE employee(salary)
AS 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler';"

これは、 salary 列へのポインターです。 列が変更された場合、変更はインデックス値を使用して保存されます。

インデックスの削除

次の構文は、インデックスを削除するために使用されます-

DROP INDEX <index_name> ON <table_name>

次のクエリは、インデックスindex_salaryを削除します-

./hcat –e "DROP INDEX index_salary ON employee;"

HCatalog-リーダーライター

HCatalogには、MapReduceを使用しない並列入力および出力用のデータ転送APIが含まれています。 このAPIは、テーブルと行の基本的なストレージ抽象化を使用して、Hadoopクラスターからデータを読み取り、そこにデータを書き込みます。

データ転送APIには、主に3つのクラスが含まれています。それらは-

  • HCatReader -Hadoopクラスターからデータを読み取ります。
  • HCatWriter -Hadoopクラスターにデータを書き込みます。
  • DataTransferFactory -リーダーおよびライターのインスタンスを生成します。

このAPIは、マスタースレーブノードのセットアップに適しています。 HCatReader および HCatWriter について詳しく説明します。

HCatReader

HCatReaderはHCatalog内部の抽象クラスであり、レコードが取得される基になるシステムの複雑さを抽象化します。

Sr.No. Method Name & Description
1

Public abstract ReaderContext prepareRead() throws HCatException

これをマスターノードで呼び出してReaderContextを取得し、シリアル化してスレーブノードに送信する必要があります。

2

Public abstract Iterator <HCatRecorder> read() throws HCaException

これは、HCatRecordを読み取るためにスレーブノードで呼び出す必要があります。

3

Public Configuration getConf()

構成クラスオブジェクトを返します。

HCatReaderクラスは、HDFSからデータを読み取るために使用されます。 読み取りは2段階のプロセスであり、最初のステップは外部システムのマスターノードで行われます。 2番目のステップは、複数のスレーブノードで並行して実行されます。

読み取りは ReadEntity で行われます。 読み取りを開始する前に、読み取り元のReadEntityを定義する必要があります。 これは、 ReadEntity.Builder を使用して実行できます。 データベース名、テーブル名、パーティション、フィルター文字列を指定できます。 たとえば-

ReadEntity.Builder builder = new ReadEntity.Builder();
ReadEntity entity = builder.withDatabase("mydb").withTable("mytbl").build(); 10.

上記のコードスニペットは、 mydb という名前のデータベースに mytbl という名前のテーブルを含むReadEntityオブジェクト(「エンティティ」)を定義します。これは、このテーブルのすべての行を読み取るために使用できます。 このテーブルは、この操作を開始する前にHCatalogに存在する必要があることに注意してください。

ReadEntityを定義した後、ReadEntityとクラスタ構成を使用してHCatReaderのインスタンスを取得します-

HCatReader reader = DataTransferFactory.getHCatReader(entity, config);

次のステップは、次のようにリーダーからReaderContextを取得することです-

ReaderContext cntxt = reader.prepareRead();

HCatWriter

この抽象化はHCatalogの内部にあります。 これは、外部システムからHCatalogへの書き込みを容易にするためです。 これを直接インスタンス化しようとしないでください。 代わりに、DataTransferFactoryを使用してください。

Sr.No. Method Name & Description
1

Public abstract WriterContext prepareRead() throws HCatException

外部システムは、マスターノードからこのメソッドを1回だけ呼び出す必要があります。 WriterContext を返します。 これをシリアル化してスレーブノードに送信し、そこで HCatWriter を構築する必要があります。

2

Public abstract void write(Iterator<HCatRecord> recordItr) throws HCaException

このメソッドは、スレーブノードで書き込みを実行するために使用する必要があります。 recordItrは、HCatalogに書き込まれるレコードのコレクションを含む反復子オブジェクトです。

3

Public abstract void abort(WriterContext cntxt) throws HCatException

このメソッドは、マスターノードで呼び出す必要があります。 このメソッドの主な目的は、障害が発生した場合にクリーンアップを行うことです。

4

public abstract void commit(WriterContext cntxt) throws HCatException

このメソッドは、マスターノードで呼び出す必要があります。 このメソッドの目的は、メタデータのコミットを行うことです。

読み取りと同様に、書き込みも2段階のプロセスであり、最初のステップがマスターノードで発生します。 その後、スレーブノードで2番目のステップが並行して行われます。

書き込みは、読み取りに似た方法で構築できる WriteEntity で行われます-

WriteEntity.Builder builder = new WriteEntity.Builder();
WriteEntity entity = builder.withDatabase("mydb").withTable("mytbl").build();

上記のコードは、データベース mydbmytbl という名前のテーブルに書き込むために使用できるWriteEntityオブジェクト `+ entity +`を作成します。

WriteEntityを作成した後、次のステップはWriterContextを取得することです-

HCatWriter writer = DataTransferFactory.getHCatWriter(entity, config);
WriterContext info = writer.prepareWrite();

上記の手順はすべてマスターノードで実行されます。 次に、マスターノードはWriterContextオブジェクトをシリアル化し、すべてのスレーブで使用できるようにします。

スレーブノードでは、次のようにWriterContextを使用してHCatWriterを取得する必要があります-

HCatWriter writer = DataTransferFactory.getHCatWriter(context);

次に、 writer はイテレータを `+ write +`メソッドの引数として受け取ります-

writer.write(hCatRecordItr);

その後、 writer はループ内でこのイテレーターで* getNext()*を呼び出し、イテレーターに接続されているすべてのレコードを書き出します。

*TestReaderWriter.java* ファイルは、HCatreaderクラスとHCatWriterクラスをテストするために使用されます。 次のプログラムは、HCatReaderおよびHCatWriter APIを使用してソースファイルからデータを読み取り、続いてそれを宛先ファイルに書き込む方法を示しています。
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hive.metastore.api.MetaException;
import org.apache.hadoop.hive.ql.CommandNeedRetryException;
import org.apache.hadoop.mapreduce.InputSplit;

import org.apache.hive.HCatalog.common.HCatException;
import org.apache.hive.HCatalog.data.transfer.DataTransferFactory;
import org.apache.hive.HCatalog.data.transfer.HCatReader;
import org.apache.hive.HCatalog.data.transfer.HCatWriter;
import org.apache.hive.HCatalog.data.transfer.ReadEntity;
import org.apache.hive.HCatalog.data.transfer.ReaderContext;
import org.apache.hive.HCatalog.data.transfer.WriteEntity;
import org.apache.hive.HCatalog.data.transfer.WriterContext;
import org.apache.hive.HCatalog.mapreduce.HCatBaseTest;

import org.junit.Assert;
import org.junit.Test;

public class TestReaderWriter extends HCatBaseTest {
   @Test
   public void test() throws MetaException, CommandNeedRetryException,
      IOException, ClassNotFoundException {

      driver.run("drop table mytbl");
      driver.run("create table mytbl (a string, b int)");

      Iterator<Entry<String, String>> itr = hiveConf.iterator();
      Map<String, String> map = new HashMap<String, String>();

      while (itr.hasNext()) {
         Entry<String, String> kv = itr.next();
         map.put(kv.getKey(), kv.getValue());
      }

      WriterContext cntxt = runsInMaster(map);
      File writeCntxtFile = File.createTempFile("hcat-write", "temp");
      writeCntxtFile.deleteOnExit();

     //Serialize context.
      ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(writeCntxtFile));
      oos.writeObject(cntxt);
      oos.flush();
      oos.close();

     //Now, deserialize it.
      ObjectInputStream ois = new ObjectInputStream(new FileInputStream(writeCntxtFile));
      cntxt = (WriterContext) ois.readObject();
      ois.close();
      runsInSlave(cntxt);
      commit(map, true, cntxt);

      ReaderContext readCntxt = runsInMaster(map, false);
      File readCntxtFile = File.createTempFile("hcat-read", "temp");
      readCntxtFile.deleteOnExit();
      oos = new ObjectOutputStream(new FileOutputStream(readCntxtFile));
      oos.writeObject(readCntxt);
      oos.flush();
      oos.close();

      ois = new ObjectInputStream(new FileInputStream(readCntxtFile));
      readCntxt = (ReaderContext) ois.readObject();
      ois.close();

      for (int i = 0; i < readCntxt.numSplits(); i++) {
         runsInSlave(readCntxt, i);
      }
   }

   private WriterContext runsInMaster(Map<String, String> config) throws HCatException {
      WriteEntity.Builder builder = new WriteEntity.Builder();
      WriteEntity entity = builder.withTable("mytbl").build();

      HCatWriter writer = DataTransferFactory.getHCatWriter(entity, config);
      WriterContext info = writer.prepareWrite();
      return info;
   }

   private ReaderContext runsInMaster(Map<String, String> config,
      boolean bogus) throws HCatException {
      ReadEntity entity = new ReadEntity.Builder().withTable("mytbl").build();
      HCatReader reader = DataTransferFactory.getHCatReader(entity, config);
      ReaderContext cntxt = reader.prepareRead();
      return cntxt;
   }

   private void runsInSlave(ReaderContext cntxt, int slaveNum) throws HCatException {
      HCatReader reader = DataTransferFactory.getHCatReader(cntxt, slaveNum);
      Iterator<HCatRecord> itr = reader.read();
      int i = 1;

      while (itr.hasNext()) {
         HCatRecord read = itr.next();
         HCatRecord written = getRecord(i++);

        //Argh, HCatRecord doesnt implement equals()
         Assert.assertTrue("Read: " + read.get(0) + "Written: " + written.get(0),
         written.get(0).equals(read.get(0)));

         Assert.assertTrue("Read: " + read.get(1) + "Written: " + written.get(1),
         written.get(1).equals(read.get(1)));

         Assert.assertEquals(2, read.size());
      }

     //Assert.assertFalse(itr.hasNext());
   }

   private void runsInSlave(WriterContext context) throws HCatException {
      HCatWriter writer = DataTransferFactory.getHCatWriter(context);
      writer.write(new HCatRecordItr());
   }

   private void commit(Map<String, String> config, boolean status,
      WriterContext context) throws IOException {
      WriteEntity.Builder builder = new WriteEntity.Builder();
      WriteEntity entity = builder.withTable("mytbl").build();
      HCatWriter writer = DataTransferFactory.getHCatWriter(entity, config);

      if (status) {
         writer.commit(context);
      } else {
         writer.abort(context);
      }
   }

   private static HCatRecord getRecord(int i) {
      List<Object> list = new ArrayList<Object>(2);
      list.add("Row #: " + i);
      list.add(i);
      return new DefaultHCatRecord(list);
   }

   private static class HCatRecordItr implements Iterator<HCatRecord> {
      int i = 0;

      @Override
      public boolean hasNext() {
         return i++ < 100 ? true : false;
      }

      @Override
      public HCatRecord next() {
         return getRecord(i);
      }

      @Override
      public void remove() {
         throw new RuntimeException();
      }
   }
}

上記のプログラムは、HDFSからレコードの形式でデータを読み取り、レコードデータを mytable に書き込みます。

HCatalog-入力出力フォーマット

*HCatInputFormat* および *HCatOutputFormat* インターフェースは、HDFSからデータを読み取り、処理後、MapReduceジョブを使用して結果のデータをHDFSに書き込むために使用されます。 入力および出力形式のインターフェイスについて詳しく説明します。

HCatInputFormat

*HCatInputFormat* はMapReduceジョブで使用され、HCatalog管理のテーブルからデータを読み取ります。 HCatInputFormatは、テーブルにパブリッシュされたかのようにデータを読み取るためのHadoop 0.20 MapReduce APIを公開します。
Sr.No. Method Name & Description
1

public static HCatInputFormat setInput(Job job, String dbName, String tableName)throws IOException

ジョブに使用する入力を設定します。 指定された入力仕様でメタストアを照会し、MapReduceタスクのジョブ構成に一致するパーティションをシリアル化します。

2

public static HCatInputFormat setInput(Configuration conf, String dbName, String tableName) throws IOException

ジョブに使用する入力を設定します。 指定された入力仕様でメタストアを照会し、MapReduceタスクのジョブ構成に一致するパーティションをシリアル化します。

3

public HCatInputFormat setFilter(String filter)throws IOException

入力テーブルにフィルターを設定します。

4

public HCatInputFormat setProperties(Properties properties) throws IOException

入力形式のプロパティを設定します。

*HCatInputFormat* APIには次のメソッドが含まれています-
  • setInput

  • setOutputSchema

  • getTableSchema

    *HCatInputFormat* を使用してデータを読み取るには、まず、読み取られるテーブルの必要な情報を使用して *InputJobInfo* をインスタンス化し、次に *InputJobInfo* を使用して *setInput* を呼び出します。
    *setOutputSchema* メソッドを使用して *projection schema* を含め、出力フィールドを指定できます。 スキーマが指定されていない場合、テーブル内のすべての列が返されます。 getTableSchemaメソッドを使用して、指定した入力テーブルのテーブルスキーマを決定できます。

HCatOutputFormat

HCatOutputFormatはMapReduceジョブで使用され、HCatalog管理のテーブルにデータを書き込みます。 HCatOutputFormatは、テーブルにデータを書き込むためのHadoop 0.20 MapReduce APIを公開します。 MapReduceジョブがHCatOutputFormatを使用して出力を書き込む場合、テーブルに設定されたデフォルトのOutputFormatが使用され、ジョブの完了後に新しいパーティションがテーブルに公開されます。

Sr.No. Method Name & Description
1

public static void setOutput (Configuration conf, Credentials credentials, OutputJobInfo outputJobInfo) throws IOException

ジョブについて書き込む出力に関する情報を設定します。 メタデータサーバーに照会して、テーブルに使用するStorageHandlerを見つけます。 パーティションが既に公開されている場合、エラーがスローされます。

2

public static void setSchema (Configuration conf, HCatSchema schema) throws IOException

パーティションに書き出されるデータのスキーマを設定します。 テーブルスキーマは、これが呼び出されない場合、デフォルトでパーティションに使用されます。

3

public RecordWriter <WritableComparable<?>, HCatRecord > getRecordWriter (TaskAttemptContext context)throws IOException, InterruptedException

ジョブのレコードライターを取得します。 StorageHandlerのデフォルトのOutputFormatを使用して、レコードライターを取得します。

4

public OutputCommitter getOutputCommitter (TaskAttemptContext context) throws IOException, InterruptedException

この出力形式の出力コミッターを取得します。 出力が正しくコミットされるようにします。

*HCatOutputFormat* APIには次のメソッドが含まれています-
  • setOutput
  • setSchema
  • getTableSchema

HCatOutputFormatの最初の呼び出しは setOutput でなければなりません。他の呼び出しは、出力形式が初期化されていないことを示す例外をスローします。

書き出されるデータのスキーマは、 setSchema メソッドによって指定されます。 書き込むデータのスキーマを提供して、このメソッドを呼び出す必要があります。 データのスキーマがテーブルスキーマと同じ場合、* HCatOutputFormat.getTableSchema()を使用してテーブルスキーマを取得し、それを setSchema()*に渡すことができます。

次のMapReduceプログラムは、2番目の列(「列1」)に整数があると見なされる1つのテーブルからデータを読み取り、検出した各個別値のインスタンス数をカウントします。 つまり、 "* select col1、count(*)from $ table group by col1; *"と同等です。

たとえば、2番目の列の値が\ {1、1、1、3、3、5}である場合、プログラムは値とカウントの次の出力を生成します-

1, 3
3, 2
5, 1

私たちは今プログラムコードを見てみましょう-

import java.io.IOException;
import java.util.Iterator;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.WritableComparable;

import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;

import org.apache.hadoop.util.GenericOptionsParser;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;

import org.apache.HCatalog.common.HCatConstants;
import org.apache.HCatalog.data.DefaultHCatRecord;
import org.apache.HCatalog.data.HCatRecord;
import org.apache.HCatalog.data.schema.HCatSchema;

import org.apache.HCatalog.mapreduce.HCatInputFormat;
import org.apache.HCatalog.mapreduce.HCatOutputFormat;
import org.apache.HCatalog.mapreduce.InputJobInfo;
import org.apache.HCatalog.mapreduce.OutputJobInfo;

public class GroupByAge extends Configured implements Tool {

   public static class Map extends Mapper<WritableComparable,
      HCatRecord, IntWritable, IntWritable> {
      int age;

      @Override
      protected void map(
         WritableComparable key, HCatRecord value,
         org.apache.hadoop.mapreduce.Mapper<WritableComparable,
         HCatRecord, IntWritable, IntWritable>.Context context
      )throws IOException, InterruptedException {
         age = (Integer) value.get(1);
         context.write(new IntWritable(age), new IntWritable(1));
      }
   }

   public static class Reduce extends Reducer<IntWritable, IntWritable,
      WritableComparable, HCatRecord> {
      @Override
      protected void reduce(
         IntWritable key, java.lang.Iterable<IntWritable> values,
         org.apache.hadoop.mapreduce.Reducer<IntWritable, IntWritable,
         WritableComparable, HCatRecord>.Context context
      )throws IOException ,InterruptedException {
         int sum = 0;
         Iterator<IntWritable> iter = values.iterator();

         while (iter.hasNext()) {
            sum++;
            iter.next();
         }

         HCatRecord record = new DefaultHCatRecord(2);
         record.set(0, key.get());
         record.set(1, sum);
         context.write(null, record);
      }
   }

   public int run(String[] args) throws Exception {
      Configuration conf = getConf();
      args = new GenericOptionsParser(conf, args).getRemainingArgs();

      String serverUri = args[0];
      String inputTableName = args[1];
      String outputTableName = args[2];
      String dbName = null;
      String principalID = System

      .getProperty(HCatConstants.HCAT_METASTORE_PRINCIPAL);
      if (principalID != null)
      conf.set(HCatConstants.HCAT_METASTORE_PRINCIPAL, principalID);
      Job job = new Job(conf, "GroupByAge");
      HCatInputFormat.setInput(job, InputJobInfo.create(dbName, inputTableName, null));

     //initialize HCatOutputFormat
      job.setInputFormatClass(HCatInputFormat.class);
      job.setJarByClass(GroupByAge.class);
      job.setMapperClass(Map.class);
      job.setReducerClass(Reduce.class);

      job.setMapOutputKeyClass(IntWritable.class);
      job.setMapOutputValueClass(IntWritable.class);
      job.setOutputKeyClass(WritableComparable.class);
      job.setOutputValueClass(DefaultHCatRecord.class);

      HCatOutputFormat.setOutput(job, OutputJobInfo.create(dbName, outputTableName, null));
      HCatSchema s = HCatOutputFormat.getTableSchema(job);
      System.err.println("INFO: output schema explicitly set for writing:" + s);
      HCatOutputFormat.setSchema(job, s);
      job.setOutputFormatClass(HCatOutputFormat.class);
      return (job.waitForCompletion(true) ? 0 : 1);
   }

   public static void main(String[] args) throws Exception {
      int exitCode = ToolRunner.run(new GroupByAge(), args);
      System.exit(exitCode);
   }
}

上記のプログラムをコンパイルする前に、いくつかの jar をダウンロードし、それらをこのアプリケーションの classpath に追加する必要があります。 すべてのHive jarおよびHCatalog jar(HCatalog-core-0.5.0.jar、hive-metastore-0.10.0.jar、libthrift-0.7.0.jar、hive-exec-0.10.0.jar、 libfb303-0.7.0.jar、jdo2-api-2.3-ec.jar、slf4j-api-1.6.1.jar)。

次のコマンドを使用して、これらの jar ファイルを local から HDFS にコピーし、 classpath に追加します。

bin/hadoop fs -copyFromLocal $HCAT_HOME/share/HCatalog/HCatalog-core-0.5.0.jar/tmp
bin/hadoop fs -copyFromLocal $HIVE_HOME/lib/hive-metastore-0.10.0.jar/tmp
bin/hadoop fs -copyFromLocal $HIVE_HOME/lib/libthrift-0.7.0.jar/tmp
bin/hadoop fs -copyFromLocal $HIVE_HOME/lib/hive-exec-0.10.0.jar/tmp
bin/hadoop fs -copyFromLocal $HIVE_HOME/lib/libfb303-0.7.0.jar/tmp
bin/hadoop fs -copyFromLocal $HIVE_HOME/lib/jdo2-api-2.3-ec.jar/tmp
bin/hadoop fs -copyFromLocal $HIVE_HOME/lib/slf4j-api-1.6.1.jar/tmp

export LIB_JARS=hdfs:///tmp/HCatalog-core-0.5.0.jar,
hdfs:///tmp/hive-metastore-0.10.0.jar,
hdfs:///tmp/libthrift-0.7.0.jar,
hdfs:///tmp/hive-exec-0.10.0.jar,
hdfs:///tmp/libfb303-0.7.0.jar,
hdfs:///tmp/jdo2-api-2.3-ec.jar,
hdfs:///tmp/slf4j-api-1.6.1.jar

次のコマンドを使用して、指定されたプログラムをコンパイルおよび実行します。

$HADOOP_HOME/bin/hadoop jar GroupByAge tmp/hive

次に、出力(part_0000、part_0001)の出力ディレクトリ(hdfs:user/tmp/hive)を確認します。

HCatalog-ローダーとストアー

*HCatLoader* および *HCatStorer* APIはPigスクリプトで使用され、HCatalog管理テーブルのデータを読み書きします。 これらのインターフェースには、HCatalog固有のセットアップは必要ありません。

この章をよりよく理解するには、Apache Pigスクリプトに関する知識が必要です。 詳細については、リンク:/apache_pig/index [Apache Pig]チュートリアルをご覧ください。

HCatloader

HCatLoaderは、HCatalogが管理するテーブルからデータを読み取るためにPigスクリプトとともに使用されます。 次の構文を使用して、HCatloaderを使用してHDFSにデータをロードします。

A = LOAD 'tablename' USING org.apache.HCatalog.pig.HCatLoader();

テーブル名を一重引用符で指定する必要があります: LOAD 'tablename' 。 デフォルト以外のデータベースを使用している場合、入力を ' dbname.tablename' として指定する必要があります。

Hiveメタストアを使用すると、データベースを指定せずにテーブルを作成できます。 この方法でテーブルを作成した場合、データベース名は 'default' であり、HCatLoaderのテーブルを指定するときは不要です。

次の表には、HCatloaderクラスの重要なメソッドと説明が含まれています。

Sr.No. Method Name & Description
1

public InputFormat<?,?> getInputFormat()throws IOException

HCatloaderクラスを使用して、読み込みデータの入力形式を読み取ります。

2

public String relativeToAbsolutePath(String location, Path curDir) throws IOException

  • 絶対パス*の文字列形式を返します。
3

public void setLocation(String location, Job job) throws IOException

ジョブを実行できる場所を設定します。

4

public Tuple getNext() throws IOException

ループから現在のタプル(キー*および*値)を返します。

HCatStorer

HCatStorerはPigスクリプトとともに使用され、HCatalog管理のテーブルにデータを書き込みます。 格納操作には次の構文を使用します。

A = LOAD ...
B = FOREACH A ...
...
...
my_processed_data = ...

STORE my_processed_data INTO 'tablename' USING org.apache.HCatalog.pig.HCatStorer();

テーブル名を一重引用符で指定する必要があります: LOAD 'tablename' 。 Pigスクリプトを実行する前に、データベースとテーブルの両方を作成する必要があります。 デフォルト以外のデータベースを使用している場合、入力を 'dbname.tablename' として指定する必要があります。

Hiveメタストアを使用すると、データベースを指定せずにテーブルを作成できます。 この方法でテーブルを作成した場合、データベース名は 'default' であり、 store ステートメントでデータベース名を指定する必要はありません。

*USING* 句には、パーティションのキー/値のペアを表す文字列引数を指定できます。 これは、パーティションテーブルに書き込みを行い、パーティション列が出力列にない場合の必須引数です。 パーティションキーの値は引用符で囲まないでください。

次の表には、HCatStorerクラスの重要なメソッドと説明が含まれています。

Sr.No. Method Name & Description
1

public OutputFormat getOutputFormat() throws IOException

HCatStorerクラスを使用して、保存されたデータの出力形式を読み取ります。

2

public void setStoreLocation (String location, Job job) throws IOException

この store アプリケーションを実行する場所を設定します。

3

public void storeSchema (ResourceSchema schema, String arg1, Job job) throws IOException

スキーマを保存します。

4

public void prepareToWrite (RecordWriter writer) throws IOException

RecordWriterを使用して特定のファイルにデータを書き込むのに役立ちます。

5

public void putNext (Tuple tuple) throws IOException

タプルデータをファイルに書き込みます。

HCatalogでPigを実行する

PigはHCatalog jarを自動的にピックアップしません。 必要なjarを取り込むには、Pigコマンドでフラグを使用するか、以下で説明するように環境変数 PI​​G_CLASSPATH および PIG_OPTS を設定します。

HCatalogで作業するための適切なjarファイルを取り込むには、単に次のフラグを含めます-

pig –useHCatalog <Sample pig scripts file>

実行のためのCLASSPATHの設定

以下のCLASSPATH設定を使用して、HCatalogをApache Pigと同期します。

export HADOOP_HOME = <path_to_hadoop_install>
export HIVE_HOME = <path_to_hive_install>
export HCAT_HOME = <path_to_hcat_install>

export PIG_CLASSPATH = $HCAT_HOME/share/HCatalog/HCatalog-core*.jar:\
$HCAT_HOME/share/HCatalog/HCatalog-pig-adapter*.jar:\
$HIVE_HOME/lib/hive-metastore-*.jar:$HIVE_HOME/lib/libthrift-*.jar:\
$HIVE_HOME/lib/hive-exec-*.jar:$HIVE_HOME/lib/libfb303-*.jar:\
$HIVE_HOME/lib/jdo2-api-*-ec.jar:$HIVE_HOME/conf:$HADOOP_HOME/conf:\
$HIVE_HOME/lib/slf4j-api-*.jar

次の内容のファイル student_details.txt がHDFSにあると仮定します。

*student_details.txt*
001, Rajiv,    Reddy,       21, 9848022337, Hyderabad
002, siddarth, Battacharya, 22, 9848022338, Kolkata
003, Rajesh,   Khanna,      22, 9848022339, Delhi
004, Preethi,  Agarwal,     21, 9848022330, Pune
005, Trupthi,  Mohanthy,    23, 9848022336, Bhuwaneshwar
006, Archana,  Mishra,      23, 9848022335, Chennai
007, Komal,    Nayak,       24, 9848022334, trivendram
008, Bharathi, Nambiayar,   24, 9848022333, Chennai

同じHDFSディレクトリに sample_script.pig という名前のサンプルスクリプトもあります。 このファイルには、以下に示すように、 student 関係で操作と変換を実行するステートメントが含まれています。

student = LOAD 'hdfs://localhost:9000/pig_data/student_details.txt' USING
   PigStorage(',') as (id:int, firstname:chararray, lastname:chararray,
   phone:chararray, city:chararray);

student_order = ORDER student BY age DESC;
STORE student_order INTO 'student_order_table' USING org.apache.HCatalog.pig.HCatStorer();
student_limit = LIMIT student_order 4;
Dump student_limit;
  • スクリプトの最初のステートメントは、 student_details.txt という名前のファイルのデータを student という名前の関係としてロードします。
  • スクリプトの2番目のステートメントは、関係のタプルを年齢に基づいて降順に並べ、 student_order として保存します。
  • 3番目のステートメントは、処理されたデータ student_order を保存し、 student_order_table という名前の別のテーブルを作成します。
  • スクリプトの4番目のステートメントは、 student_order の最初の4つのタプルを student_limit として保存します。
  • 最後に、5番目のステートメントはリレーション student_limit の内容をダンプします。

次に示すように、 sample_script.pig を実行します。

$./pig -useHCatalog hdfs://localhost:9000/pig_data/sample_script.pig

次に、出力(part_0000、part_0001)の出力ディレクトリ(hdfs:user/tmp/hive)を確認します。