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に接続してデータを取ってこれることが確認できました。