随着移动互联网和物联网的兴起,大数据领域出现了两大新贵,传统的离线大数据处理框架Hadoop和统一迭代计算、流式计算和图计算的Spark。
对于Hadoop我们并不需要过多的介绍,经典的MapReduce编程范式已经流行了近十年,但它的使用很大程度上仅限于离线计算,于是出现了Storm、Hive、Impala等项目来弥补它在流式计算和在线查询上的劣势。大量生态项目的涌入让Hadoop学习越来越复杂,并且很多公司都在重复研究和实现数据挖掘、人工智能的算法,对真正的数据工程师或数学家来说这是难以驾驭的大数据处理服务。
这是Spark应运而生,诞生于伯克利大学的AMPLab,通过RDD的设计创新性地实现了迭代计算、流式计算、图计算等大数据处理接口,并且提供比Hadoop快10倍到100倍的性能。无论从功能来看,还是从性能来看,Spark无疑将获得大部分大数据开发者的青睐。Spark提供了Java、Scala和Python的开发接口,三行代码即可实现经典的WordCount分布式应用,因此快速了解和学习Spark也是当代程序员的基本要求。
为了满足公司内部和公有云用户的大数据开发需求,我们提供的UOS平台必须支持用户在上面运行Spark集群。
UOS通过KVM虚拟化技术为开发者提供了按需分配的虚拟机,在需要分析数据时可以一键创建虚拟机集群,目前UOS基于Ceph统一存储虚拟机启动时间控制在10秒以内。
建立Spark集群还需要打通网络,我们基于Neutron实现的SDN可以支持用户自由配置网络和IP地址,最简单的配置是让Spark集群的服务器都在同一个私有网络中。
除此以外,我们全SSD的块设备也能为用户提供高性能的云硬盘存储服务。由于Ceph是分布式存储,有人担心这是否会影响Spark的性能,实际上Spark的创新之处在于设计了基于内存的RDD,才能在性能上远超Hadoop,从Spark官方文档看出Spark的性能在内存足够的情况下只限于网络。
目前UOS公有云已经有使用Spark的大数据用户,我们通过他的分享来快速搭建自己的分布式Spark集群。
要搭建Spark计算集群,我们需要创建三台服务器,系统使用Ubuntu或CentOS都是支持的,并且让绑定在同一个私有网络上。
然后我们需要安装Java、Scala和Spark,安装步骤虽然有些繁琐,但在Ubuntu虚拟机上已经测试通过,用户也可以选择合适的版本(注意最新的Spark 1.5需要搭配Scala 2.10.x)。
## Install Java 7
sudo apt-get purge -y openjdk*
add-apt-repository ppa:webupd8team/java
apt-get update -y
apt-get install -y oracle-java7-installer
## Install Scala 2.10.5
wget http://downloads.typesafe.com/scala/2.10.5/scala-2.10.5.tgz
tar xzvf ./scala-2.10.5.tgz
mv scala-2.10.5 /usr/lib/
## Install Spark 1.5
wget http://d3kbcqa49mib13.cloudfront.net/spark-1.5.0-bin-hadoop2.6.tgz
tar xzvf ./spark-1.5.0-bin-hadoop2.6.tgz
mv ./spark-1.5.0-bin-hadoop2.6/ /usr/lib/spark-1.5.0/
安装上述的软件后,记得在.bashrc或.zshrc添加以下环境变量,否则找不到Java或Spark命令。
export JAVA_HOME=/usr/lib/jvm/java-7-oracle/
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
export SCALA_HOME=/usr/lib/scala-2.10.5export PATH=$PATH:$SCALA_HOME/bin
export SPARK_HOME=/usr/lib/spark-1.5.0export PATH=$PATH:$SPARK_HOME/bin
可以说把包下载下来就可以直接运行Spark了,但为了配置集群模式,我们还需要配置slaves文件和spark-env.sh,添加从节点和主节点的IP地址。
cp /usr/lib/spark-1.5.0/conf/slaves.template /usr/lib/spark-1.5.0/conf/slaves
42.62.101.17042.62.101.103
cp /usr/lib/spark-1.5.0/conf/spark-env.sh.template /usr/lib/spark-1.5.0/conf/spark-env.sh
export JAVA_HOME=/usr/lib/jvm/java-7-oracle/export SCALA_HOME=/usr/lib/scala-2.10.5
export SPARK_MASTER_IP=10.250.7.235由于不能说的原因下载Java和Spark都比较耗时,可以使用UOS的虚拟机快照功能,直接克隆一个虚拟机,这样就无需重复上述的配置了。然后只需要在主节点执行start-all.sh就可以启动集群了,为了允许主节点ssh到从节点启动服务,我们需要把主节点的ssh key手动添加到从节点上。服务启动后,在8080端口就可以看到久违的Spark管理界面。
要测试Spark服务也很简单,在主节点运行/usr/lib/spark-1.5.0/bin/pyspark,然后快速创建一个RDD,执行一下count操作,马上可以得到分布式计算后的运算结果。
rdd = sc.parallelize([1, 2, 3])rdd.count()
最后总结下分布式大数据并行处理框架Spark,这是令很多数据工程师和程序员痴迷的大数据框架,它同时提供了迭代计算、流式计算、图计算等接口,并且内置大量机器学习、数据挖掘算法,让任何人都能快速学习和参与到大数据开发来。
UOS是基于OpenStack的高性能云服务提供商,也提供了对大数据服务和Spark的支持,希望通过我们的平台能让更多人用上Spark,通过我们的教程让更多开发者了解大数据。
陈迪豪,UnitedStack有云的基础架构工程师,目前专注于Docker、OpenStack社区。Docker监控管理工具Seagull项目作者,开源电子书《理解Linux进程》作者。