写点什么

docker 下,极速搭建 spark 集群 (含 hdfs 集群)

作者:程序员欣宸
  • 2022 年 8 月 17 日
    广东
  • 本文字数:3525 字

    阅读完需:约 12 分钟

docker下,极速搭建spark集群(含hdfs集群)

欢迎访问我的 GitHub

这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos


  • 搭建 spark 和 hdfs 的集群环境会消耗一些时间和精力,处于学习和开发阶段的同学关注的是 spark 应用的开发,他们希望整个环境能快速搭建好,从而尽快投入编码和调试,今天咱们就借助 docker,极速搭建和体验 spark 和 hdfs 的集群环境;

实战环境信息

  • 以下是本次实战涉及的版本号:


  1. 操作系统:CentOS7

  2. hadoop:2.8

  3. spark:2.3

  4. docker:17.03.2-ce

  5. docker-compose:1.23.2

极速搭建 spark 集群(含 hdfs 集群)

  • 在 CentOS7 机器上建一个文件夹(例如 test),进入此文件夹;

  • 在新建的文件夹内执行如下命令,即可搭建好 spark 和 hdfs 集群:


wget https://raw.githubusercontent.com/zq2599/blog_demos/master/sparkdockercomposefiles/docker-compose.yml \&& wget https://raw.githubusercontent.com/zq2599/blog_demos/master/sparkdockercomposefiles/hadoop.env \&& docker-compose up -d
复制代码


没错,执行上面的命令就够了,只要静候命令执行完成,整个 spark 和 hdfs 集群环境就搭建好了;

查看环境

  • 接下来检查一下整个环境是否正常,假设当前 CentOS 电脑的 IP 地址是 192.168.1.101

  • 用浏览器查看 hdfs,如下图,可见有三个 DataNode,地址是:http://192.168.1.101:50070


  • 用浏览器查看 spark,如下图,可见只有一个 worker,地址是:http://192.168.1.101:8080


  • 注意:spark 的 worker 数量,以及 worker 内存的分配,都可以通过修改 docker-compose.yml 文件来调整;

准备实战数据

  • 登录 CentOS7 电脑,在刚才执行命令的目录下,发现多了几个文件夹,如下所示,注意 input_files jars 这两个,稍后会用到:


[root@hedy 009]# ls -al总用量 8drwxr-xr-x.  6 root root  105 2月  10 00:47 .drwxr-xr-x. 10 root root   94 2月  10 00:47 ..drwxr-xr-x.  4 root root   34 2月  10 00:47 confdrwxr-xr-x.  2 root root    6 2月  10 00:47 data-rw-r--r--.  1 root root 3046 2月  10 00:47 docker-compose.yml-rw-r--r--.  1 root root 1189 2月  10 00:47 hadoop.envdrwxr-xr-x.  2 root root    6 2月  10 00:47 input_filesdrwxr-xr-x.  2 root root    6 2月  10 00:47 jars
复制代码


  • 稍后的实战是经典的 WordCount,也就是将指定文本中的单词出现次数统计出来,因此要先准备一个文本文件,我这里在网上找了个英文版的《乱世佳人》,文件名为 GoneWiththeWind.txt,读者您请自行准备一个英文的 txt 文件,放入 input_files 文件夹中;

  • 执行以下命令,即可在 hdfs 上创建**/input**文件夹,再将 GoneWiththeWind.txt 上传到此文件夹中:


docker exec namenode hdfs dfs -mkdir /input \&& docker exec namenode hdfs dfs -put /input_files/GoneWiththeWind.txt /input
复制代码


  • 您可能会有疑问:txt 文件在宿主机上,hdfs 是 docker 容器,怎么能上传上去呢?您看过 docker-compose.yml 就会发现,宿主机的 input_files 目录已经挂载到 namenode 容器上了,所以上面的命令其实就是将容器内的文件上传到 hdfs 上去;

  • 用浏览器查看 hdfs,如下图,可见 txt 文件已经上传到 hdfs 上:


spark_shell 实战 WordCount

  • 在 CentOS 电脑的命令行输入以下命令,即可创建一个 spark_shell:


docker exec -it master spark-shell --executor-memory 512M --total-executor-cores 2
复制代码


  • 如下所示,已经进入了 spark_shell 的对话模式:


[root@hedy ~]# docker exec -it master spark-shell --executor-memory 512M --total-executor-cores 22019-02-09 17:13:44 WARN  NativeCodeLoader:62 - Unable to load native-hadoop library for your platform... using builtin-java classes where applicableSetting default log level to "WARN".To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).Spark context Web UI available at http://localhost:4040Spark context available as 'sc' (master = spark://master:7077, app id = app-20190209171354-0000).Spark session available as 'spark'.Welcome to      ____              __     / __/__  ___ _____/ /__    _\ \/ _ \/ _ `/ __/  '_/   /___/ .__/\_,_/_/ /_/\_\   version 2.3.0      /_/         Using Scala version 2.11.8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_131)Type in expressions to have them evaluated.Type :help for more information.
scala>
复制代码


  • 继续输入以下命令,也就是 scala 版的 WordCount:


sc.textFile("hdfs://namenode:8020/input/GoneWiththeWind.txt").flatMap(line => line.split(" ")).map(word => (word, 1)).reduceByKey(_ + _).sortBy(_._2,false).take(10).foreach(println)
复制代码


  • 稍后控制台就会输出整个 txt 中出现次数最多的十个单词,以及对应的出现次数,如下:


scala> sc.textFile("hdfs://namenode:8020/input/GoneWiththeWind.txt").flatMap(line => line.split(" ")).map(word => (word, 1)).reduceByKey(_ + _).sortBy(_._2,false).take(10).foreach(println)(the,18264)                                                                     (and,14150)(to,10020)(of,8615)(a,7571)(her,7086)(she,6217)(was,5912)(in,5751)(had,4502)
scala>
复制代码


  • 用浏览器查看 spark,如下图,可见任务正在执行中(因为 shell 还没有退出),地址是:http://192.168.1.101:8080



  • 输入 Ctrl+c,退出 shell,释放资源;

  • 至此,spark_shell 的实战就完成了,如果您是位 java 开发者,请接着往下看,咱们一起来实战 java 版 spark 应用的提交运行;

java 实战 WordCount

  • 关于接下来的 java 版的 WordCount,本文直接将 jar 下载下来用,而这个 jar 对应的源码以及开发过程,请参考文章《第一个spark应用开发详解(java版)》

  • 在 docker-compose.yml 文件所在目录下,有个 jars 目录,进入此目录执行以下命令,就会将实战用到的 jar 文件下载到 jars 目录:


wget https://raw.githubusercontent.com/zq2599/blog_demos/master/sparkdockercomposefiles/sparkwordcount-1.0-SNAPSHOT.jar
复制代码


  • 执行以下命令,即可向 spark 提交 java 应用执行:


docker exec -it master spark-submit \--class com.bolingcavalry.sparkwordcount.WordCount \--executor-memory 512m \--total-executor-cores 2 \/root/jars/sparkwordcount-1.0-SNAPSHOT.jar \namenode \8020 \GoneWiththeWind.txt
复制代码


  • 任务执行过程中,控制台会输出大量信息,其中有类似以下的内容,就是统计结果:


2019-02-09 17:30:32 INFO  WordCount:90 - top 10 word :the  18264and  14150to  10020of  8615a  7571her  7086she  6217was  5912in  5751had  4502
复制代码


  • 用浏览器查看 hdfs,如下图,可见**/output**目录下创建了一个子文件夹 20190209173023,这个文件夹下有两个文件,其中名为 part-00000 的就是本次实战输出的结果:


  • 在 hdfs 的网页上看见/output 目录下的子文件夹名称为 20190209173023,因此执行以下命令,即可在控制台看到 part-00000 文件的内容:


docker exec namenode hdfs dfs -cat /output/20190209173023/part-00000
复制代码


  • 看到的 part-00000 的内容如下:


[root@hedy jars]# docker exec namenode hdfs dfs -cat /output/20190209173023/part-00000(18264,the)(14150,and)(10020,to)(8615,of)(7571,a)(7086,her)(6217,she)(5912,was)(5751,in)(4502,had)
复制代码


  • 以上就是极速搭建 spark 集群的实战,虽然操作简单,但是整个环境存在以下几处瑕疵:


  1. 只有一个 worker,并行执行能力较差;

  2. hdfs 容器的磁盘空间是在 docker 的安装路径下分配的,遇到大文件时容器将系统空间占满;

  3. spark master 的 4040 端口没有开放,无法观察应用运行的情况;

  4. worker 的 8080 端口都没有开放, 无法观察 worker 的运行情况,也不能查看业务运行日志;


  • 针对上述问题,我对 docker-compose.yml 做了改进,您可以执行以下命令快速搭建整个集群环境,要注意的是下面的命令会启动 6 个 worker,比较消耗内存,如果您的电脑内存低于 10G,很可能启动容器失败,此时建议您打开 docker-compose.yml 文件,对 worker 的配置做适当删减:


wget https://raw.githubusercontent.com/zq2599/blog_demos/master/files/sparkcluster/docker-compose.yml \&& wget https://raw.githubusercontent.com/zq2599/blog_demos/master/sparkdockercomposefiles/hadoop.env \&& docker-compose up -d
复制代码


  • 如果您想了解更多优化的细节,例如磁盘如何调整,master 和 worker 开放的 web 端口如何访问,请参考《docker下的spark集群,调整参数榨干硬件》

  • 至此,docker 下的 spark 集群的搭建和体验我们都快速完成了,希望此文能助您快速搭建环境,聚焦业务开发;

欢迎关注 InfoQ:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...


发布于: 刚刚阅读数: 3
用户头像

搜索"程序员欣宸",一起畅游Java宇宙 2018.04.19 加入

前腾讯、前阿里员工,从事Java后台工作,对Docker和Kubernetes充满热爱,所有文章均为作者原创,个人Github:https://github.com/zq2599/blog_demos

评论

发布
暂无评论
docker下,极速搭建spark集群(含hdfs集群)_spark_程序员欣宸_InfoQ写作社区