李世强,周 游
(黔南民族职业技术学院 贵州 黔南 558022)
随着信息技术和移动互联网的迅速发展,大数据技术也得到了飞速发展,大数据专业如雨后春笋般出现在高校。大数据实训环境要求比较复杂,需要的软硬件资源相比较多,如搭建一个分布式Hadoop集群环境需要3~5台机器,传统做法是计算机中安装VMWare Workstation 或Virtual Box等虚拟化软件,通过创建多态虚拟机达到实验要求环境。但是虚拟机对硬件资源要求比较高,通常1台8G内存的实训主机上运行3~5台虚拟机非常困难。此外,大数据实训环境比较多,如Hadoop集群、Hive集群、Spark集群,大数据可视化集群等,由于实训的复杂性,很难一次安装完成,教学过程中会对实训环境进行改动,由于实训室大都安装有还原系统,每次改动代价很大。由于大数据实训环境复杂、硬件需求高,很多学生无法在自己电脑上进行部署,实训也就限制在了实训室内,不利于学生学习。
容器技术是一种伴随着云计算而兴起的技术,云时代一个不同于以前的特点就是很多资源和计算都放在服务器端,用户通过网络进行操作,对容器的操作都可以通过浏览器完成。容器技术的出现给大数据这种硬件要求高、搭建复杂的实训提供了一种解决方案。本文利用Docker容器相关技术实现了一种在线实训平台。
大数据在线实训管理平台硬件为5~10台内存为128 G服务器。操作系统为CentOS7,安装有Docker-CE、Docker Composer,通过Docker Swarm搭建容器管理集群。实训环境镜像可以从Docker Hub获取实验基础镜像,通过Docker Registry搭建本地实训镜像库,见图1。
图1 大数据在线实训管理平台构架图
Docker是一个开源的容器引擎,它有助于更快地交付应用。方便快捷已经是Docker的最大优势,过去搭建环境需要用数天乃至数周,在Docker容器的处理下,只需要数秒就能完成。Docker具有三大核心概念:镜像、容器和仓库。镜像是基于联合文件系统的一种层式的结构,由一系列指令一步一步构建出来的。一个镜像可以是一个完整的CentOS操作系统环境,称为CentOS镜像。也可以在CentOS基础上安装其他应用程序,制作成应用的镜像。容器是镜像创建的实例,可以启动、停止并删除。每个容器都是相互隔离的,不同容器中的程序不会产生影响。容器是一个动态的概念,而镜像是一个相对静止的概念。仓库是用来保存镜像的场所,分为公有和私有两种[1]。
用户可以通过docker search命令来查找官方仓库中的镜像,然后使用docker pull命令来将它下载到本地[2]。
根据是否是官方提供,可将镜像资源分为两类。一种是类似CentOS这样的镜像,被称为基础镜像。这些基础镜像是由Docker公司创建、验证、支持、提供的。这样的镜像往往使用单个单词作为名字。还有一种类型,比如tianon/centos镜像,它是由Docker的用户创建并维护的,往往带有用户名称前缀。可以通过前缀user_name/来指定使用某个用户提供的镜像,比如tianon用户。
用户也可以在登录后利用docker push命令来将镜像推送到Docker Hub。
当运行的应用如搭建Hadoop集群需要多个环境时,就需要用到Docker Compose,Docker Compose是用于定义和运行多容器Docker应用程序的工具。通过Compose,我们可以使用YML文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从YML文件配置中创建并启动所有服务[3]。
Compose使用的三个步骤:
(1)使用Dockerfile定义应用程序的环境。
(2)使用docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
(3)最后,执行docker-compose up命令来启动并运行整个应用程序。
Docker Registry是一个容器镜像注册中心,是一个无状态、高度可扩展的服务器端应用程序,用于存储并分发Docker镜像。它是开源,由Apache许可。Docker公司提供的官方Registry叫Docker Hub,是世界上最大的容器镜像存储库,它里面的内容来源很广,包括容器社区开发人员、开源项目和独立软件供应商(ISV)提供的容器镜像。用户可以非常便捷地使用公共存储库中存储、分享的容器镜像,其中已经包括了超过15,000+的镜像。大数据实训环境大部分镜像,都可以通过在 Docker Hub中直接下载来实现。我们可以方便地使用大数据中用到的很多官方容器镜像,如Ubuntu、CentOS、MongoDB、redis、postgres、nginx、MariaDB、hadoop、flink、storm等。通过使用官方镜像,可以省去很多安装时间,把精力投入到学习使用中。可以通过$ docker run --name flink_jobmanager -d -t flink jobmanager一条命令启动一个flink任务管理器(主节点)。使用docker stack deploy -c dockercompose-v3.yml hadoop可以快速搭建一个拥有一个主节点、数据节点、资源管理器、节点管理器、历史管理器的Hadoop集群[4]。
Registry本身也是一个单独的开源项目,任何人都可以在下载后自己部署一个Registry。使用它可以严格控制Docker镜像存储的位置,拥有完全属于自己的Docker镜像发送渠道。部署到本地,可节约从互联网拉取镜像的时间。
假如我们在学校将一个软件的运行环境制作成镜像,并上传到Registry中,这时就可以很方便地在家里的计算机上从Registry上下载并运行了。对Registry的操作也是与Docker完美融合的,用户甚至不需要知道Registry的存在,只需要通过简单的Docker命令就可以实现下载运行操作[5]。
(1)搭建本地Registry
docker run -d -p 5000:5000 --name registry registry:2
(2)从共有仓库拉取镜像
docker pull ubuntu
(3)给镜像添加指向私有仓库标签
docker image tag ubuntu localhost:5000/myfirstimage
(4)提交到仓库
docker push localhost:5000/myfirstimage
(5)从私有仓库拉去镜像
docker pull localhost:5000/myfirstimage
容器集群管理工具主要有Docker Swarm和Kubernetes等。Docker Swarm是Docker原生自带的集群管理工具;Kubernetes是谷歌项目下的容器编排工具。
Docker Swarm集群模式原生态集成到Docker引擎中,它的学习成本低,学习了Docker基础知识可以平滑过渡,里面的service服务可以满足动态增减容器个数,同时具备自身的负载均衡,Swarm管理着多台设定保证了机器在出错后有一个良好的容灾机制。Kubernetes配置、搭建稍显复杂,学习成本高,对应运维的成本相对高点。本文采用了Docker Swarm。
Swarm集群由管理节点(manager)和工作节点(work node)构成。管理节点负责整个集群的管理工作包括集群配置、服务管理等所有跟集群有关的工作。工作节点负责运行业务容器。
Portainer管理工具是一款基于Docker环境的强大的开源管理工具,能让我们轻松的构建、管理维护Docker环境,并且完全免费。这款管理工具还有许多插件能够通过简单的订阅获得,Portainer的核心功能能够满足任何规模组织基于docker环境的理想工具集合。可以说是容器管理的理想选择。
部署Portainer和Portainer代理来管理Swarm集群非常容易,可以直接在Docker集群中把Portainer部署成服务,这种部署方式会自动部署一个Portainer服务实例,并且在整个集群每个节点中部署一个Portainer代理。
部署方式:
$curl -L https://downloads.portainer.io/portaineragent-stack.yml -o portainer-agent-stack.yml
$docker stack deploy --compose-file=portaineragent-stack.yml portainer
此外,Portainer还提供HTTP API,Portainer UI就是通过Portainer API使用的,通过UI完成的事都可以通过HTTP API实现。可以通过 Docker API和Portainer API 开发更加个性化的管理工具。
大数据在线使用平台使用Portainer作为可视化管理工具可以方便的下载镜像、启动实训环境。
(1)创建50个Linux实训环境的命令如下:
import os
count=50
for i in range(50):
cmd='docker run -itd --name centosclass-'+str(i)+' centos:centos7.7.1908 /bin/bash'
re = os.system(cmd)
(2)搭建jupyter-notebook的pyspark数据分析可视化开发环境。
docker run -d -p 8888:8888 -p 4040:4040 -p 4041:4041 jupyter/pyspark-notebook.
编写实例代码测试:
from pyspark.sql import SparkSession
spark = SparkSession.builder.master('local').getOrCreate()sc = spark.sparkContext
rdd = sc.parallelize(range(100 + 1))
rdd.sum()
(3)搭建Hadoop大数据集群。
首先下载Hadoop集群的docker-compose-v3.yml文件,然后通过运行docker stack deploy -c dockercompose-v3.yml hadoop 就可以创建一个有一个主节点、一个数据节点、一个历史服务、一个节点管理器、一个资源管理器的Hadoop集群。
(4)搭建elasticsearch集群。
下载elasticsearch的docker-compose.yml文件,运行如下命令启动集群:
docker-compose up
大数据实训环境创建可总结为以下几步:
(1)在docker hub上搜索用于实训的公共的基础镜像。
(2)根据基础镜像创建容器,进行个性化设置,然后保存为本地实训镜像。
(3)编写实训环境批量创建脚本。
(4)通过Portainer进行在线实训。
本文基于Docker容器技术及其相关开源软件研究并实现Linux、Python、MySQL集群、Hadoop集群、ElasticSearch集群等大数据相关实训课程的在线实训平台。该方法为大数据相关课程实训提供了一种经济高效的在线实训环境建设方案。这种方案打破了大数据实训时间、地点的约束,学生不必只能跑到机房实训。学生即使是在宿舍、在家,假期、甚至疫情期间都可以顺利地进行实验,因为在线实训只要求学生拥有一台可以上网的电脑,配置要求也不很高,因为实训运行是在服务器端进行的。在线实训环境不仅能减轻教师工作量,还能提高教学效果。通过在线实训环境搭建可以更好地服务于大数据相关专业的学生,提升教师科研与技术创新能力。