拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Docker镜像一键搭建Hadoop、Spark、Hive大数据环境全指南

简介面向计算机相关专业学生、大数据入门者及需要快速搭建大数据环境的开发者这份Docker化基础镜像组件包围绕Hadoop、Spark、Hive、Tez、Hue等常用组件提供一键式环境搭建方案解决集群部署繁琐、组件版本匹配难等问题。包内共22个文件以sh脚本10个和xml配置7个为主另有Dockerfile、properties、ini等类型sh脚本覆盖镜像构建、Hadoop初始化、Hive启动、Kafka启动和MySQL初始化等流程xml用于定义各组件核心参数Dockerfile负责生成基础镜像配套README说明使用方式。整体压缩包仅34KB体积小巧便于快速分发与二次修改。目前已有141人学习下载适合课程设计、毕业设计初期演示以及本地功能验证。读者可据此搭建包含HDFS、YARN、Hive数仓、Spark计算、Tez执行引擎、Hue可视化界面和Kafka消息队列的联合环境并可参考scripts目录编排逻辑自行扩展组件有效降低大数据环境搭建门槛。1. 大数据环境搭建不是玄学一套镜像把 Hadoop、Spark、Hive 装到位如果你曾经手动搭过一套大数据环境大概率经历过这种场面Hadoop 装到一半发现 JDK 版本不对Hive 连不上 MySQLSpark 提交任务时 YARN 又报内存不足最后折腾一星期集群还是起不来。这套 bitdata-hadoop 项目用 Docker 把 Hadoop、Spark、Hive、Tez、Hue、Kafka、HttpFS 整套环境固化成了基础镜像解压后按脚本构建、启动就能得到一个可用的多组件大数据环境。适合做课程设计、毕设演示、本地开发测试也适合想搞懂组件之间到底怎么协作的初学者。本文不吹不黑把镜像结构、启动流程、配置要点和踩过的坑一条条拆给你看。2. 镜像的构成与构建流程读懂 Dockerfile 和 build.sh 再动手2.1 解压后的目录分工与文件定位拿到压缩包后先解压得到一个 bitdata-hadoop-master 目录。第一件事不是急着跑脚本而是把目录结构过一遍搞清楚每个文件是干嘛的。我的建议是按「入口脚本、镜像定义、配置文件、初始化脚本」四个维度去归类。根目录下的 run-bdp.sh 和 build.sh 是入口前者负责启动整套环境后者负责构建镜像。Dockerfile 定义了基础镜像的内容包括操作系统、JDK、各组件安装路径、环境变量和默认暴露端口。conf 目录是核心配置的存放地里面按组件拆了子目录你在里面对应修改 core-site.xml、hdfs-site.xml、yarn-site.xml、hive-site.xml 这些文件就能覆盖默认配置。hue、tez、hadoop、spark、hive、httpfs、kafka 这些目录是各组件的安装包或源码目录不同项目可能略有差异。scripts 目录是所有 shell 脚本的聚集地hadoop_init.sh 负责 HDFS 的初始化和启动mysql_init.sh 负责 Hive 元数据库的初始化hive_start.sh 启动 Hive 的 metastore 和 hiveserver2start_kafka.sh 拉起 Kafkaentrypoint.sh 是容器启动后的总入口。wait_to_die.sh 这个脚本名字很有意思它的作用是让容器内的主进程保持存活容器不会因为前台进程退出而自杀。README.md 是作者的项目说明建议先读完再操作。2.2 Dockerfile 分层构建思路与基础镜像选型大数据镜像的构建和普通 Web 应用的镜像构建不太一样Web 应用通常只有一个进程而大数据镜像里要塞进一整套分布式组件还要处理它们之间的依赖关系。看这套项目的 Dockerfile最值得学习的是它的分层思路。基础镜像层负责操作系统和基础工具一般是 centos 或 ubuntu 作为底座安装 wget、curl、tar、vim 这类基础工具同时配好 JDK。组件安装层把 Hadoop、Spark、Hive、Tez、Hue、Kafka 的安装包复制到镜像内指定目录解压并配置环境变量。配置优化层把 conf 目录里的自定义配置覆盖到各组件的默认配置位置这一步很关键Docker 镜像默认是单机部署必须把各组件的默认端口、内存参数、本地目录调整成适合容器运行的形态。初始化脚本层把 scripts 目录复制进去并赋予执行权限set ENTRYPOINT 指向 entrypoint.sh这样容器一启动就会执行初始化流程。构建过程中有两点值得注意。一是各组件之间的版本兼容性Hive 和 Hadoop 的版本必须匹配Tez 又依赖 Hive 的版本Spark 如果跑在 YARN 上还要兼容 Hadoop 的 RPC 协议这些版本关系在 README.md 或者 conf 目录的配置注释里一般有说明。二是镜像体积这类镜像动辄几个 GB构建一次比较耗时build.sh 里一般会用 docker build 的缓存机制把变动最少的层放在前面变多的放在后面这样后续改配置时能复用前面层的缓存。2.3 构建命令与构建过程验证理清结构后就可以执行构建了。先确认 Docker 已安装且服务在运行然后进入项目目录执行构建脚本。cd bitdata-hadoop-master cat README.md # 先读说明确认组件的版本组合 bash build.sh # 执行镜像构建build.sh 内部做的事情常见套路是先检查基础镜像是否存在不存在就构建或拉取然后把当前目录作为构建上下文传入 docker build最后给镜像打上 tag比如 bitdata-hadoop:latest。构建过程中如果中途失败先看是哪个 RUN 步骤报错网易的镜像源问题、网络波动导致下载中断、JDK 包下载失败是常见的失败原因。构建完成后用 docker images 验证一下镜像是否存在。如果镜像是多个 tag记得区分是基础镜像还是完整镜像。这一层坑很多后面避坑章节会专门展开这里先不铺开。3. 容器启动与初始化顺序跑通 run-bdp.sh 背后的脚本调度3.1 run-bdp.sh 启动脚本的职责拆解镜像构建好之后真正跑环境用的是 run-bdp.sh。这个脚本是整个项目的总开关读懂了它你就读懂了整套环境的初始化顺序。run-bdp.sh 的大致流程是先检查本地是否存在指定 tag 的镜像不存在就提示先执行 build.sh。然后准备宿主机上的挂载目录比如把容器内的 /data、/opt 或日志目录映射到宿主机这样容器删除后数据还能保留。接着拼接 docker run 命令把需要外部访问的端口映射出来用 -p 参数把容器的 8020、9870、8088、9083、10000、8888 这些端口映射到宿主机的对应端口。最后通过 -e 参数传入一些环境变量比如内存限制、MySQL 连接地址等再以交互模式拉起容器。实际执行时用一条命令就能完成bash run-bdp.sh启动后观察终端的输出日志。如果能看到 NameNode、DataNode、ResourceManager 这些进程依次打印出启动信息说明容器内的初始化脚本按顺序执行成功了。如果卡在某一步长时间不动先按 CtrlC 停掉容器再用 docker logs 看执行到哪一步报错。3.2 entrypoint.sh 与组件启动顺序的依赖关系容器启动后会执行 entrypoint.sh这个脚本承担了「先启动谁、再启动谁」的调度任务。大数据组件之间有严格的依赖关系顺序搞反了后面启动的组件就会因为连不上依赖组件而以失败告终。梳理下来这套脚本的执行顺序大体是先启动基础服务包括 SSH 服务和 MySQL。Hadoop 的各组件之间通过 SSH 免密通信所以要先把 SSH 拉起来Hive 的元数据要存到 MySQL所以 MySQL 要先就绪。接着做 HDFS 的初始化与启动格式化 NameNode、创建临时目录、拉起 HDFS 守护进程。HDFS 起来后才能启动 YARN因为 Spark 和 Tez 任务都依赖 YARN 调度资源。再往后是 Hive 的 metastore 和 hiveserver2它们要连 MySQL 和 HDFS。最后是 Hue、Kafka、HttpFS 这类应用层服务。用命令看待这个顺序会更清楚service ssh start # 1. SSH 免密基础 service mysql start # 2. MySQL 元数据库 bash hadoop_init.sh # 3. HDFS 格式化与启动 $HADOOP_HOME/sbin/start-yarn.sh # 4. YARN 资源调度 bash hive_start.sh # 5. Hive 服务 bash start_kafka.sh # 6. Kafka 与依赖 $HUE_HOME/build/start_hue.sh # 7. Hue 前端界面 bash wait_to_die.sh # 8. 保持容器前台存活之所以把 wait_to_die.sh 放在最后是因为 Docker 容器的生命周期取决于 PID 1 进程是否退出。如果所有服务都用 nohup 在后台运行容器会因为 PID 1 进程退出而直接终止。wait_to_die.sh 的常见实现是循环检查所有关键进程是否存活只要有一个关键进程存活就继续 sleep这样容器就能保持运行状态。3.3 mysql_init.sh 与 hadoop_init.sh 的初始化细节两个初始化脚本是整个启动流程里的埋点所在专门拎出来说。mysql_init.sh 做的事情是初始化 Hive 的元数据库。Hive 的元数据包括表结构、分区信息、字段信息等存储在关系型数据库中。脚本里通常包含以下操作创建 hive 数据库、创建专用的 MySQL 用户并授权、设置 root 密码为项目预设值、用 schematool 初始化 Hive 的元数据表结构。如果 MySQL 是 8.0 以上版本还要注意认证插件的兼容性这事后面避坑章节会说。hadoop_init.sh 做的事情是格式化 HDFS 并完成初始目录创建。首次启动时脚本会执行 hdfs namenode -format 来初始化 NameNode 的元数据存储。这里有个关键的注意点格式化操作只应该在首次启动时执行如果因为误操作、脚本重复执行等原因重复格式化NameNode 和 DataNode 的 clusterID 就会不一致导致 DataNode 启动后无法正常注册。项目脚本里通常会通过判断元数据目录是否为空来避免重复格式化但你手工执行命令时要格外小心。格式化完成后脚本还会在 HDFS 上创建 /tmp、/user/hive/warehouse、/spark-history 等目录这些目录缺失会导致后续任务提交失败。4. Hue、Tez 与各组件的集成配置conf 目录与参数调整4.1 Hadoop 与 Spark 的配置项对应关系整套环境的运行效果最终取决于 conf 目录里的配置参数。Hadoop 的核心配置集中在三个文件里core-site.xml 管的是文件系统访问地址和缓冲区大小hdfs-site.xml 管的是 NameNode 和 DataNode 的存储路径、副本数、权限检查yarn-site.xml 管的是资源调度和节点资源上限。Spark 跑在 YARN 上时需要重点确认 YARN 的资源参数与 Spark 的执行内存匹配。现在开发机的内存普遍 16GB 起容器默认内存限制一般设置为 8GB 或 12GB如果 YARN 给每个容器分配的内存总和超过宿主机可用内存任务提交后就会一直处于 ACCEPTED 状态等待资源或者直接因内存不足被 kill。仓库里 yarn-site.xml 的默认参数参考这些值property nameyarn.nodemanager.resource.memory-mb/name value8192/value /property property nameyarn.scheduler.maximum-allocation-mb/name value4096/value /propertymemory-mb 参数是每台 NodeManager 可用于分配的总内存maximum-allocation-mb 是单个任务可申请的最大内存。如果你的机器内存不够优先把第一项调低不然 YARN 等资源等到你怀疑人生。4.2 Hive 元数据库连接与 Tez 执行引擎配置Hive 的配置核心在 hive-site.xml重点看两处一是元数据库的连接信息二是执行引擎的选择。元数据库连接配置主要是 JDBC 的 URL、用户名、密码项目里默认连的是本地 MySQLproperty namejavax.jdo.option.ConnectionURL/name valuejdbc:mysql://localhost:3306/hive?createDatabaseIfNotExisttrueamp;useSSLfalse/value /property property namejavax.jdo.option.ConnectionUserName/name valuehive/value /property如果 MySQL 的 root 密码修改过这里必须同步修改否则 Hive 初始化元数据时直接报连接拒绝。Hive 的执行引擎默认是 MapReduce但这套环境里加入了 Tez所以需要把 hive.execution.engine 指到 tezproperty namehive.execution.engine/name valuetez/value /propertyTez 的优势在于把 MapReduce 的多阶段任务拆成有向无环图避免中间结果落盘Hive 查询的速度会快不少。把 Tez 作为 Hive 的执行引擎需要把 Tez 的依赖包放到 Hive 的 lib 目录里同时在 conf 里配置 tez-site.xml 指定 Tez 的安装路径。这个项目已经把这些依赖整理好了你直接对着 eslint 配置文件检查路径即可。有一个参数和数据倾斜直接相关属于高频调整项hive.groupby.skewindata建议根据实际使用决定是否设为 true。4.3 Hue 界面集成与 HttpFS 的角色说明Hue 的作用是提供一个浏览器端的可视化界面让你在界面上操作 HDFS 和 Hive对新手来说比敲命令行友好多了。Hue 的配置在 conf 目录的 hue.ini 里核心是告诉 Hue 各个组件的访问地址。Hue 集成 HDFS 时推荐通过 HttpFS 作为代理来访问 HDFS。HttpFS 是 Hadoop 提供的一个 REST API 网关它解决了客户端文件系统访问的问题。如果你直接用 hdfs:// 协议客户端就要部署完整的 Hadoop 配置而通过 HttpFS只需配置一个 HTTP 地址就能访问 HDFS 上的文件了。Hue 集成 HiveServer2 的配置是重点修改 profile 里 hive 相关的配置段时要确认 hiveserver2 的地址和端口与实际启动的一致[hive] hive_server_hostlocalhost hive_server_port10000 auth_usernamehive auth_passwordhive这里有个容易踩的坑是Hue 默认用 10000 端口连接 HiveServer2但如果你只启动了 Hive 的 metastore9083端口而没有启动 HiveServer2Hue 打开查询编辑器时就会报无法连接。启动顺序里 hive_start.sh 一定要把 hiveserver2 一起拉起。4.4 Kafka 与 HttpFS 的容器内配置要点Kafka 在容器里运行时有几个特殊的配置要求。基础配置主要在 server.properties 里关键集中在 advertised.listeners。容器内 Kafka 的 broker 默认用 localhost 注册如果外部程序要在宿主机上连接容器内的 Kafka这个参数必须设为宿主机可达的地址listenersPLAINTEXT://0.0.0.0:9092 advertised.listenersPLAINTEXT://localhost:9092同样关键的是 zookeeper.connect 这个参数Kafka 的 broker 元数据存储在 Zookeeper 中如果你只启动了 Kafka 而忘了拉起 Zookeeperbroker 根本注册不进去。HttpFS 的启动相对独立它本质上是一个基于 Tomcat 的 Web 服务配置在 httpfs-site.xml 里主要指定 NameNode 的地址和 HttpFS 服务端口默认是 14000。启动后可以访问它的 REST 接口验证是否正常比如curl http://localhost:14000/webhdfs/v1/?opLISTSTATUSuser.nameroot需要注意的是HttpFS 的启动脚本需要执行 $HADOOP_HOME/bin/httpfs.sh start 来启动。如果返回 JSON 数据说明 HttpFS 工作正常。5. 避坑记录五个最常见的启动失败现场5.1 重复格式化导致 DataNode 注册失败现象执行 start-dfs.sh 后NameNode 能起来但 DataNode 反复尝试注册又失败日志里报 Incompatible clusterIDs 错误HDFS Web 页面看不到活跃的 DataNode。原因NameNode 格式化时生成一个随机的 clusterIDDataNode 第一次启动后会把这个 ID 存在本地。如果手工重复执行了 hdfs namenode -formatNameNode 的 clusterID 变了DataNode 本地存的还是旧 ID两边对不上就拒绝通信。解决把 DataNode 的存储目录清掉让它以新 ID 重新注册。操作前先确认没有重要数据然后停掉 HDFS 相关进程执行rm -rf /tmp/hadoop-root/dfs/data $HADOOP_HOME/bin/hdfs datanode -format $HADOOP_HOME/sbin/start-dfs.sh从那以后我只要看到 clusterID 相关的报错第一件事就是先检查是不是有人重复执行了格式化操作。5.2 容器内存不足导致 Spark 任务一直等待现象向 YARN 提交 Spark 任务后任务一直处于 ACCEPTED 状态几分钟都不动查看 ResourceManager 日志提示集群可用内存不足。原因yarn.nodemanager.resource.memory-mb 默认值设得很大比如 16GB但开发机的物理内存只有 8GBYARN 认为可用内存充足但操作系统实际分配不出这么多内存容器直接起不来。解决调低 yarn-site.xml 里的内存参数同时把 Spark 提交时的 executor 内存调小property nameyarn.nodemanager.resource.memory-mb/name value4096/value /propertyspark-submit \ --master yarn \ --executor-memory 1g \ --driver-memory 1g \ test.py这一步修完后任务基本秒级进入 RUNNING 状态。5.3 Hive 连接 MySQL 初始化失败现象执行 mysql_init.sh 时报错提示 Cant create database hive或者 schematool 初始化时连接超时。原因多数情况下是 MySQL 授权和认证插件的问题。MySQL 8.0 以上默认用 caching_sha2_password 认证而项目里配套的 JDBC 驱动版本较老不支持这种认证方式导致 Hive 连接不上元数据库。另外也可能是 hive 用户没有远程或本地连接权限。解决登录 MySQL把认证方式改成 mysql_native_password并确认授权完整ALTER USER hive% IDENTIFIED WITH mysql_native_password BY hive; GRANT ALL PRIVILEGES ON hive.* TO hive%; FLUSH PRIVILEGES;改完后再执行一次 schematool 初始化。如果你的 MySQL 版本确实比较新更一劳永逸的办法是直接把 MySQL 的默认认证插件改成 mysql_native_password。5.4 SSH 免密登录失效导致 Hadoop 起不来现象执行 start-dfs.sh 时脚本卡在输入密码的交互界面或者报 ssh: Permission deniedHDFS 的守护进程起不来。原因容器里的 SSH 公钥没有正确分发到各节点的 authorized_keys 里或者关键目录的读写权限不对。Docker 一层一层构建镜像时如果 RUN ssh-keygen 生成的密钥在后续层被覆盖SSH 就会失效。解决不用重新构建整个镜像直接进容器里手动修。生成密钥并写入 authorized_keys然后把权限改对ssh-keygen -t rsa -P -f /root/.ssh/id_rsa cat /root/.ssh/id_rsa.pub /root/.ssh/authorized_keys chmod 600 /root/.ssh/authorized_keys chmod 700 /root/.ssh改完后再重新启动脚本问题通常就解决了。5.5 Hue 打开后连不上 HiveServer2现象Hue 页面能登录但进入查询编辑器后一直转圈或者提示无法连接到 HiveServer2 10000 端口Yarn 日志中能看到连接拒绝的信息。原因Hue 配置里的 hive_server_host 写成了 localhost而 HiveServer2 和 Hue 如果在同一容器内问题往往出在只启动了 metastore 而没启动 hiveserver2或者端口映射把 10000 端口吞了。HiveServer2 和 metastore 是两个独立服务只启动前者查不到元数据只启动后者接不了 JDBC 连接。解决先确认 hiveserver2 进程是否存活netstat -ntpl | grep 10000没有输出就启动它。如果 Hive 是从 hue 的界面里打开检查 hue.ini 里 hive_server_host 配置的是不是容器的实际 IP 或容器名。改完之后在宿主机上执行beeline -u jdbc:hive2://localhost:10000 -n root能连上说明 HiveServer2 部分正常再看 Hue 的连接配置。6. 验证与进阶用 WordCount 和 Hive SQL 验收整套环境6.1 用 Spark 提交 WordCount 验证计算链路环境起来之后不能只看进程启动就算完事必须跑通一条完整的计算链路才算验收。先把数据放到 HDFSecho hadoop spark hive tez hue /tmp/test.txt hdfs dfs -mkdir -p /input hdfs dfs -put /tmp/test.txt /input/再写一个简单的 Spark WordCount 脚本用 spark-submit 提交到 YARNfrom pyspark import SparkContext sc SparkContext(yarn, WordCount) text sc.textFile(hdfs://localhost:8020/input/test.txt) counts text.flatMap(lambda line: line.split( )) \ .map(lambda word: (word, 1)) \ .reduceByKey(lambda a, b: a b) counts.saveAsTextFile(hdfs://localhost:8020/output/wc)spark-submit --master yarn --deploy-mode client wordcount.py任务跑完后去 HDFS 上查看输出目录能看到每个单词的计数结果说明 HDFS、YARN、Spark 三个环节全部打通了。这里注意如果 HDFS 的 NameNode 地址和端口与默认不同脚本里的路径需要同步修改。6.2 用 Hive SQL 验证元数据库与 HiveServer2Spark 链路通了之后再用 Hive 验证一遍 SQL 全链路。通过 beeline 连接 HiveServer2建表、加载数据、查询三步走CREATE TABLE IF NOT EXISTS test_table (line STRING); LOAD DATA INPATH /input/test.txt INTO TABLE test_table; SELECT COUNT(*) FROM test_table;能正常返回 1说明 Hive 元数据库、metastore、HDFS 存储、执行引擎四个环节都正常。如果 SELECT 走的是 Tez 引擎还要观察控制台是否会输出 Tez 的 DAG 信息有的话说明 Tez 集成没问题。顺手在刚才的 /tmp/test.txt 基础上试一下 group by 聚合和 join 操作把 Hive 的常见 SQL 都过一遍。6.3 进阶用法镜像导出分发与数据持久化如果你想把这套环境复制到别的机器不需要重新构建。用 docker save 把镜像导出成 tar 包拿到目标机器上再 load 进去docker save bitdata-hadoop:latest | gzip bitdata-hadoop.tar.gz # 拷贝到目标机器后 docker load bitdata-hadoop.tar.gz数据持久化是长期使用前必须做的调整。run-bdp.sh 默认会把 HDFS 数据目录、MySQL 数据目录、日志目录挂载到宿主机的指定位置这样容器删了重建数据还在。我自己的习惯是把这些路径挂到宿主机的一个独立磁盘分区上避免操作系统盘被日志撑爆。整套环境跑通之后你会发现大数据环境搭起来最耗时间的并不是组件本身而是组件之间的版本匹配、端口协调和依赖顺序。这个项目把这一堆琐碎的事都封装进了镜像和脚本里留给你的只剩怎么把任务跑起来。如果后续想把这套方案用到生产中建议把 run-bdp.sh 里的 docker run 命令改造成 docker-compose 的编排文件配合 volume 和 network 配置环境管理的可维护性会再上一个台阶。希望帮到你。本文还有配套的精品资源点击获取
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门