docker 下的 spark 集群,调整参数榨干硬件
欢迎访问我的 GitHub
这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos
本篇概览
本文是《docker下,极速搭建spark集群(含hdfs集群)》的续篇,前文将 spark 集群搭建成功并进行了简单的验证,但是存在以下几个小问题:
spark 只有一个 work 节点,只适合处理小数据量的任务,遇到大量数据的任务要消耗更多时间;
hdfs 的文件目录和 docker 安装目录在一起,如果要保存大量文件,很可能由于磁盘空间不足导致上传失败;
master 的 4040 和 work 的 8080 端口都没有开放,看不到 job、stage、executor 的运行情况;
今天就来调整系统参数,解决上述问题;
最初的 docker-compose.yml 内容
优化前的 docker-compose.yml 内容如下所示:
接下来开始优化;
实战环境信息
本次实战所用的电脑是联想笔记本:
CPU:i5-6300HQ(四核四线程)
内存:16G
硬盘:256G 的 NVMe 再加 500G 机械硬盘
系统:Deepin15
docker:18.09.1
docker-compose:1.17.1
spark:2.3.0
hdfs:2.7.1
调整 work 节点数量
由于内存有 16G,于是打算将 work 节点数从 1 个调整到 6 个,调整后 work 容器的配置如下:
如上所示,注意 volumes 参数,都映射在了 docker-compose.yml 同一层级的 conf 和 data 两个目录下,这里只贴出了 worker1 和 worker2 的内容,worker3-worker6 的内容都是类似的;
hdfs 的文件目录导致的磁盘空间不足问题
先来看下 hdfs 的文件目录配置:
上面的 hadoop_datanode1 数据卷的配置在 docker-compose.yml 的最底部,是默认声明,如下:
在容器运行状态,执行命令 docker inspect datanode1 查看容器信息,和数据卷相关的信息如下所示:
可见 hdfs 容器的文件目录对应的是宿主机的**/var/lib/docker/volumes**;
用 df -m 看看磁盘空间情况,如下所示,"/var/lib/docker/volumes"所在的"/dev/nvme0n1p3"设备可用空间只有 20 多 G(29561),显然在保存大量文件时这个空间是不够的,而且 hdfs 的默认副本数为 3:
上面的磁盘信息显示设备**/dev/sda1**还有 300G,所以 hdfs 的文件目录映射到/dev/sda1 就能缓解磁盘空间问题了,于是修改 docker-compose.yml 文件中 hdfs 的三个数据节点的配置,修改后如下:
再将下面这段配置删除:
开发 master 的 4040 和 work 的 8080 端口
任务运行过程中,如果有 UI 页面来观察详情,可以帮助我们更全面直观的了解运行情况,所以需要修改配置开放端口;
如下所示,expose 参数增加 4040,表示对外暴露 4040 端口,ports 参数增加 4040:4040,表示容器的 4040 映射到宿主机的 4040 端口:
worker 的 web 端口同样需要打开,访问 worker 的 web 页面可以观察 worker 的状态,并且查看任务日志(这个很重要),这里要注意的是由于有多个 worker,所以要映射到宿主机的多个端口,如下配置,workder1 的 environment.SPARK_WORKER_WEBUI_PORT 配置为 8081,并且暴露 8081,再将容器的 8081 映射到宿主机的 8081,workder2 的 environment.SPARK_WORKER_WEBUI_PORT 配置为 8082,并且暴露 8082,再将容器的 8082 映射到宿主机的 8082:
worker3-worker6 的配置与上面类似,注意用不同的端口号;
至此,修改已经完成,最终版的 docker-compose.yml 内容如下:
接下来我们运行一个实例来验证;
验证
在 docker-compose.yml 所在目录创建 hadoop.env 文件,内容如下:
修改好 docker-composes.yml 后,执行以下命令启动容器:
此次验证所用的 spark 应用的功能是分析维基百科的网站统计信息,找出访问量最大的网页,本次实战用现成的 jar 包,不涉及编码,该应用的源码和开发详情请参照《spark实战之:分析维基百科网站统计数据(java版)》;
从 github 下载已经构建好的 spark 应用 jar 文件:
从 github 下载维基百科的网站统计信息大数据集,这里只下载了一个文件,建议您参照《寻找海量数据集用于大数据开发实战(维基百科网站统计数据)》下载更多文件用来实战:
将下载的 sparkdemo-1.0-SNAPSHOT.jar 文件放在 docker-compose.xml 所在目录的 jars 目录下;
在 docker-compose.xml 所在目录的 input_files 目录内创建 input 目录,再将下载的 pagecounts-20160801-000000 文件放在这个 input 目录下;
执行以下命令,将整个 input 目录放入 hdfs:
执行以下命令,提交一个任务,使用了 12 个 executor,每个 1G 内存:
宿主机的状态如下所示,CPU 和内存都被榨干:
宿主机的 IP 地址是 192.168.1.102,以下是状态信息,地址:http://192.168.1.102:8080/
查看 job 的 Stage 情况,如下图,这些信息对学习和掌握 spark 至关重要,地址:http://192.168.1.102:4040
查看 worker1 的基本情况,如下图,地址是:http://192.168.1.102:8081
如果想查看 worker1 上的业务日志,请点击下图红框中的链接,但此时会提示页面访问失败,对应的 url 是"http://localhost:8081/logPage?appId=app-20190216081637-0002&executorId=5&logType=stdout",这个地址是页面生成的,我们只要把其中的"localhost"改成宿主机的IP地址就好了:
修改后的链接可以访问,看到的业务日志如下图,红框中就是业务代码输出的日志:
以上就是优化和验证的全部过程,您可以根据自己机器的实际情况来调整参数,将电脑的性能充分的利用起来;
后来我用 24 个 300M 的文件做数据集,大约 1.5 亿条记录,在上述硬件环境运行上述命令,最终耗时 30 分钟完成,如下图:
欢迎关注 InfoQ:程序员欣宸
版权声明: 本文为 InfoQ 作者【程序员欣宸】的原创文章。
原文链接:【http://xie.infoq.cn/article/76d292db3ee384ef5a5a1f916】。文章转载请联系作者。
评论