Help us understand the problem. What is going on with this article?

dockerでローカルSpark実行環境を構築

  • ソースはこちら => Github
  • ローカルの開発環境構築が目的

実行環境

  • Hadoop: version 2.7.7
  • Spark: version 2.4.4
  • Hive: version 2.0.1

Dockerfile

FROM openjdk:8-jdk
MAINTAINER yoshiyu0922

### Versions
ENV HADOOP_MAJOR_VERSION 2.7
ENV HADOOP_VERSION $HADOOP_MAJOR_VERSION.7
ENV HIVE_VERSION 2.0.1
ENV SPARK_VERSION 2.4.4

# apt upgrade & Install netstat
RUN apt update
RUN apt install net-tools -y
RUN apt install vim -y

## Install Hadoop
ENV HADOOP_HOME /opt/hadoop-$HADOOP_VERSION
ENV HADOOP_CONF_DIR $HADOOP_HOME/conf
ENV PATH $PATH:$HADOOP_HOME/bin
RUN curl -sL \
  "https://archive.apache.org/dist/hadoop/common/hadoop-$HADOOP_VERSION/hadoop-$HADOOP_VERSION.tar.gz" \
    | gunzip \
    | tar -x -C /opt/ \
  && rm -rf $HADOOP_HOME/share/doc \
  && chown -R root:root $HADOOP_HOME \
  && mkdir -p $HADOOP_HOME/logs \
  && mkdir -p $HADOOP_CONF_DIR \
  && chmod 777 $HADOOP_CONF_DIR \
  && chmod 777 $HADOOP_HOME/logs

# Install MySQL メタストア管理用DB
RUN apt install mysql-server -y
RUN service mysql start && \
    mysql -e'CREATE DATABASE metastore;' && \
    mysql -e'CREATE USER hive@localhost IDENTIFIED BY "hive";' && \
    mysql -e'GRANT ALL PRIVILEGES ON metastore.* TO hive@localhost;'

## install Hive
ENV HIVE_HOME /opt/apache-hive-${HIVE_VERSION}-bin
ENV HIVE_CONF_DIR $HIVE_HOME/conf
ENV PATH $PATH:$HIVE_HOME/bin
RUN curl -sL \
  "https://archive.apache.org/dist/hive/hive-$HIVE_VERSION/apache-hive-$HIVE_VERSION-bin.tar.gz" \
    | gunzip \
    | tar -x -C /opt/ \
  && chown -R root:root $HIVE_HOME \
  && mkdir -p $HIVE_HOME/hcatalog/var/log \
  && mkdir -p $HIVE_HOME/var/log \
  && mkdir -p /data/hive/ \
  && chmod 777 /data/hive/ \
  && mkdir -p /tmp/hive/ \
  && chmod -R 777 /tmp/hive/ \
  && mkdir -p $HIVE_CONF_DIR \
  && chmod 777 $HIVE_HOME/hcatalog/var/log \
  && chmod 777 $HIVE_HOME/var/log

RUN ln -s $HADOOP_HOME/share/hadoop/tools/lib/aws-java-sdk-1.7.4.jar $HIVE_HOME/lib/.
RUN ln -s $HADOOP_HOME/share/hadoop/tools/lib/hadoop-aws-2.7.3.jar $HIVE_HOME/lib/.

# install Spark
ENV SPARK_HOME=/opt/spark-$SPARK_VERSION-bin-hadoop2.7
ENV SPARK_CONF_DIR=$SPARK_HOME/conf
ENV PATH $PATH:$SPARK_HOME/bin
RUN curl -sL \
  "https://archive.apache.org/dist/spark/spark-$SPARK_VERSION/spark-$SPARK_VERSION-bin-hadoop$HADOOP_MAJOR_VERSION.tgz" \
    | gunzip \
    | tar -x -C /opt/ \
  && chown -R root:root $SPARK_HOME \
  && mkdir -p /data/spark/ \
  && mkdir -p $SPARK_HOME/logs \
  && mkdir -p $SPARK_CONF_DIR \
  && chmod 777 $SPARK_HOME/logs

# Install Readline Wrapper
RUN apt-get update && apt-get install -y rlwrap \
 && rm -rf /var/lib/apt/lists/*

RUN ln -s $HADOOP_HOME/share/hadoop/tools/lib/aws-java-sdk-1.7.4.jar $SPARK_HOME/jars/.
RUN ln -s $HADOOP_HOME/share/hadoop/tools/lib/hadoop-aws-2.7.3.jar $SPARK_HOME/jars/.

# Configure
ADD files/hive-site.xml $HIVE_CONF_DIR/
ADD files/hive-site.xml $SPARK_CONF_DIR/

# initialize schema in HIVE
ADD jars/*.jar $HIVE_HOME/lib/
RUN service mysql start && \
    schematool -dbType mysql -initSchema -verbose

ENV BASE_PATH=/sample/
RUN mkdir $BASE_PATH
RUN mkdir $BASE_PATH/shells
RUN mkdir $BASE_PATH/ddl
ADD files/*.sh $BASE_PATH/shells/
RUN chmod +x $BASE_PATH/shells/*.sh
ADD files/ddl/*.hql $BASE_PATH/ddl/

EXPOSE 10000

CMD ["/sample/shells/start.sh"]

つまづいたこと

Hiveが起動したがクエリが実行できなかった

  • なぜかメタストア管理用のDBをderbyからmysqlにしたら成功した。
  • おそらくhive-site.xmlの設定が原因なのかもと思っているので、derbyでも再度トライする

beelineでjdbcによるHiveへの接続ができなかった(ClassNotFoundExceptionが発生)

  • jdbcのjarを環境変数CLASSPATHに追加しても失敗した。
  • 環境変数として定義したHIVE_HOMEのconfフォルダにjarをおけばClassNotFoundExceptionが消えた

dockerコンテナ起動しようとしてもすぐに終了してしまう

  • 起動時に実行するshellが原因だった
  • 実行状態で終了させないといけないらしい
  • shellの最後に以下のコマンドで実行状態を保つように修正
/usr/bin/tail -f /dev/null

Hiveでデータを作成してもspark-shellで確認できなかった

  • SparkのThriftServerを起動する必要があった
  • Sparkのstart-thriftserver.shを実行するだけで起動できる

上記問題をクリアしてもうまくいかなかった

  • JDBCによる接続ができない
  • Spark-shellでも接続できない
  • 原因はSparkとHiveのバージョンの互換性だった
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした