使用Docker搭建Hadoop + Hive + Spark集群(上)

本文探讨了使用Docker搭建Hadoop + Hive + Spark集群的方法,项目地址在此。在阅读本文前,建议先对Docker以及Docker Compose有基本的了解。

准备工作

本项目基于DockerDocker Compose,搭建的集群包含以下部分:

  • Hadoop
  • Hive
  • Spark

本项目参考了Big Data Europe的一些工作。项目中所使用的Docker镜像可能会被更新,可以参看他们的Docker Hub以获取最新镜像。

本项目所依赖的版本号如下:

1
2
3
4
5
6
Client:
Version: 20.10.2
Server: Docker Engine - Community
Engine:
Version: 20.10.6
docker-compose version 1.29.1, build c34c88b2

快速开始

直接克隆我的项目并运行集群:

1
2
3
git clone https://github.com/bambrow/docker-hadoop-workbench.git
cd docker-hadoop-workbench
./start_demo.sh

也可以使用docker-compose-v2.yml,该集群包含我简单修改的spark-master镜像,以及额外添加的spark-history-server镜像。

1
./start_demo_v2.sh

使用 ./stop_demo.sh./stop_demo_v2.sh 关闭集群。你可以修改 start_demo.shstop_demo.sh 文件里的 DOCKER_COMPOSE_FILE 变量以使用其他版本的 YAML 文件。

集群内容

本集群包含以下Container:

  • namenode
  • datanode
  • resourcemanager
  • nodemanager
  • historyserver
  • hive-server
  • hive-metastore
  • hive-metastore-postgresql
  • presto-coordinator
  • spark-master
  • spark-worker
  • spark-history-server (使用v2版本)

同时本集群需要用到名为hadoop的network,以及以下volume:

  • hadoop_namenode
  • hadoop_datanode
  • hadoop_historyserver
  • hive_metastore

这些都需要特别注意以避免冲突。

可交互的端口列表

综述

  • namenode: 9000, 9870
  • datanode: 9864
  • resourcemanager: 8088
  • nodemanager: 8042
  • historyserver: 8188
  • hive-server: 10000, 10002
  • hive-metastore: 9083
  • presto-coordinator: 8090
  • spark-master: 4040, 7077, 8080, 18080 (v2版本18080接口由spark-history-server提供)
  • spark-worker: 8081

如有冲突,可以在docker-compose.yml里更改暴露的端口。

UI列表

HDFS

可以使用 hdfs dfs 连接到 hdfs://localhost:9000/ (请先在本机安装Hadoop):

1
hdfs dfs -ls hdfs://localhost:9000/

Hive

可以使用 Beeline 连接到 HiveServer2 (请先在本机安装Hive):

1
beeline -u jdbc:hive2://localhost:10000/default -n hive -p hive

Spark

可以使用 spark-shell 通过 thrift 协议连接到 Hive Metastore (请先在本机安装Spark):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
$ spark-shell

Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/___/ .__/\_,_/_/ /_/\_\ version 3.1.2
/_/

Using Scala version 2.12.10 (OpenJDK 64-Bit Server VM, Java 11.0.11)

scala> :paste
// Entering paste mode (ctrl-D to finish)

import org.apache.spark.sql.SparkSession

val spark = SparkSession.builder.master("local")
.config("hive.metastore.uris", "thrift://localhost:9083")
.enableHiveSupport.appName("thrift-test").getOrCreate

spark.sql("show databases").show


// Exiting paste mode, now interpreting.

+---------+
|namespace|
+---------+
| default|
+---------+

import org.apache.spark.sql.SparkSession
spark: org.apache.spark.sql.SparkSession = org.apache.spark.sql.SparkSession@1223467f

Presto

可以使用 Presto CLI 连接 Presto 并且读取 Hive 的数据:

1
2
3
4
wget https://repo1.maven.org/maven2/com/facebook/presto/presto-cli/0.255/presto-cli-0.255-executable.jar
mv presto-cli-0.255-executable.jar presto
chmod +x presto
./presto --server localhost:8090 --catalog hive --schema default

设置列表

以下列举了容器内部的一些设置所在的位置。后面的以CONF结尾的是它们在hadoop.env中的代号。你可以参考hadoop.env文件做额外的设置。

  • namenode:
    • /etc/hadoop/core-site.xml CORE_CONF
    • /etc/hadoop/hdfs-site.xml HDFS_CONF
    • /etc/hadoop/yarn-site.xml YARN_CONF
    • /etc/hadoop/httpfs-site.xml HTTPFS_CONF
    • /etc/hadoop/kms-site.xml KMS_CONF
    • /etc/hadoop/mapred-site.xml MAPRED_CONF
  • hive-server:
    • /opt/hive/hive-site.xml HIVE_CONF

很可惜Spark的设置不在这个列表里。在spark-master/spark/conf文件夹下可以存放Spark的设置,我准备了scripts/spark-defaults.confscripts/spark-hive-site.xml两个文件,它们已经在启动脚本里自动上传。

在下一篇,我们会讲到如何使用此集群运行MapReduce、Hive和Spark任务。