Hiveの環境構築

Hive環境構築

インストール

1.javaのインストール

7系のjavaをインストールしてパスを通しておきます。

export JAVA_HOME=/usr/local/jdk1.7.0_71
export PATH=$PATH:$JAVA_HOME/bin

2.Hadoopのインストール

hadoop version

パスの設定

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

core-site.xmlにNameNodeの情報を設定する

<configuration>

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

</configuration>

hdfs-site.xmlを編集してNameNode,DataNodeのデータ保存先を設定する

<configuration>

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

</configuration>

yarn-site.xmlを編集yarn.nodemanager.aux-servicesにmapreduce_shuffleを設定する

<configuration>

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

</configuration>

map-red-site.xmlを変数しmapreduce.framework.nameにyarnを設定する

<configuration>

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

</configuration>

NameNodeをフォーマットする

hdfs namenode -format

3.Hiveのインストール

Hiveをダウンロードする。インストール済みのhadoopにあっているバージョンを選びます。 https://hive.apache.org/downloads.html ダウンロード後に解凍します。それから、パスを通します。

export HIVE_HOME=/opt/
export PATH=$PATH:$HIVE_HOME/bin
export CLASSPATH=$CLASSPATH:$HADOOP_HOME/lib/*:.
export CLASSPATH=$CLASSPATH:$HIVE_HOME/lib/*:.

hive-env.shを有効にする

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

hiveのメタ情報保存先の設定

今回はPostgreSQLにhiveのめた情報を保存するようにします。 postgresqlをインストールします。hiveインストール環境からアクセスできるようにしておきます。

yum install postgresql-server postgresql-setup initdb systemctl start postgresql systemctl enable postgresql

ドライバをhiveのlibに移動します。

wget https://jdbc.postgresql.org/download/postgresql-9.3-1103.jdbc4.jar
mv postgresql-9.3-1103.jdbc4.jar /opt/hive-0.12.0/lib/

PostgreSQLにHiveで使うユーザとDBを作成します。

createuser -P hive createdb -O hive hive

メタ情報保存に使スキーマを実行します /opt/hive-0.12.0/scripts/metastore/upgrade/postgres/hive-schema-0.12.0.postgres.sql

hive-site.xmlを編集する

<property>
  <name>javax.jdo.option.ConnectionURL</name>
  <value>jdbc:postgresql://ポスグレインストール先:5432/hive</value>
  <description>JDBC connect string for a JDBC metastore</description>
</property>

<property>
  <name>javax.jdo.option.ConnectionDriverName</name>
  <value>org.postgresql.Driver</value>
  <description></description>
</property>

<property>
  <name>javax.jdo.option.ConnectionUserName</name>
  <value>hive</value>
  <description>username to use against metastore database</description>
</property>

<property>
  <name>javax.jdo.option.ConnectionPassword</name>
  <value>hive</value>
  <description>password to use against metastore database</description>
</property>

動作確認

# hive

hive> show tables;
OK
Time taken: 3.323 seconds

Hiveserver2を起動してbeelineで接続してみる

hive-site.xmlを変数する 今回は動作確認のため認証を行わなくても接続できるようにする。

<property>
  <name>hive.server2.authentication</name>
  <value>NOSASL</value> <!-- default NONE is for SASLTransport -->
</property>

<property>
  <name>hive.server2.enable.doAs</name>
  <value>false</value> <!-- Execute query as hiveserver2 process user -->
</property>

hiveserver2を起動する

$HIVE_HOME/bin/hiveserver2 &

beelineで接続してみる

# beeline !connect jdbc:hive2://localhost:10000/default;auth=noSasl hive org.apache.hive.jdbc.HiveDriver

※接続先のポートはhive-site.xmlのhive.server2.thrift.portを確認する

hiveqlを実行してみる

データ登録の確認のためまず以下のようなテキストファイルを作成しhdfsに上げておく

1
2
3
4
5

それからbeelineで接続し以下を実行する

create table sample (
  id INT
);

load data inpath 'ファイルパス' into table sample;

select *
from sample;

インサートしたレコードはhdfs上にあるのが以下のコマンドで確認できる

hdfs dfs -ls hive-site.xmlでhive.metastore.warehouse.dirに指定しているパス/DB名

またメタ情報がPostgreSQLに保存されていることも確認できる、例えばテーブル名の情報が保存される

hive=# \d "TBLS"
 TBL_ID             | bigint                 | not null
 CREATE_TIME        | bigint                 | not null
 DB_ID              | bigint                 |
 LAST_ACCESS_TIME   | bigint                 | not null
 OWNER              | character varying(767) | default NULL::character varying
 RETENTION          | bigint                 | not null
 SD_ID              | bigint                 |
 TBL_NAME           | character varying(128) | default NULL::character varying
 TBL_TYPE           | character varying(128) | default NULL::character varying
 VIEW_EXPANDED_TEXT | text                   |
 VIEW_ORIGINAL_TEXT | text                   |

 hive=# select * from "TBLS";
      1 |  1506262292 |     1 |                0 | root  |         0 |     1 | sample   | MANAGED_TABLE |
  |

Apache SparkからHiveを利用する

spark-shellでインタラクティブシェルから実行してみる

spark-shellコマンドを実行することでインタラクティブにsparkを実行することができます。

# spark-shell

spark-shell実行時に以下のようなエラーが出た場合は、

org.apache.hadoop.hive.metastore.api.MetaException: Hive Schema version 1.2.0 does not match metastore's schema version 0.12.0 Metastore is not upgraded or corrupt

hive-site.xmlのhive.metastore.schema.verificationにfalseを指定することでうまくいくようになるかもしれないです。

<property>
  <name>hive.metastore.schema.verification</name>
  <value>false</value>
   <description>
   </description>
</property>

spark-shellではscにSparkContextがセットされている

scala> sc
res0: org.apache.spark.SparkContext = org.apache.spark.SparkContext@519e67e
import org.apache.spark._
import org.apache.spark.sql.hive._
val hc = new HiveContext(sc)



val select="select * from sample"
val sqlResult = hc.sql(select)
sqlResult.foreach(row=>println(row))

次に必要なクラスのインポート後hiveのコンテキストを初期化してみます。

scala> import org.apache.spark._
import org.apache.spark._

scala> import org.apache.spark.sql.hive._
import org.apache.spark.sql.hive._

scala> val hc = new HiveContext(sc)
warning: there was one deprecation warning; re-run with -deprecation for details
hc: org.apache.spark.sql.hive.HiveContext = org.apache.spark.sql.hive.HiveContext@8167f57

試しにselectを実行してみます。

scala> val select="select * from sample"
select: String = select * from sample

scala> val sqlResult = hc.sql(select)
sqlResult: org.apache.spark.sql.DataFrame = [id: int]

scala> sqlResult.foreach(row=>println(row))
[Stage 0:>                                                          (0 + 2) / 2]
[1]
...

pysparkから実行してみる

次にpysparkからpythonスクリプトでhiveを利用してみたいと思います。

pyspark

pysparkでもspark-shellと同様にscにSparkContenxtがセットされています。

>>> sc
<pyspark.context.SparkContext object at 0x11029d0>

HiveContextをインポートしてコンテキストを初期化します。

>>> from pyspark.sql import HiveContext
>>> sqlContext = HiveContext(sc)

それからSQLを実行してみます。

>>> sqlContext.sql("select * from sample").show()
+---+
| id|
+---+
|  1|
|  2|
|  3|
|  4|
|  5|
+---+

pysparkからでもhiveに接続してデータを取ってこれることが確認できました。