lab1测试脚本注解

实验要求

lab1的两个测试bash的解释

shell 复制代码
#!/bin/sh

#
# basic map-reduce test
#

RACE=

# uncomment this to run the tests with the Go race detector.
#RACE=-race

# -------------------------------------------------------
# 初始化测试环境
# -------------------------------------------------------

# 创建新的测试目录并清理旧数据
rm -rf mr-tmp
mkdir mr-tmp || exit 1
cd mr-tmp || exit 1
rm -f mr-*

# -------------------------------------------------------
# 编译 MapReduce 所需的插件和主程序
# -------------------------------------------------------

# 在 `mrapps` 目录中编译多个插件应用程序
(cd ../../mrapps && go build $RACE -buildmode=plugin wc.go) || exit 1
(cd ../../mrapps && go build $RACE -buildmode=plugin indexer.go) || exit 1
(cd ../../mrapps && go build $RACE -buildmode=plugin mtiming.go) || exit 1
(cd ../../mrapps && go build $RACE -buildmode=plugin rtiming.go) || exit 1
(cd ../../mrapps && go build $RACE -buildmode=plugin crash.go) || exit 1
(cd ../../mrapps && go build $RACE -buildmode=plugin nocrash.go) || exit 1

# 编译主 MapReduce 程序,包括 master 和 worker
(cd .. && go build $RACE mrmaster.go) || exit 1
(cd .. && go build $RACE mrworker.go) || exit 1
(cd .. && go build $RACE mrsequential.go) || exit 1

failed_any=0

# -------------------------------------------------------
# 单词计数测试模块(wc test)
# -------------------------------------------------------

# 生成正确的单词计数输出,作为对比基准
../mrsequential ../../mrapps/wc.so ../pg*txt || exit 1
sort mr-out-0 > mr-correct-wc.txt
rm -f mr-out*

echo '***' Starting wc test.

# 启动 master 和多个 worker 执行单词计数任务
timeout -k 2s 180s ../mrmaster ../pg*txt &

# 等待 master 准备好套接字
sleep 1

# 启动多个 worker 并行执行
timeout -k 2s 180s ../mrworker ../../mrapps/wc.so &
timeout -k 2s 180s ../mrworker ../../mrapps/wc.so &
timeout -k 2s 180s ../mrworker ../../mrapps/wc.so &

# 等待一个进程退出(所有 worker 都会在任务完成后退出)
wait

# 对比实际输出和预期输出
sort mr-out* | grep . > mr-wc-all
if cmp mr-wc-all mr-correct-wc.txt
then
  echo '---' wc test: PASS
else
  echo '---' wc output is not the same as mr-correct-wc.txt
  echo '---' wc test: FAIL
  failed_any=1
fi

# 等待剩余的进程退出
wait ; wait ; wait

# -------------------------------------------------------
# 索引创建测试模块(indexer test)
# -------------------------------------------------------

# 清除之前的输出文件,生成索引任务的正确输出
rm -f mr-*
../mrsequential ../../mrapps/indexer.so ../pg*txt || exit 1
sort mr-out-0 > mr-correct-indexer.txt
rm -f mr-out*

echo '***' Starting indexer test.

# 启动 master 和 worker 执行索引任务
timeout -k 2s 180s ../mrmaster ../pg*txt &
sleep 1

# 启动多个 worker 并行执行
timeout -k 2s 180s ../mrworker ../../mrapps/indexer.so &
timeout -k 2s 180s ../mrworker ../../mrapps/indexer.so

# 对比输出
sort mr-out* | grep . > mr-indexer-all
if cmp mr-indexer-all mr-correct-indexer.txt
then
  echo '---' indexer test: PASS
else
  echo '---' indexer output is not the same as mr-correct-indexer.txt
  echo '---' indexer test: FAIL
  failed_any=1
fi

wait ; wait

# -------------------------------------------------------
# Map 并行性测试模块(map parallelism test)
# -------------------------------------------------------

# 清理输出文件,启动 master 和 worker 以测试 Map 并行性
rm -f mr-out* mr-worker*

timeout -k 2s 180s ../mrmaster ../pg*txt &
sleep 1

# 启动两个 worker 执行 `mtiming.so` 插件,验证 Map 并行
timeout -k 2s 180s ../mrworker ../../mrapps/mtiming.so &
timeout -k 2s 180s ../mrworker ../../mrapps/mtiming.so

# 检查并行 Map 工作器的数量
NT=`cat mr-out* | grep '^times-' | wc -l | sed 's/ //g'`
if [ "$NT" != "2" ]
then
  echo '---' saw "$NT" workers rather than 2
  echo '---' map parallelism test: FAIL
  failed_any=1
fi

# 检查是否达到期望的并行度
if cat mr-out* | grep '^parallel.* 2' > /dev/null
then
  echo '---' map parallelism test: PASS
else
  echo '---' map workers did not run in parallel
  echo '---' map parallelism test: FAIL
  failed_any=1
fi

wait ; wait

# -------------------------------------------------------
# Reduce 并行性测试模块(reduce parallelism test)
# -------------------------------------------------------

# 清理输出文件,启动 master 和 worker 以测试 Reduce 并行性
rm -f mr-out* mr-worker*

timeout -k 2s 180s ../mrmaster ../pg*txt &
sleep 1

# 启动两个 worker 执行 `rtiming.so` 插件,验证 Reduce 并行
timeout -k 2s 180s ../mrworker ../../mrapps/rtiming.so &
timeout -k 2s 180s ../mrworker ../../mrapps/rtiming.so

# 检查并行 Reduce 工作器的数量
NT=`cat mr-out* | grep '^[a-z] 2' | wc -l | sed 's/ //g'`
if [ "$NT" -lt "2" ]
then
  echo '---' too few parallel reduces.
  echo '---' reduce parallelism test: FAIL
  failed_any=1
else
  echo '---' reduce parallelism test: PASS
fi

wait ; wait

# -------------------------------------------------------
# 崩溃恢复测试模块(crash test)
# -------------------------------------------------------

# 生成正确的输出,作为崩溃测试的对比基准
../mrsequential ../../mrapps/nocrash.so ../pg*txt || exit 1
sort mr-out-0 > mr-correct-crash.txt
rm -f mr-out*

echo '***' Starting crash test.

# 准备测试环境并启动 master 和多个 worker
rm -f mr-done
(timeout -k 2s 180s ../mrmaster ../pg*txt ; touch mr-done ) &
sleep 1

# 启动 worker,加载 `crash.so` 插件,模拟崩溃恢复
timeout -k 2s 180s ../mrworker ../../mrapps/crash.so &

# 模拟 `rpc.go` 中的 `masterSock()` 生成套接字
SOCKNAME=/var/tmp/824-mr-`id -u`

# 循环重新启动 worker 模拟崩溃恢复
( while [ -e $SOCKNAME -a ! -f mr-done ]
  do
    timeout -k 2s 180s ../mrworker ../../mrapps/crash.so
    sleep 1
  done ) &

# 继续循环启动其他 worker
( while [ -e $SOCKNAME -a ! -f mr-done ]
  do
    timeout -k 2s 180s ../mrworker ../../mrapps/crash.so
    sleep 1
  done ) &

# 等待所有 worker 退出
while [ -e $SOCKNAME -a ! -f mr-done ]
do
  timeout -k 2s 180s ../mrworker ../../mrapps/crash.so
  sleep 1
done

# 比较崩溃测试输出
wait
wait
wait

rm $SOCKNAME
sort mr-out* | grep . > mr-crash-all
if cmp mr-crash-all mr-correct-crash.txt
then
  echo '---' crash test: PASS
else
  echo '---' crash output is not the same as mr-correct-crash.txt
  echo '---' crash test: FAIL
  failed_any=1
fi

# -------------------------------------------------------
# 最终总结
# -------------------------------------------------------

if [ $failed_any -eq 0 ]; then
    echo '***' PASSED ALL TESTS
else
    echo '***' FAILED SOME TESTS
    exit 1
fi

是 否 崩溃恢复测试 启动Master 生成正确输出基准 启动crash Worker 循环重启Worker 比较崩溃恢复结果 Reduce并行性测试 启动两个rtiming Worker 启动Master 检查并行Reduce数量 Map并行性测试 启动两个mtiming Worker 启动Master 检查Worker数量 检查并行度 索引测试 启动Master 生成索引基准 启动Worker 验证索引结果 单词计数测试 启动Master 生成基准输出 启动多个Worker 比较输出结果 初始化环境 清理并创建测试目录 开始 编译MapReduce插件 编译主程序 所有测试通过? 测试成功 测试失败

以下是这个脚本的逐行备注:

bash 复制代码
#!/usr/bin/env bash
  • 指定使用 bash 解释器执行脚本。
bash 复制代码
if [ $# -ne 1 ]; then
    echo "Usage: $0 numTrials"
    exit 1
fi
  • 检查脚本的参数数量。
  • if [ $# -ne 1 ]; then:判断是否传入了一个参数,$# 表示参数个数。
  • 如果参数数量不等于 1,输出用法提示并退出,$0 表示脚本名。
bash 复制代码
trap 'kill -INT -$pid; exit 1' INT
  • 设置 trap 捕获 INT 信号(通常为 Ctrl+C)。
  • 捕获到信号时,发送 INT 信号给 test-mr.sh 进程并退出脚本。
bash 复制代码
# Note: because the socketID is based on the current userID,
# ./test-mr.sh cannot be run in parallel
  • 注释解释:因为 socketID 基于当前 userID,所以不能并行运行 ./test-mr.sh,否则会冲突。
bash 复制代码
runs=$1
chmod +x test-mr.sh
  • runs=$1:将命令行参数赋值给变量 runs,表示测试的执行次数。
  • chmod +x test-mr.sh:赋予 test-mr.sh 可执行权限。
bash 复制代码
for i in $(seq 1 $runs); do
    timeout -k 2s 900s ./test-mr.sh &
    pid=$!
    if ! wait $pid; then
        echo '***' FAILED TESTS IN TRIAL $i
        exit 1
    fi
done
  • 循环执行指定次数的测试。
  • for i in $(seq 1 $runs); do:循环从 1 到 $runsi 表示当前循环的次数。
  • timeout -k 2s 900s ./test-mr.sh &:启动 test-mr.sh 并在后台执行,限制其最长运行时间为 900 秒,超时后发送 SIGKILL 信号。
  • pid=$!:将最后一个后台进程的 PID 赋值给 pid
  • if ! wait $pid; then:等待 test-mr.sh 执行完毕,如果返回值非零表示测试失败。
  • echo '***' FAILED TESTS IN TRIAL $i:如果测试失败,输出失败信息,并退出脚本。
bash 复制代码
echo '***' PASSED ALL $i TESTING TRIALS
  • 如果循环结束且所有测试均通过,输出成功信息。
相关推荐
Yz98762 天前
Hadoop-MapReduce任务三种运行开发模式
大数据·hadoop·mapreduce·big data
JasonKQLin4 天前
gzip不同压缩等级的区别
big data
Data-Miner7 天前
54页可编辑PPT | 大型集团企业数据治理解决方案
大数据·big data
雪中鱼0110 天前
Elasticsearch如何搜索日志并存储
大数据·elasticsearch·搜索引擎·全文检索·big data
雷神乐乐10 天前
Kafka相关API开发
大数据·linux·分布式·kafka·big data
云表平台14 天前
不装了,摊牌了,微软始料未及,WPS用户:我们已经在使用了
big data
跳舞的皮埃尔16 天前
6、基于Python+爬虫+LDA+决策树的《富士山下》评论数据情感分析【开题+源程序+论文】
爬虫·python·决策树·big data
:mnong25 天前
跟着深度学习好书实践tensorflow神经网络
人工智能·python·深度学习·tensorflow·big data
微软技术栈1 个月前
Azure Data Box 80 TB 现已在中国区正式发布
microsoft·big data·azure