Tips15. 様々なDB環境を Docker で構築

最近は、システム構築においてOracleが圧倒的な存在感を放つことは無く、リレーショナルデータベースだけではなく、
分析系DBやNoSQLといった様々なタイプのデータベースが利用されるようになりました。

DBを扱うにはまず環境構築が必要です。
最近ではdockerにより容易に環境構築できるようになりました。
このページでは、各種DBの環境構築方法を記載します。

あらかじめ Docker Engine がインストール済みであることが前提となります。
Docker Engine のインストール方法は https://docs.docker.com/engine/ を参考にしてください。

mysql

mysqlの環境を構築します。
最初に、docker pull で、docker image をダウンロードします。

続いて、docker run コマンドを実行して、イメージを元にコンテナを作成します。
ローカルのカレントディレクトリ下の./mysqlを /home/mysql と紐づけてアクセスできるようにします。
ポート番号は外部から33006でアクセスできるようにしています。
count_test という名前のデータベースを作成するようにしています。

コンテナが作成できたら、docker exec コマンドでコンテナの中に入り、環境を操作できます。

docker pull ubuntu/mysql:latest

docker run -d --name mysql_container \
 -v ./mysql:/home/mysql -p 33006:3306 \
 -e TZ=UTC -e MYSQL_ROOT_PASSWORD=rootpassword -e MYSQL_DATABASE=count_test \
 ubuntu/mysql

docker ps
> CONTAINER ID   IMAGE          COMMAND                  CREATED      STATUS         PORTS               NAMES
> 6e36baXXXXXX   ubuntu/mysql   "docker-entrypoint.s…"   6 days ago   Up 2 minutes   33060/tcp, 0.0.0.0:33006->3306/tcp, :::33006->3306/tcp   mysql_container

docker exec -it mysql_container /bin/bash
root@6e36baXXXXXX:/#
mysql -u root -p --enable-local-infile
Enter password:
 :
mysql>

PostgreSQL

postgresの環境を構築します。

ローカルのカレントディレクトリ下の./postgresを /home/postgres と紐づけてアクセスできるようにします。
ポート番号は外部から30432でアクセスできるようにしています。
count_test という名前のデータベースを作成するようにしています。

docker pull ubuntu/postgres

docker run -d --name postgres_container --volume ./postgres:/home/postgres \
 -e TZ=JST -e POSTGRES_DB=count_test \
 -e POSTGRES_USER=ctest_usr \
 -e POSTGRES_PASSWORD=ctestpwd \
 -e POSTGRES_INITDB_ARGS="--encoding=UTF8 --lc-collate=C --lc-ctype=C" \
 -p 30432:5432 ubuntu/postgres

docker exec -it postgres_container /bin/bash
root@e1fde02164dd:/#
psql -p 5432 -U ctest_usr -d count_test
count_test=#

mariaDB

mariaDBの環境を構築します。
mysqlとほぼ同じです。

$ docker run -d --name maria_container \
 -v ./mysql:/home/maria \
 -e TZ=UTC -p 33007:3306 -e MARIADB_ROOT_PASSWORD=rootpassword -e MARIA_DATABASE=count_test mariadb
62664c42b4844d65d4088b0f6302c3d0d529f62299bfb5d68a1912a1812cf119

$ docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS         NAMES
62664c42b484   mariadb        "docker-entrypoint.s…"   11 seconds ago   Up 11 seconds   0.0.0.0:33007->3306/tcp, :::33007->3306/tcp              maria_container

$ docker exec -it maria_container /bin/bash
root@62664c42b484:/#
root@62664c42b484:/# mariadb -u root -p --enable-local-infile
Enter password:
 :
MariaDB [(none)]>

hive

hiveの場合は、Dockerfileを準備します。

Dockerfile

FROM apache/hive:3.1.3

USER root
ENV USER hive
ENV PASSWD hivepassword
ENV GRP hive
ENV HOME /home/${USER}
ENV SHELL /bin/bash
# 一般ユーザーにsudo権限を付与
RUN gpasswd -a ${USER} sudo
# 一般ユーザーのパスワード設定
RUN echo "${USER}:${PASSWD}" | chpasswd
# ディレクトリ所有者の変更
RUN chown ${USER} ${HOME}

# Install apt
RUN apt update && \
    apt install -y wget \
    software-properties-common \
    build-essential \
    vim \
    sudo && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

# install derby
RUN rm -rf /usr/local/derby/*
RUN wget http://ftp.riken.jp/net/apache/db/derby/db-derby-10.14.2.0/db-derby-10.14.2.0-bin.tar.gz
RUN mv db-derby-10.14.2.0-bin.tar.gz /tmp/
RUN tar -xzvf /tmp/db-derby-10.14.2.0-bin.tar.gz -C /tmp/
RUN mv /tmp/db-derby-10.14.2.0-bin /usr/local/derby
ENV DERBY_HOME /usr/local/derby
ENV PATH $PATH:$DERBY_HOME/bin
ENV CLASSPATH $CLASSPATH:$DERBY_HOME/lib/derby.jar:$DERBY_HOME/lib/derbytools.jar

# ユーザーの切替
USER ${USER}

# hadoop setup
ENV HADOOP_CONF_DIR $HADOOP_HOME/etc/hadoop
ENV PATH $PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

docker-compose.yaml

services:
  hive:
    image: apache/hive:3.1.3
    build:
      context: hive
      dockerfile: hive_dockerfile.txt
    container_name: hive_container
    command: bash
    tty: true               # 仮想端末を割り当てる
    stdin_open: true        # 標準入力を開いたままにする
    ports:
      - "10000:10000"
    environment:
      HADOOP_HOME: /opt/hadoop
      HIVE_HOME: /opt/hive
    volumes:
      - hive_data:/opt/hive/data
      - ./hive/:/home/hive/
volumes:
  hive_data:

上記ファイルを用意し、次のコマンドを実行してdockerイメージ・コンテナを作成します。

docker-compose up -d

次にコマンドでコンテナに入ります。

docker exec -it hive_container /bin/bash

このまま hive を実行するとデフォルトの実行エンジンが tez になっており、tezのインストールや設定は上記dockerファイルでは行っていないのでエラーになってしまいます。
そのため、デフォルトでインストールされている MapReduce を使用するよう、設定を変更します。

sudo vi conf/hive-site.xml

と設定ファイルを開きます。sudoしているのでパスワードを聞かれますが、Dockerfileで設定したパスワードを入力してください。
XMLファイルのエントリに「hive.execution.engine」という箇所がありますので、その値を tez→mrに修正してください。
また、パフォーマンス検証用に下記の値を末尾に追加設定してください。

<property>
  <name>mapreduce.map.memory.mb</name>
  <value>4096</value>
</property>
<property>
  <name>mapreduce.reduce.memory.mb</name>
  <value>8192</value>
</property>
<property>
  <name>yarn.app.mapreduce.am.resource.mb</name>
  <value>4096</value>
</property>

ファイルを保存してコンソールに戻ったらメタデータストアの再作成を行います。
下記のコマンドを実行してください。

 rm -rf /opt/hive/metastore_db
 schematool -dbType derby -initSchema
 schematool -dbType derby -upgradeSchema --verbose

これでhiveが使用可能な状態になっているはずです。

hive

と打ってログインできること、及び簡単なSQLが実行できることを確認してください。

select current_timestamp();

2024-10-01Oracle,環境構築hive,mariaDB,mysql,postgresql,パフォーマンス

Posted by tfurukaw