2022春哈尔滨工业大学软件架构与中间件课程实验二共有一下三部分:
- Nginx集群负载均衡实验(必选)
- Hadoop分布式计算实验(必选)
- ActiveMQ异步消息推送实验(可选)
此分支为第二部分的代码。
搭建1个master、2个worker节点的Hadoop集群环境,而后应用此环境实现:
-
对《飞鸟集》正文中每个单词的计数;
-
模拟生成“进销存”系统的用户访问日志(1万个用户共100万次操作记录),并利用集群计算每个用户的访问次数。
对hadoop-cluster-docker进行改进,实现基于Docker单机快速搭建Hadoop3.2.3集群(修改详见使用的开源项目一节),帮助完成实验。
filetree
│ generate_log.py 模拟生成进销存系统日志的脚本
│ LICENSE 授权协议
│ README.md 本文件
│
├─hadoop_docker Hadoop单节点的镜像
│ │ buid-image.sh 构建镜像的脚本
│ │ Dockerfile 构建指令
│ │
│ └─config
│ workers 声明各worker
│ start-hadoop.sh 启动Hadoop
│ wc-hadoop.sh 启动Hadoop示例程序WordCount
│ ...
│
├─input_bak 实验中用到的输入文件
│ psi.log 生成的进销存系统访问日志
│ stray-birds.txt 飞鸟集正文
│
├─result 运行结果
│ stray-birds-wc.txt 飞鸟集统计结果
│ user-access-wc.txt 用户访问统计结果
│
└─run_cluster 启动Hadoop集群相关文件
│ start-cluster.sh 启动集群脚本
│
├─input 输入文件夹,将被映射至容器中
└─output 输出文件夹,将被映射至容器中
如图所示的1个master和2个worker,共同工作在sam-hadoop
网络下。
如果你的运行平台为linux/amd64
且暂不做任何修改,可以直接使用构建好的镜像后跳过构建镜像和配置集群一节:
docker pull zhaosuizhi/sam-hadoop:0.1
接下来介绍如何手动构建,以及如果运行平台不同时需要做哪些修改。
cd hadoop_docker
文件相对路径 | 修改内容 |
---|---|
./Dockerfile | ENV JAVA_HOME=/usr/lib/jvm/java-8-openjdk-armhf |
./config/hadoop-env.sh | export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-armhf |
平台兼容问题是apt
在安装JDK时不同架构的安装路径不同导致的,其余均无区别。我在本地测试结果的是以上值,如果有误则自己测试一下找到正确路径填上去即可。
- 在
config/workers
文件中按照类似格式增减节点; - 在启动集群时追加节点个数作为参数(例如5个worker节点:
./start-cluster.sh 5
)。
./build-image.sh
构建完成后可以执行docker image ls
看到构建好的镜像zhaosuizhi/sam-hadoop:0.1
。
创建集群网络:
docker network create --driver=bridge sam-hadoop
进入run_cluster
文件夹,运行start-cluster.sh
启动集群:
cd run_cluster
./start-cluster.sh
应得到类似如下的输出:
start sam-hadoop-master container...
start sam-hadoop-worker1 container...
start sam-hadoop-worker2 container...
运行完毕后返回master节点的bash,成功启动各容器节点。
最后在master容器中启动Hadoop集群:
./start-hadoop.sh
在启动容器时,start-cluster.sh
脚本会将run_cluster
文件夹下的input
和output
文件夹挂载到容器中。执行WordCount时将会从input
下载入,结果输出到output
中。
以飞鸟集为例,将input_bak/stray-birds.txt
放入run_cluster/input
中,然后在master容器中启动WordCount:
./wc-hadoop.sh
结果将输出至上文的output
文件夹中,名为wc-result.txt
。
修改内容:
- 将Hadoop版本从2.7.2升级至3.2.3。由于大版本升级,部分配置文件需要更改;
- WordCount结果输出位置从
stdout
更改为output/wc-result.txt
; - 修改部分sh脚本名称以方便实验。