使用 Docker 搭建 Hadoop + Hive + Spark 集群

2023-05-16

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

准备工作

本项目基于 Docker 和 Docker 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://gitee.com/horysk/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.sh 与 stop_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 列表

  • Namenode: http://localhost:9870/dfshealth.html#tab-overview
  • Datanode: http://localhost:9864/
  • ResourceManager: http://localhost:8088/cluster
  • NodeManager: http://localhost:8042/node
  • HistoryServer: http://localhost:8188/applicationhistory
  • HiveServer2: http://localhost:10002/
  • Spark Master: http://localhost:8080/
  • Spark Worker: http://localhost:8081/
  • Spark Job WebUI: http://localhost:4040/ (当 Spark 任务在 spark-master 运行时才可访问)
  • Presto WebUI: http://localhost:8090/
  • Spark History Server:http://localhost:18080/

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.conf 与 scripts/spark-hive-site.xml 两个文件,它们已经在启动脚本里自动上传。

运行示例任务

运行 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
  

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

  • http://localhost:8088/cluster/apps
  • http://localhost:8188/applicationhistory (运行结束后)

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


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;
  

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

  • http://localhost:8088/cluster/apps
  • http://localhost:8188/applicationhistory (运行结束后)

运行 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 会话:

  • http://localhost:8080/
  • http://localhost:4040/jobs/ (运行时)

如果你在运行 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 任务:

  • http://localhost:8080/
  • http://localhost:4040/jobs/ (运行时)

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

使用Docker搭建Hadoop + Hive + Spark集群(下) | Bambrow's Blog

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Docker 搭建 Hadoop + Hive + Spark 集群 的相关文章

随机推荐

  • “异常处理”学习小结

    在我经历过的项目中 xff0c 很少使用异常处理 xff1b 对于问题的调试与追踪 xff0c 基本上都是基于错误码和日志信息 这里的学习总结来自于 lt lt C 43 43 编程思想 第2卷 gt gt 和网络 xff0c 有很多问题的
  • 重载new和delete检测内存泄漏

    内存泄漏就是new出来的内存没有通过delete合理的释放 重载new和delete检测内存泄漏原理是 xff1a 在重载的new中记录内存分配情况 xff0c 在重载的delete中删除内存分配记录 xff0c 从而跟踪所有内存分配信息
  • 《Effective C++》读后感

    几天前 xff0c 我曾在微信朋友圈中发了一条消息 xff1a 和大牛之间的差距就是这一个书架 图片来自于微信公众号 二爷鉴书 的分享 我时常纠结于自己的技术为什么进步的这么慢 xff0c 大概就是书读的太少 思考的太少 Effective
  • 《模仿游戏》观后感

    xfeff xfeff 几天前 xff0c 一个朋友让我给他推荐一部电影 xff0c 我思来想去 xff0c 推荐了 模仿游戏 这部电影讲述的是 计算机科学之父 艾伦 图灵在二战期间与其团队一起发明机器 英格玛 破译德国密码系统的故事 关于
  • 对项目的理解

    xfeff xfeff 又有好久没有更新博客了 xff0c 虽然我一直告诫自己 xff0c 不管有多忙都要找点时间来写博客 最近主要的精力都投入到项目中 xff0c 我就说说自己的一些想法吧 1 项目的前期是最忙的 xff0c 投入最大 当
  • 对项目的理解(2)

    xfeff xfeff 项目是做不完的 xff0c 把近期的一些想法写出来 xff1a 1 项目初期做好每一个功能的方案 项目初期 xff0c 有一个辅助功能被我忽略了 xff0c 以为 很容易实现 xff0c 就没有花时间去研究 xff0
  • 5 AI道德风险之偏见风险测试

    AI系统的偏见也包含不公平的一些倾向性反馈 主要是指AI系统提供了一些不准确的反馈 这些反馈有明显的偏见和不公平的特征 这种偏见大部分是因为训练用的数据集存在偏见性而导致的 那么除此之外还有可能受测试和评估因素 人类因素等多种原因影响 因此
  • 解决新版vscode在git merge代码的时候,解决代码冲突的选项按钮不见的问题

    由于vscode新版本中 xff0c 在git merge代码的时候 xff0c 解决代码冲突的选项按钮不见了 xff0c 目前了解1 70 0 1 80 0版本都有这个问题 xff0c 如图 xff1a 解决方法 点击设置搜索 merge
  • 人工智能的过去

    人工智能的起源 xff1a 人工智能在五六十年代时正式提出 xff0c 1950年 xff0c 一位名叫马文 明斯基 后被人称为 人工智能之父 的大四学生与他的同学邓恩 埃德蒙一起 xff0c 建造了世界上第一台神经网络计算机 这也被看做是
  • NVIDIA Jetson Xavier NX入门(1)——烧写系统镜像

    1 Jetson Xavier NX简介 Jetson Xavier NX是一款形状 外接口类似于树莓派的嵌入式主板 xff0c 搭载了6核NVIDIA CarmelARM v8 264位CPU xff0c GPU则是有384g个NVIDI
  • NVIDIA Jetson Xavier NX入门(2)——开机设置和远程登录

    1 开机设置 如果系统镜像烧录成功的话 xff0c 插入SD卡后 xff0c NVIDIA Jetson Xavier NX就可以直接运行了 系统是定制的Ubuntu18 04 xff0c 开机后同意协议 xff0c 一直点击continu
  • 我是如何记笔记的--谈谈自己的学习方法

    本文由 庆哥小白 授权投稿 作者公众号 xff1a 一个自学的程序员 关于记笔记的重要性 xff0c 暂且不谈 xff0c 这次主要说说我在学习的过程中是如何记笔记的 xff01 本文共有 2908 字 如果觉得页面很长 那是因为我很用心
  • docker中apt-get失败

    docker中无法联网导致apt get失败 ERROR1解决方法 ERROR2解决方法 ERROR3解决方法 ERROR1 使用apt get update更新失败 报错 xff1a Err 19 http archive ubuntu
  • pycharm 报错 ModuleNotFoundError: No module named '_cffi_backend'

    Here 39 s the output of pip freeze for reference root 64 machine pip freeze argparse 61 61 1 2 1 autobahn 61 61 0 8 10 c
  • 虚拟Ubuntu 18.04中创建virtualbox 报错:this kernel requires an x86-64 CPU, but only detects an i686 CPU, un

    In addition for running 64 bit guests it is recommended to enable the Input Output APIC in the System gt Motherboard set
  • ubuntu--20.04 安装中文输入法(google拼音)

    安装指令 xff1a sudo apt get install language pack zh hans sudo apt get install fcitx googlepinyin 配置 xff1a 1 搜索框输入 xff1a Lan
  • 装完Ubuntu20.04 之后发现没有声音输出,解决方法

    装完Ubuntu之后发现没有声音输出 xff0c 解决方法 在设置里面的sound选项里面没有多余的声音输出选项 xff0c 多次重启也无法解决 方法 xff1a 1 安装pavucontrol sudo apt install pavuc
  • 6 AI系统的伦理道德风险之道德判断的验证

    AI系统的道德判断是指人工智能系统在面对不同的道德问题或冲突时 如何做出符合道德准则和价值观的决策 道德判断主要是约束AI系统不能提供危害生命 安全等方面的反馈 AI系统要有道德判断和决策处理的能力 之前有一款基于GPT 2的聊天机器人被指
  • 火狐浏览器导入burpsuite证书 本地电脑上安装burpsuite证书

    0 没导入burp证书之前 xff0c 使用火狐浏览器搜索 学习 xff0c 弹出警告 1 burp导出证书 进入burpsuite xff0c 找到 代理 选项 xff0c 选择 导入 导出CA证书 选择出口der格式的证书 选择你要存放
  • 使用 Docker 搭建 Hadoop + Hive + Spark 集群

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