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脚本名称以方便实验。
