多主机搭建基于 Docker 运行的 Hadoop Cluster 总结

本文详细记录了在多主机环境下利用Docker部署Hadoop集群时遇到的问题与解决方案,包括SSH登录配置、Docker网络管理、YARN地址设置、Hive数据库连接方式、DFS路径配置等关键步骤。通过实际案例,提供了从搭建到调试的全面指南。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

近期尝试在多主机上搭建基于 Docker 运行的 Hadoop 集群,踩了不少坑,总结一下:

  • Hadoop 节点之间需要 ssh 无障碍登录,包括登录自己: $ ssh localhost
  • 为了避免和主机 ssh 端口冲突,建议修改 Docker 容器内运行的 sshd 所使用的端口,比如 8002
  • Docker 容器网络默认是桥接,其 IP 是动态变化的,跨主机运行的 Docker 容器之间无法通过 IP 访问,可以通过设置 `--net=host` 的方式,直接使用主机的 IP 和 hostname。SO 上有人建议通过 SkyDock、SkyDNS、dsnmasq 或者 Swarn 的方式解决,似乎有的并未支持跨主机的场景。
  • slave 主机上运行的 Hadoop 需要设置固定的 yarn.nodemanager.address 端口,并在 `docker run` 的时候通过 `-p` 参数暴露出来,否则做分布式运算时主从之间会有通信问题。
  • Hive 需要数据库作为 metastore,可以采用 Docker linking container 的方式连接,也可以直接指定外部的数据库服务。创建 Dockerfile 时需要安装将要链接的数据库所使用的驱动。
  • dfs.defaultFS 需要设置为主机名或者固定 IP,不能使用 0.0.0.0,因为 Hive 在创建表信息的时候会将此信息写入 metastore,并在计算时传给其它节点进行处理,会造成其他节点因尝试访问 `hdfs://0.0.0.0` 失败而导致计算任务失败。
  • 通过该命令查看 yarn 节点信息: $ yarn node -list,如果显示的节点列表都是 localhost,则说明 Hadoop 节点配置有点问题,需要检查主机名以及所监听的 IP 地址。
  • 如果节点任务失败,可以到目录 $HADOOP_PREFIX/logs/userlogs/application_$APP_ID 下找相应的日志。

测试的两台主机配置为 8G 内存、4 核 8 线程 1600 MHz CPU,数据量在 10M+,运行单纯统计条数的 HiveSQL,消耗时间为 44s,在单机下运行则消耗 1m42s。

### 使用 Docker 在 Ubuntu 上搭建 Hadoop 集群 #### 安装 Docker 为了在 Ubuntu 服务器上构建 Hadoop 集群,首先需要确保已经安装了 Docker[^1]。 #### 创建并启动容器 接下来,在三个不同的终端会话中执行如下命令来创建和启动容器: ```bash # 主节点 (NameNode 和 ResourceManager) docker run -it -h h01 --name h01 -p 9870:9870 -p 8088:8088 hadoop /bin/bash # 数据节点之一 (DataNode 和 NodeManager) docker run -it -h h02 --name h02 hadoop /bin/bash # 另一个数据节点 (DataNode 和 NodeManager) docker run -it -h h03 --name h03 hadoop /bin/bash ``` 上述命令中的 `-h` 参数用于设置容器内部主机名;而 `-p` 则映射端口以便外部访问 NameNode 的 Web UI 或 YARN 资源管理器界面[^3]。 #### 构建自定义镜像 当完成了所有必要的配置之后——比如修改 `core-site.xml`, `hdfs-site.xml` 文件以及初始化文件系统等操作后,可以通过下面这条指令把当前状态保存成一个新的 Docker 镜像: ```bash docker commit -m "Customized Hadoop Cluster Setup" container_id new_image_name ``` 这里替换掉 `container_id` 和 `new_image_name` 成实际使用的 ID 和想要给新镜像起的名字。这一步骤有助于简化未来部署相同环境的过程[^2]。 #### 连接 DataNodes 对于每一个额外的数据节点(如 datanode2),可以在新的命令行窗口里重复类似的流程以连接到集群: ```bash docker run -i -t --name Slave2 -h Slave2 image_name_or_tag /bin/bash ``` 其中 `image_name_or_tag` 是指之前提到过的定制化后的镜像名称或者标签[^4]。 通过以上步骤就可以成功地利用 Docker 技术实现在 Ubuntu 平台上快速建立一个多节点组成的分布式计算框架—Hadoop 集群的目的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值