Skip to content
/ MRSort Public

基于 Java 与 ZeroMQ 的分布式排序系统,2022 年夏季“数学实践”课程的课程项目(大作业)

License

Notifications You must be signed in to change notification settings

shirok1/MRSort

Repository files navigation

MRSort: A distributed string merge-sorting system based on Java and ZeroMQ

简体中文 | English

本程序为 2022 年夏季“数学实践”课程的课程项目(大作业),实现了一个分布式字符串排序系统。假如你想抄作业,请先向科任老师确认可以使用的技术。

展示的讲稿在 presentation.md 中。

原始要求

  • 对总量为 320G(字节)的数据文件集进行排序,比拼排序速度。

  • 文件内为长度 15 的随机英文字母字符串,/n 换行(参见文件样例),按字符顺序对字符串排序,同样 /n 换行,输出到文件。按正确率和完成时间短长排名得分。

  • 每 2 班 6 组同机房比拼,每组分实验室 8 台电脑作为资源,需排序文件会预先放入其中硬盘 E 的 data 目录下(每台机器 40G(25 亿条记录),文件名:data01.txt - data08.txt)。电脑预装所需要的软件(JAVA8 和 PYTHON3.7,只允许选用这两个软件)。

  • 统一时间开始,各组可以操作各电脑,传入自身软件,开始排序任务。输出要求放在 D 盘根目录下新建组名目录中(如 1 班 1 组 1 号机目录为:c1g1m1),输出按字符串头字母分为 26 个文件,顺序放置在 8 台机器(文件名 resulta.txt - resultz.txt,1 - 2 号机顺序放前 8 个文件,3 - 8 号机顺序放后 18 个文件),完成后截屏(包括目录名,文件名,文件大小,生成时间)拼成一张大图片(只能是 1 张图片)发至 QQ 群中,群中消息作为项目完成时间。

  • 每组随机抽 2 人代表小组答辩,要对小组项目实施过程、方案及代码进行说明,并回答老师提问,由老师进行评分。

沟通后确认的要求

  • 可以自带 JRE
  • 可以调用外部库

讲稿未涉及的内容

  • 曾经考虑过使用 GraalVM 将本程序编译成本地代码(同时保证代码依然是合规的 Java 8 代码),最终因没能搞懂 Gradle 上对应的插件放弃了这个想法。
  • 机房电脑上装了 Oracle Java SE 8,测试时自带了 Azul Zulu 17 这个据说最快的 JRE 过去。(但还是通过 project.targetCompatibility 来保证代码兼容 Java 8)
    • 换新版本一开始是想试试 ZGC,但发现容易爆 OOM,最后还是用了 G1 GC。
    • Java 8 写的有点难受(比如 Optional<> 没有 or),不过没有到影响任务完成的程度。
  • 性能调试使用了 System Informer(当时名字还是 Process Hacker)和 VisualVM
  • 数据查看使用了 ImHex
  • 机房电脑 C 盘是 SSD,果断把缓存扔在那。
  • 实际测试当天
    • 机房的 IP 变了,导致一开始有相当一部分数据传丢了,后面修改命令行参数单独传输了这部分数据。
    • 出现了输出文件大小明显过小的问题,第一时间没怎么在意(因为在有上述问题浪费时间的情况下依然是第一个完成的组)直接溜出去给其他组员讲要怎么念 PPT。
    • 回到机房看数据的时候判断是合并过程的问题,写了一个按照文件名判断并重新合并文件的程序,最终输出文件大小比正常大小大一倍,大量出现相邻两行重复。
    • 判断是合并过程中有文件删除相关的问题,想写程序直接对输出文件进行去重,但纠结于是直接两行删一行还是判断去重,最后选择了前者,但是因为硬盘速度最终没有在最终时限前跑完。
    • 选择了过大的文件作为最终提交成绩的版本。

About

基于 Java 与 ZeroMQ 的分布式排序系统,2022 年夏季“数学实践”课程的课程项目(大作业)

Topics

Resources

License

Stars

Watchers

Forks

Languages