生活を良くします - 怠惰なプログラミング

生活を良くします-怠惰なプログラミング

外資系でエンジニアをやっています。便利なサービスや商品、プログラミングで作ったものなどを紹介していきます

HiveとHadoopの環境構築 〜 virtualBoxのCentOS7を使用しデータ分析を分散処理する準備

Hive と Hadoop

f:id:what_a_day:20180807003934p:plain

Hadoop ファミリーの主要なメンバー

Hadoop

HadoopはMapReduceというGoogleの論文を基にしたビッグデータの分散処理を目的に作られたOSSです。 HDFSという分散ファイルシステムで処理能力をあげようとしています。 ビッグデータ用なのでスループットは大きいですが、リアルタイムに処理するのは苦手なため主にバッチ処理などで使われると思います。

最近よく話題になるSparkやNoSQLのHbaseなどもだいたいHadoopと協力して動いているのでHadoopエコシステムとか言われています。

Hive

SQLとほぼ同じようにかけます。SQLと同じように書くことでMapReduceの処理が行えます。 SQLと同じといってもTableのDropだったり、微妙な書き方の違いがあるので注意したほうがいいです。

環境構築が今までの中で一番大変だった

これは相当苦労してしまったので、自分のための備忘録として残しておきたいです。

CentOSをvirtualBoxで設定する方法は前回の記事で書きました。

なぜMacのローカル環境で構築しなかったかというと、失敗してカオスになったからです。

もはや失敗してもすぐに最初からやり直せる環境があったほうが便利ということに気づきVirtualBoxを使用しています。

www.what-a-day.net

Hadoop 3.1.0とHive3.1.0をダウンロード

wget のインストール

yum update
yum groupinstall 'Development tools'
yum install wget

これでwgetが使えるようになりました。

yum updateあたりでもかなりのエラーが出たのでエラー群のところに書いておきます。 だいたいがPermission Errorだったりでした。

Javaのインストール

Oracleからwgetでダウンロードできますが、自分の場合はできなかったので別の方法でやりました。

yum install java-1.8.0-openjdk

vi ~/.bashrcでbashrcファイルを開き編集

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-opemjdk-.../jre

編集後に

source .bashrc

これをすることでHadoopとHiveのダウンロードが可能になります。

Hadoopのインストール

wget http://ftp.riken.jp/net/apache/hadoop/common/hadoop-3.1.0/hadoop-3.1.0.tar.gz
tar -xzvf hadoop-3.1.0.tar.gz 
mv hadoop-3.1.0.tar.gz /usr/

vi ~/.bashrcでbashrcファイルを開き編集

export HADOOP_HOME=/usr/hadoop-3.1.0
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$JAVA_HOME/bin:$PATH

編集後に

source .bashrc

これでだいたいの設定は終了です。Hadoopはうまくいきやすいです。

derbyのインストール

Hiveのデータをセーブするデータベースがわりに使用します。

wget http://ftp.riken.jp/net/apache/db/derby/db-derby-10.14.2.0/db-derby-10.14.2.0-bin.tar.gz
tar -xzvf db-derby-10.14.2.0-bin.tar.gz
mv db-derby-10.14.2.0-bin.tar.gz /usr/

vi ~/.bashrcでbashrcファイルを開き編集

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

これでダウンロードと設定が終了です。

Hiveのインストール

wget http://ftp.riken.jp/net/apache/hive/hive-3.1.0/apache-hive-3.1.0-bin.tar.gz
tar -xzvf apache-hive-3.1.0-bin.tar.gz
apache-hive-3.1.0-bin /usr/hive-3.1.0
cd /usr/hive-3.1.0/conf
cp hive-default.xml.template hive-site.xml

vi usr/hive-3.1.0/conf/hive-site.xml ファイルを開き編集

 <property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:derby:;databaseName=/usr/hive-3.1.0/conf/metastore_db;create=true </value>
    <description>JDBC connect string for a JDBC metastore </description>
 </property>
  <property>
    <name>hive.querylog.location</name>
    <value>/usr/hive-3.1.0/iotmp</value>
    <description>Location of Hive run time structured log file</description>
  </property>
  <property>
    <name>hive.exec.local.scratchdir</name>
    <value>/usr/hive-3.1.0/iotmp</value>
    <description>Local scratch space for Hive jobs</description>
  </property>
  <property>
    <name>hive.downloaded.resources.dir</name>
    <value>/usr/hive-3.1.0/iotmp</value>
    <description>Temporary local directory for added resources in the remote file system.</description>
  </property>
  <property>
    <name>system:java.io.tmpdir</name>
    <value>/usr/hive-3.1.0/tmp</value>
  </property>
  <property>
    <name>system:user.name</name>
    <value>USERNAME</value>
  </property>
</configuration>

このコードを 追加する形で貼り付けます。色々な設定です。

最後にHiveをインストールして実行する前にこのコマンドを打ちます。 データベースを初期化するコマンドですが、先にHiveコマンドを打っていた場合、metastore_dbが不完全なまま自動的に作られてエラーになるので気をつけたほうがいいです。

その場合は一度create_dbを削除したのちにこのコマンドを実行します。

$HIVE_HOME/bin/schematool -dbType derby -initSchema
hive
> show tables;

このコマンドでエラーが出なければ大丈夫です。

ここのHiveでかなりのエラーが出たので治し方をまとめて下の方に書いておきます。

最終的なbashrcの様子

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.181-3.b13.el7_5.x86_64/jre

export HADOOP_HOME=/usr/hadoop-3.1.0

export PATH=/usr/hadoop-3.1.0/bin:/usr/hadoop-3.1.0/sbin:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.181-3.b13.el7_5.x86_64//bin:/usr/hadoop-3.1.0/bin:/usr/hadoop-3.1.0/sbin:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.181-3.b13.el7_5.x86_64//bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/{username}/.local/bin:/home/{username}/bin

export HIVE_HOME=/usr/hive-3.1.0
export PATH=$PATH:$HIVE_HOME/bin

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

ダウンロード時のエラー群

Caused by: java.net.ConnectException: Connection refused

おそらくderbyあたりの設定がうまくいっていないときにでるエラー。 create_dbの初期化ができていないか、パスがおかしいのでもうインストールし治したほうがいいかも。

create_dbを消して再度初期化し、パスを入れなおすと直りました。

FAILED: HiveException java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient

create_dbを消して再度初期化し、パスを入れなおすと直りました。

org.apache.hadoop.hive.metastore.HiveMetaException: Schema initialization FAILED! Metastore state would be inconsistent

create_dbを消して再度初期化し、パスを入れなおすと直りました。

java.lang.RuntimeException: com.ctc.wstx.exc.WstxParsingException: Illegal character entity: expansion character

cp hive-default.xml.template hive-site.xml

このデフォルトのテンプレートが文字化けしています。3200行目くらいにエンコードミスでおかしくなった箇所があるので削除します。これでうまくいきます。

Exception in thread "main" java.lang.IllegalArgumentException: java.net.URISyntaxException: Relative path in absolute URI: ${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D

完全にこれを参考にしました。

なぜうまくいくのかはこれから調べます、、

stackoverflow.com

まとめ

  • SandBoxとかあらかじめ準備されているものを使えばよかった