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

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

如果你没有阅读上篇,请移步使用Docker搭建Hadoop + Hive + Spark集群(上)

运行示例任务

运行 MapReduce WordCount

这部分基于 Big Data Europe’s Hadoop Docker 的项目里的运行示例。

首先我们运行一个辅助容器 hadoop-base

1
docker run -d --network hadoop --env-file hadoop.env --name hadoop-base bde2020/hadoop-base:2.0.0-hadoop3.2.1-java8 tail -f /dev/null

接下来运行以下命令以准备数据并启动 MapReduce 任务:

1
2
3
4
5
6
docker exec -it hadoop-base hdfs dfs -mkdir -p /input/
docker exec -it hadoop-base hdfs dfs -copyFromLocal -f /opt/hadoop-3.2.1/README.txt /input/
docker exec -it hadoop-base mkdir jars
docker cp jars/WordCount.jar hadoop-base:jars/WordCount.jar
docker exec -it hadoop-base /bin/bash
hadoop jar jars/WordCount.jar WordCount /input /output

接下来,你可以通过以下链接看到任务状态:

当任务运行完成,运行以下命令查看结果:

1
hdfs dfs -cat /output/*

最后你可以使用 exit 退出该容器。

运行 Hive 任务

请首先确定 hadoop-base 正在运行中。关于如何启动此辅助容器,请参看上一节。接下来准备数据:

1
2
3
4
5
6
7
docker exec -it hadoop-base hdfs dfs -mkdir -p /test/
docker exec -it hadoop-base mkdir test
docker cp data hadoop-base:test/data
docker exec -it hadoop-base /bin/bash
hdfs dfs -put test/data/* /test/
hdfs dfs -ls /test
exit

然后新建 Hive 表:

1
2
3
4
5
docker cp scripts/hive-beers.q hive-server:hive-beers.q
docker exec -it hive-server /bin/bash
cd /
hive -f hive-beers.q
exit

接下来你就可以使用 Beeline 访问到这些数据了:

1
2
3
beeline -u jdbc:hive2://localhost:10000/test -n hive -p hive

0: jdbc:hive2://localhost:10000/test> select count(*) from beers;

同样,你可以通过以下链接看到任务状态:

运行 Spark Shell

在进行这一步前,请先参看前面两个章节以准备 Hive 数据并创建表格。然后运行以下命令:

1
docker exec -it spark-master spark/bin/spark-shell

进入Spark Shell后,你可以直接通过先前创建的Hive表进行操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
scala> spark.sql("show databases").show
+---------+
|namespace|
+---------+
| default|
| test|
+---------+

scala> val df = spark.sql("select * from test.beers")
df: org.apache.spark.sql.DataFrame = [id: int, brewery_id: int ... 11 more fields]

scala> df.count
res0: Long = 7822

你可以在以下两个地址看到你的 Spark Shell 会话:

如果你在运行 spark-shell 的时候遇到了以下警告:

1
WARN TaskSchedulerImpl: Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient resources

该警告显示没有资源可以去运行你的任务,并提醒你去检查worker是否都已经被注册,而且拥有足够多的资源。此时你需要使用 docker logs -f spark-master 检查一下 spark-master 的日志。不出意外的话,你会看到下面的内容:

1
WARN Master: Got heartbeat from unregistered worker worker-20210622022950-xxx.xx.xx.xx-xxxxx. This worker was never registered, so ignoring the heartbeat.

这是在提示你有一个worker没有被注册,所以忽略了它的心跳。该worker没有被注册的原因很多,很可能是之前电脑被休眠过,导致worker掉线。这时你可以使用 docker-compose restart spark-worker 重启 spark-worker,重启完成后,该worker就会被自动注册。

同样,如果要运行 spark-sql,可以使用这个命令:docker exec -it spark-master spark/bin/spark-sql

运行 Spark Submit 任务

我们直接运行Spark内置的示例任务Spark Pi:

1
docker exec -it spark-master /spark/bin/spark-submit --class org.apache.spark.examples.SparkPi /spark/examples/jars/spark-examples_2.12-3.1.1.jar 100

你可以在以下两个地址看到你的 Spark Pi 任务:

本教程的集群搭建与使用方法就介绍到这里。以后可能会增加一些别的组件,会另外写文章来说明。