《循序渐进学Spark 》Spark架构与集群环境

    xiaoxiao2024-02-19  139

    本节书摘来自华章出版社《循序渐进学Spark 》一书中的第1章,第1节,作者 小象学院 杨 磊,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

    Spark架构与集群环境

    本章首先介绍Spark大数据处理框架的基本概念,然后介绍Spark生态系统的主要组成部分,包括Spark SQL、Spark Streaming、MLlib和GraphX,接着简要描述了Spark的架构,便于读者认识和把握,最后描述了Spark集群环境搭建及Spark开发环境的构建方法。

    1.1 Spark概述与架构

    随着互联网规模的爆发式增长,不断增加的数据量要求应用程序能够延伸到更大的集群中去计算。与单台机器计算不同,集群计算引发了几个关键问题,如集群计算资源的共享、单点宕机、节点执行缓慢及程序的并行化。针对这几个集群环境的问题,许多大数据处理框架应运而生。比如Google的MapReduce,它提出了简单、通用并具有自动容错功能的批处理计算模型。但是MapReduce对于某些类型的计算并不适合,比如交互式和流式计算。基于这种类型需求的不一致性,大量不同于MapReduce的专门数据处理模型诞生了,如GraphLab、Impala、Storm等。大量数据模型的产生,引发的后果是对于大数据处理而言,针对不同类型的计算,通常需要一系列不同的处理框架才能完成。这些不同的处理框架由于天生的差异又带来了一系列问题:重复计算、使用范围的局限性、资源分配、统一管理,等等。

    1.1.1 Spark概述

    为了解决上述MapReduce及各种处理框架所带来的问题,加州大学伯克利分校推出了Spark统一大数据处理框架。Spark是一种与Hadoop MapReduce类似的开源集群大数据计算分析框架。Spark基于内存计算,整合了内存计算的单元,所以相对于hadoop的集群处理方法,Spark在性能方面更具优势。Spark启用了弹性内存分布式数据集,除了能够提供交互式查询外,还可以优化迭代工作负载。

    从另一角度来看,Spark可以看作MapReduce的一种扩展。MapReduce之所以不擅长迭代式、交互式和流式的计算工作,主要因为它缺乏在计算的各个阶段进行有效的资源共享,针对这一点, Spark创造性地引入了RDD(弹性分布式数据集)来解决这个问题。RDD的重要特性之一就是资源共享。

    Spark基于内存计算,提高了大数据处理的实时性,同时兼具高容错性和可伸缩性,更重要的是,Spark可以部署在大量廉价的硬件之上,形成集群。

    提到Spark的优势就不得不提到大家熟知的Hadoop。事实上,Hadoop主要解决了两件事情:

    1)数据的可靠存储。

    2)数据的分析处理。

    相应地,Hadoop也主要包括两个核心部分:

    1)分布式文件系统(Hadoop Distributed File System,HDFS):在集群上提供高可靠的文件存储,通过将文件块保存多个副本的办法解决服务器或硬盘故障的问题。

    2)计算框架MapReduce:通过简单的Mapper和Reducer的抽象提供一个编程模型,可以在一个由几十台,甚至上百台机器组成的不可靠集群上并发地、分布式地处理大量的数据集,而把并发、分布式(如机器间通信)和故障恢复等计算细节隐藏起来。

    Spark是MapReduce的一种更优的替代方案,可以兼容HDFS等分布式存储层,也可以兼容现有的Hadoop生态系统,同时弥补MapReduce的不足。

    与Hadoop MapReduce相比,Spark的优势如下:

    中间结果:基于MapReduce的计算引擎通常将中间结果输出到磁盘上,以达到存储和容错的目的。由于任务管道承接的缘故,一切查询操作都会产生很多串联的Stage,这些Stage输出的中间结果存储于HDFS。而Spark将执行操作抽象为通用的有向无环图(DAG),可以将多个Stage的任务串联或者并行执行,而无须将Stage中间结果输出到HDFS中。

    执行策略:MapReduce在数据Shuffle之前,需要花费大量时间来排序,而Spark不需要对所有情景都进行排序。由于采用了DAG的执行计划,每一次输出的中间结果都可以缓存在内存中。

    任务调度的开销:MapReduce系统是为了处理长达数小时的批量作业而设计的,在某些极端情况下,提交任务的延迟非常高。而Spark采用了事件驱动的类库AKKA来启动任务,通过线程池复用线程来避免线程启动及切换产生的开销。

    更好的容错性:RDD之间维护了血缘关系(lineage),一旦某个RDD失败了,就能通过父RDD自动重建,保证了容错性。

    高速:基于内存的Spark计算速度大约是基于磁盘的Hadoop MapReduce的100倍。

    易用:相同的应用程序代码量一般比Hadoop MapReduce少50%~80%。

    提供了丰富的API:与此同时,Spark支持多语言编程,如Scala、Python及Java,便于开发者在自己熟悉的环境下工作。Spark自带了80多个算子,同时允许在Spark Shell环境下进行交互式计算,开发者可以像书写单机程序一样开发分布式程序,轻松利用Spark搭建大数据内存计算平台,并利用内存计算特性,实时处理海量数据。

    1.1.2 Spark生态

    Spark大数据计算平台包含许多子模块,构成了整个Spark的生态系统,其中Spark为核心。

    伯克利将整个Spark的生态系统称为伯克利数据分析栈(BDAS),其结构如图1-1所示。

    以下简要介绍BDAS的各个组成部分。

    1. Spark Core

    Spark Core是整个BDAS的核心组件,是一种大数据分布式处理框架,不仅实现了MapReduce的算子map函数和reduce函数及计算模型,还提供如filter、join、groupByKey等更丰富的算子。Spark将分布式数据抽象为弹性分布式数据集(RDD),实现了应用任务调度、RPC、序列化和压缩,并为运行在其上的上层组件提供API。其底层采用Scala函数式语言书写而成,并且深度借鉴Scala函数式的编程思想,提供与Scala类似的编程接口。

     

    图1-1 伯克利数据分析栈的结构

    2. Mesos

    Mesos是Apache下的开源分布式资源管理框架,被称为分布式系统的内核,提供了类似YARN的功能,实现了高效的资源任务调度。

    3. Spark Streaming

    Spark Streaming是一种构建在Spark上的实时计算框架,它扩展了Spark处理大规模流式数据的能力。其吞吐量能够超越现有主流流处理框架Storm,并提供丰富的API用于流数据计算。

    4. MLlib

    MLlib 是Spark对常用的机器学习算法的实现库,同时包括相关的测试和数据生成器。MLlib 目前支持4种常见的机器学习问题:二元分类、回归、聚类以及协同过滤,还包括一个底层的梯度下降优化基础算法。

    5. GraphX

    GraphX是 Spark中用于图和图并行计算的API,可以认为是GraphLab和Pregel在Spark (Scala)上的重写及优化,与其他分布式图计算框架相比,GraphX最大的贡献是,在Spark上提供一栈式数据解决方案,可以方便、高效地完成图计算的一整套流水作业。

    6. Spark SQL

    Shark是构建在Spark和Hive基础之上的数据仓库。它提供了能够查询Hive中所存储数据的一套SQL接口,兼容现有的Hive QL语法。熟悉Hive QL或者SQL的用户可以基于Shark进行快速的Ad-Hoc、Reporting等类型的SQL查询。由于其底层计算采用了Spark,性能比Mapreduce的Hive普遍快2倍以上,当数据全部存储在内存时,要快10倍以上。2014年7月1日,Spark社区推出了Spark SQL,重新实现了SQL解析等原来Hive完成的工作,Spark SQL在功能上全覆盖了原有的Shark,且具备更优秀的性能。

    7. Alluxio

    Alluxio(原名Tachyon)是一个分布式内存文件系统,可以理解为内存中的HDFS。为了提供更高的性能,将数据存储剥离Java Heap。用户可以基于Alluxio实现RDD或者文件的跨应用共享,并提供高容错机制,保证数据的可靠性。

    8. BlinkDB

    BlinkDB是一个用于在海量数据上进行交互式SQL的近似查询引擎。它允许用户在查询准确性和查询响应时间之间做出权衡,执行相似查询。

    1.1.3 Spark架构

    传统的单机系统,虽然可以多核共享内存、磁盘等资源,但是当计算与存储能力无法满足大规模数据处理的需要时,面对自身CPU与存储无法扩展的先天限制,单机系统就力不从心了。

    1. 分布式系统的架构

    所谓的分布式系统,即为在网络互连的多个计算单元执行任务的软硬件系统,一般包括分布式操作系统、分布式数据库系统、分布式应用程序等。本书介绍的Spark分布式计算框架,可以看作分布式软件系统的组成部分,基于Spark,开发者可以编写分布式计算程序。

    直观来看,大规模分布式系统由许多计算单元构成,每个计算单元之间松耦合。同时,每个计算单元都包含自己的CPU、内存、总线及硬盘等私有计算资源。这种分布式结构的最大特点在于不共享资源,与此同时,计算节点可以无限制扩展,计算能力和存储能力也因而得到巨大增长。但是由于分布式架构在资源共享方面的先天缺陷,开发者在书写和优化程序时应引起注意。分布式系统架构如图1-2所示。

    为了减少网络I/O开销,分布式计算的一个核心原则是数据应该尽量做到本地计算。在计算过程中,每个计算单元之间需要传输信息,因此在信息传输较少时,分布式系统可以利用资源无限扩展的优势达到高效率,这也是分布式系统的优势。目前分布式系统在数据挖掘和决策支持等方面有着广泛的应用。

    Spark正是基于这种分布式并行架构而产生,也可以利用分布式架构的优势,根据需要,对计算能力和存储能力进行扩展,以应对处理海量数据带来的挑战。同时,Spark的快速及容错等特性,让数据处理分析显得游刃有余。

    2. Spark架构

    Spark架构采用了分布式计算中的Master-Slave模型。集群中运行Master进程的节点称为Master,同样,集群中含有Worker进程的节点为Slave。Master负责控制整个集群的运行;Worker节点相当于分布式系统中的计算节点,它接收Master节点指令并返回计算进程到Master;Executor负责任务的执行;Client是用户提交应用的客户端;Driver负责协调提交后的分布式应用。具体架构如图1-3所示。

     

    图1-3 Spark架构

    在Spark应用的执行过程中,Driver和Worker是相互对应的。Driver是应用逻辑执行的起点,负责Task任务的分发和调度;Worker负责管理计算节点并创建Executor来并行处理Task任务。Task执行过程中所需的文件和包由Driver序列化后传输给对应的Worker节点,Executor对相应分区的任务进行处理。

    下面介绍Spark架构中的组件。

    1)Client: 提交应用的客户端。

    2)Driver: 执行Application中的main函数并创建SparkContext。

    3) ClusterManager: 在YARN模式中为资源管理器。在Standalone模式中为Master(主节点),控制整个集群。

    4) Worker: 从节点,负责控制计算节点。启动Executor或Driver,在YARN模式中为NodeManager。

    5) Executor: 在计算节点上执行任务的组件。

    6) SparkContext: 应用的上下文,控制应用的生命周期。

    7) RDD: 弹性分布式数据集,Spark的基本计算单元,一组RDD可形成有向无环图。

    8) DAG Scheduler: 根据应用构建基于Stage的DAG,并将Stage提交给Task Scheduler。

    9) Task Scheduler: 将Task分发给Executor执行。

    10) SparkEnv: 线程级别的上下文,存储运行时重要组件的应用,具体如下:

    ①SparkConf: 存储配置信息。

    ②BroadcastManager: 负责广播变量的控制及元信息的存储。

    ③BlockManager: 负责Block的管理、创建和查找。

    ④MetricsSystem: 监控运行时的性能指标。

    ⑤MapOutputTracker: 负责shuffle元信息的存储。

    Spark架构揭示了Spark的具体流程如下:

    1) 用户在Client提交了应用。

    2) Master找到Worker,并启动Driver。

    3) Driver向资源管理器(YARN模式)或者Master(Standalone模式)申请资源,并将应用转化为RDD Graph。

    4) DAG Scheduler将RDD Graph转化为Stage的有向无环图提交给Task Scheduler。

    5) Task Scheduler提交任务给Executor执行。

    3. Spark运行逻辑

    下面举例说明Spark的运行逻辑,如图1-4所示,在Action算子被触发之后,所有累积的算子会形成一个有向无环图DAG。Spark会根据RDD之间不同的依赖关系形成Stage,每个Stage都包含一系列函数执行流水线。图1-4中A、B、C、D、E、F为不同的RDD,RDD内的方框为RDD的分区。

     

    图1-4 Spark执行RDD Graph

    图1-4中的运行逻辑如下:

    1)数据从HDFS输入Spark。

    2)RDD A、RDD C 经过flatMap与Map操作后,分别转换为RDD B 和 RDD D。

    3)RDD D经过reduceByKey操作转换为RDD E。

    4)RDD B 与 RDD E 进行join操作转换为RDD F。

    5)RDD F 通过函数saveAsSequenceFile输出保存到HDFS中。

    1.2 在Linux集群上部署Spark

    Spark安装部署比较简单,用户可以登录其官方网站(http://spark.apache.org/downloads.html)下载Spark最新版本或历史版本,也可以查阅Spark相关文档作为参考。本书开始写作时,Spark刚刚发布1.5.0版,因此本章所述的环境搭建均以Spark 1.5.0版为例。

    Spark使用了Hadoop的HDFS作为持久化存储层,因此安装Spark时,应先安装与Spark版本相兼容的Hadoop。

    本节以阿里云Linux主机为例,描述集群环境及Spark开发环境的搭建过程。

    Spark计算框架以Scala语言开发,因此部署Spark首先需要安装Scala及JDK(Spark1.5.0需要JDK1.7.0或更高版本)。另外,Spark计算框架基于持久化层,如Hadoop HDFS,因此本章也会简述Hadoop的安装配置。

    1.2.1 安装OpenJDK

    Spark1.5.0要求OpenJDK1.7.0或更高版本。 以本机Linux X86机器为例,OpenJDK的安装步骤如下所示:

    1)查询服务器上可用的JDK版本。在终端输入如下命令:

    yum list "*JDK*"

    yum 会列出服务器上的JDK版本。

    2)安装JDK。在终端输入如下命令:

    yum install java-1.7.0-openjdk-devel.x86

    cd /usr/lib/jvm

    ln -s java-1.7.0-openjdk.x86 java-1.7

    3) JDK环境配置。

    ① 用编辑器打开/etc/profile文件,加入如下内容:

    export JAVA_HOME=/usr/lib/jvm/java-1.7

    export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin

    关闭并保存profile文件。

    ② 输入命令 source /etc/profile 让配置生效。

    1.2.2 安装Scala

    登录Scala官网(http://www.scala-lang.org/download/)下载最新版本: scala-2.11.7.tgz

    1)安装。

    tar zxvf scala-2.11.7.tgz -C /usr/local

    cd /usr/local

    ln -s scala-2.11.7 scala

    2) 配置:打开/etc/profile, 加入如下语句:

    export SCALA_HOME=/usr/local/scala

    export PATH=$PATH:$SCALA_HOME/bin

    1.2.3 配置SSH免密码登录

    在分布式系统中,如Hadoop与Spark,通常使用SSH(安全协议,Secure Shell)服务来启动Slave节点上的程序,当节点数量比较大时,频繁地输入密码进行身份认证是一项非常艰难的体验。为了简化这个问题,可以使用”公私钥”认证的方式来达到SSH免密码登录。

    首先在Master节点上创建一对公私钥(公钥文件:~/.ssh/id_rsa.pub; 私钥文件:~/.ssh/id_rsa),然后把公钥拷贝到Worker节点上(~/.ssh/authorized_keys)。二者交互步骤如下:

    1) Master通过SSH连接Worker时,Worker生成一个随机数然后用公钥加密后,发回给Master。

    2) Master收到加密数后,用私钥解密,并将解密数回传给Worker。

    3) Worker确认解密数正确之后,允许Master连接。

    如果配置好SSH免密码登录之后,在以上交互中就无须用户输入密码了。下面介绍安装与配置过程。

    1)安装SSH: yum install ssh

    2)生成公私钥对: ssh-keygen -t rsa

    一直按回车键,不需要输入。执行完成后会在~/.ssh目录下看到已生成id_rsa.pub与id_rsa两个密钥文件。其中id_rsa.pub为公钥。

    3)拷贝公钥到Worker机器: scp ~/.ssh/id_rsa.pub <用户名>@<worker机器ip>:~/.ssh

    4)在Worker节点上,将公钥文件重命名为authorized_keys: mv id_rsa.pub auth-orized_keys。类似地,在所有Worker节点上都可以配置SSH免密码登录。

    1.2.4 Hadoop的安装配置

    登录Hadoop官网(http://hadoop.apache.org/releases.html)下载Hadoop 2.6.0安装包 hadoop-2.6.0.tar.gz。然后解压至本地指定目录。

    tar zxvf hadoop-2.6.0.tar.gz -C /usr/local

    ln -s hadoop-2.6.0 hadoop

    下面讲解Hadoop的配置。

    1)打开/etc/profile,末尾加入:

    export HADOOP_INSTALL=/usr/local/hadoop

    export PATH=$PATH:$HADOOP_INSTALL/bin

    export PATH=$PATH:$HADOOP_INSTALL/sbin

    export HADOOP_MAPRED_HOME=$HADOOP_INSTALL

    export HADOOP_COMMON_HOME=$HADOOP_INSTALL

    export HADOOP_HDFS_HOME=$HADOOP_INSTALL

    export YARN_HOME=$HADOOP_INSTALL

    执行 __source /etc/profile__使其生效,然后进入Hadoop配置目录:/usr/local/hadoop/etc/hadoop,配置Hadoop。

    2)配置hadoop_env.sh。

    export JAVA_HOME=/usr/lib/jvm/java-1.7

    3)配置core-site.xml。

    <property>

         <name>fs.defaultFS</name>

         <value>hdfs://Master:9000</value>

     </property>

     <property>

         <name>hadoop.tmp.dir</name>

         <value>file:/root/bigdata/tmp</value>

     </property>

     <property>

         <name>io.file.buffer.size</name>

         <value>131702</value>

     </property>

    4)配置yarn-site.xml。

    <property>

        <name>yarn.nodemanager.aux-services</name>

        <value>mapreduce_shuffle</value>

    </property>

    <property>

        <name>yarn.nodemanager.auxservices.mapreduce.shuffle.class</name>

        <value>org.apache.hadoop.mapred.ShuffleHandler</value>

    </property>

    <property>

        <name>yarn.resourcemanager.address</name>

        <value>Master:8032</value>

    </property>

    <property>

        <name>yarn.resourcemanager.scheduler.address</name>

        <value>Master:8030</value>

    </property>

    <property>

        <name>yarn.resourcemanager.resource-tracker.address</name>

        <value>Master:8031</value>

    </property>

    <property>

        <name>yarn.resourcemanager.admin.address</name>

        <value>Master:8033</value>

    </property>

    <property>

        <name>yarn.resourcemanager.webapp.address</name>

        <value>Master:8088</value>

    </property>

    5) 配置mapred-site.xml。

    <property>

         <name>mapreduce.framework.name</name>

         <value>yarn</value>

     </property>

     <property>

         <name>mapreduce.jobhistory.address</name>

         <value>Master:10020</value>

     </property>

     <property>

         <name>mapreduce.jobhistory.webapp.address</name>

         <value>Master:19888</value>

     </property>

    6) 创建namenode和datanode目录,并配置路径。

    ① 创建目录。

    mkdir -p /hdfs/namenode

    mkdir -p /hdfs/datanode

    ② 在hdfs-site.xml中配置路径。

    <property>

         <name>dfs.namenode.name.dir</name>

         <value>file:/hdfs/namenode</value>

     </property>

     <property>

         <name>dfs.datanode.data.dir</name>

         <value>file:/hdfs/datanode</value>

     </property>

     <property>

         <name>dfs.replication</name>

         <value>3</value>

     </property>

     <property>

         <name>dfs.namenode.secondary.http-address</name>

         <value>Master:9001</value>

     </property>

     <property>

     <name>dfs.webhdfs.enabled</name>

     <value>true</value>

     </property>

    7) 配置slaves文件,在其中加入所有从节点主机名,例如:

    x.x.x.x worker1

    x.x.x.x worker2

    ……

    8) 格式化namenode:

    /usr/local/hadoop/bin/hadoop namenode -format

    至此,Hadoop配置过程基本完成。

    1.2.5 Spark的安装部署

    登录Spark官网下载页面(http://spark.apache.org/downloads.html)下载Spark。这里选择最新的Spark 1.5.0版spark-1.5.0-bin-hadoop2.6.tgz(Pre-built for Hadoop2.6 and later)。

    然后解压spark安装包至本地指定目录:

    tar zxvf spark-1.5.0-bin-hadoop2.6.tgz -C /usr/local/

    ln -s spark-1.5.0-bin-hadoop2.6 spark

    下面让我们开始Spark的配置之旅吧。

    1) 打开/etc/profile,末尾加入:

    export SPARK_HOME=/usr/local/spark

    PATH=$PATH:${SPARK_HOME}/bin

    关闭并保存profile,然后命令行执行 source /etc/profile 使配置生效。

    2) 打开/etc/hosts,加入集群中Master及各个Worker节点的ip与hostname配对。

    x.x.x.x Master-name

    x.x.x.x worker1

    x.x.x.x worker2

    x.x.x.x worker3

    ……

    3) 进入/usr/local/spark/conf,在命令行执行:

    cp spark-env.sh.template spark-env.sh

    vi spark-env.sh

    末尾加入:

    export JAVA_HOME=/usr/lib/jvm/java-1.7

    export SCALA_HOME=/usr/local/scala

    export SPARK_MASTER_IP=112.74.197.158<以本机为例>

    export SPARK_WORKER_MEMORY=1g

    保存并退出,执行命令:

    cp slaves.template slaves

    vi slaves

    在其中加入各个Worker节点的hostname。这里以四台机器(master、worker1、worker2、worker3)为例,那么slaves文件内容如下:

    worker1

    worker2

    worker3

    1.2.6 Hadoop与Spark的集群复制

    前面完成了Master主机上Hadoop与Spark的搭建,现在我们将该环境及部分配置文件从Master分发到各个Worker节点上(以笔者环境为例)。在集群环境中,由一台主机向多台主机间的文件传输一般使用pssh工具来完成。为此,在Master上建立一个文件workerlist.txt,其中保存了所有Worker节点的IP,每次文件的分发只需要一行命令即可完成。

    1) 复制JDK环境:

    pssh -h workerlist -r /usr/lib/jvm/java-1.7 /

    2) 复制scala环境:

    pssh -h workerlist -r /usr/local/scala /

    3) 复制Hadoop:

    pssh -h workerlist -r /usr/local/hadoop /

    4) 复制Spark环境:

    pssh -h workerlist -r /usr/local/spark /

    5) 复制系统配置文件:

    pssh -h workerlist /etc/hosts /

    pssh -h workerlist /etc/profile /

    至此,Spark Linux集群环境搭建完毕。

    1.3 Spark 集群试运行

    下面试运行Spark。

    1)在Master主机上,分别启动Hadoop与Spark。

    cd /usr/local/hadoop/sbin/

    ./start-all.sh

    cd /usr/local/spark/sbin

    ./start-all.sh

    2) 检查Master与Worker进程是否在各自节点上启动。在Master主机上,执行命令 jps,如图1-5所示。

     

    图1-5 在Master主机上执行jps命令

    在Worker节点上,以Worker1为例,执行命令jps,如图1-6所示。

    从图1-6中可以清晰地看到,Master进程与Worker及相关进程在各自节点上成功运行,Hadoop与Spark运行正常。

     

    图1-6 在Worker节点上执行jps命令

    3) 通过Spark Web UI查看集群状态。在浏览器中输入Master的IP与端口,打开Spark Web UI,如图1-7所示。

    从图1-7中可以看到,当集群内仅有一个Worker节点时,Spark Web UI显示该节点处于Alive状态,CPU Cores为1,内存为1GB。 此页面会列出集群中所有启动后的Worker节点及应用的信息。

     

    图1-7 Spark Web UI界面

    4) 运行样例。Spark自带了一些样例程序可供试运行。在Spark根目录下,example/src/main文件夹中存放着Scala、Java、Python及用R语言编写的样例,用户可以运行其中的某个样例程序。先拷贝到Spark根目录下,然后执行bin/run-example [class] [params]即可。例如可以在Master主机命令行执行:

    ./run-example SparkPi 10

    然后可以看到该应用的输出,在Spark Web UI上也可以查看应用的状态及其他信息。

    1.4 Intellij IDEA的安装与配置

    Intellij IDE是目前最流行的Spark开发环境。本节主要介绍Intellij开发工具的安装与配置。Intellij不但可以开发Spark应用,还可以作为Spark源代码的阅读器。

    1.4.1 Intellij的安装

    Intellij开发环境依赖JDK、Scala。

    1. JDK的安装

    Intellij IDE需要安装JDK 1.7或更高版本。Open JDK1.7的安装与配置前文中已讲过,这里不再赘述。

    2. Scala的安装

    Scala的安装与配置前文已讲过,此处不再赘述。

    3. Intellij的安装

    登录Intellij官方网站(http://www.jetbrains.com/idea/)下载最新版Intellij linux安装包ideaIC-14.1.5.tar.gz,然后执行如下步骤:

    1)解压: tar zxvf ideaIC-14.1.5.tar.gz -C /usr/

    2)运行: 到解压后的目录执行 ./idea.sh

    3)安装Scala插件:打开“File”→“Settings”→“Plugins”→“Install JetBrain plugin”运行后弹出如图1-8所示的对话框。

    单击右侧Install plugin开始安装Scala插件。

    1.4.2 Intellij的配置

    1)在Intellij IDEA中新建Scala项目,命名为“HelloScala”,如图1-9所示。

    2)选择菜单“File”→“Project Structure”→“Libraries”,单击“+”号,选择

    “java”,定位至前面Spark根目录下的lib目录,选中spark-assembly-1.5.0-hadoop2.6.0.jar,单击OK按钮。

    3)与上一步相同,单击“+”号,选择“scala”,然后定位至前面已安装的scala目录,scala相关库会被自动引用。

     

    图1-8 Scala插件弹出窗口

     

    图1-9 在Intellij IDEA中新建Scala项目

    4) 选择菜单“File”→“Project Structure”→“Platform Settings”→“SDKs”,单击“+”号,选择JDK,定位至JDK安装目录,单击OK按钮。

    至此,Intellij IDEA开发环境配置完毕,用户可以用它开发自己的Spark程序了。

    1.5 Eclipse IDE的安装与配置

    现在介绍如何安装Eclipse。与Intellij IDEA类似,Eclipse环境依赖于JDK与Scala的安装。JDK与Scala的安装前文已经详细讲述过了,在此不再赘述。

    对最初需要为Ecplise选择版本号完全对应的Scala插件才可以新建Scala项目。不过自从有了Scala IDE工具,问题大大简化了。因为Scala IDE中集成的Eclipse已经替我们完成了前面的工作,用户可以直接登录官网(http://scala-ide.org/download/sdk.html)下载安装。

    安装后,进入Scala IDE根目录下的bin目录, 执行 ./eclipse 启动IDE。

    然后选择 “File”→“New”→“Scala Project” 打开项目配置页。

    输入项目名称,如HelloScala, 然后选择已经安装好的JDK版本,单击Finish按钮。接下来就可以进行开发工作了,如图1-10所示。

     

    图1-10 已经创建好的HelloScala项目

    1.6 使用Spark Shell开发运行Spark程序

    Spark Shell是一种学习API的简单途径,也是分析数据集交互的有力工具。

    虽然本章还没涉及Spark的具体技术细节,但从总体上说,Spark弹性数据集RDD有两种创建方式:

    从文件系统输入(如HDFS)。

    从已存在的RDD转换得到新的RDD。

    现在我们从RDD入手,利用Spark Shell简单演示如何书写并运行Spark程序。下面以word count这个经典例子来说明。

    1)启动spark shell: cd 进SPARK_HOME/bin, 执行命令。

    ./spark-shell

    2)进入scala命令行,执行如下命令:

    scala> val file = sc.textFile("hdfs://localhost:50040/hellosparkshell")

    scala> val count = file.flatMap(line => line.split(" ")).map(word => (word, 1)).reduceByKey(_+_)

    scala> count.collect()

    首先从本机上读取文件hellosparkshell,然后解析该文件,最后统计单词及其数量并输出如下:

    15/09/29 16:11:46 INFO spark.SparkContext: Job finished: collect at <console>:17, took 1.624248037 s

    res5: Array[(String, Int)] = Array((hello,12), (spark,12), (shell,12), (this,1), (is,1), (chapter,1), (three,1)

    1.7 本章小结

    本章着重描述了Spark的生态及架构,使读者对Spark的平台体系有初步的了解。进而描述了如何在Linux平台上构建Spark集群,帮助读者构建自己的Spark平台。最后又着重描述了如何搭建Spark开发环境,有助于读者对Spark开发工具进行一定了解,并独立搭建开发环境。

    相关资源:敏捷开发V1.0.pptx
    最新回复(0)