Spark是一个快速、通用的计算集群框架,它的内核使用Scala语言编写,它提供了Scala、Java和Python编程语言high-level API,使用这些API能够非常容易地开发并行处理的应用程序。
下面,我们通过搭建Spark集群计算环境,并进行简单地验证,来体验一下使用Spark计算的特点。无论从安装运行环境还是从编写处理程序(用Scala,Spark默认提供的Shell环境可以直接输入Scala代码进行数据处理),我们都会觉得比Hadoop MapReduce计算框架要简单得多,而且,Spark可以很好地与HDFS进行交互(从HDFS读取数据,以及写数据到HDFS中)。
安装配置
- 下载安装配置Scala
下载地址:http://www.scala-lang.org/files/archive/scala-2.10.3.tgz
tar -zxvf scala-2.10.3
mv scala-2.10.3 scala
- 在/etc/profile 中增加环境变量SCALA_HOME,并使之生效:
export SCALA_HOME=/usr/local/scala
export PATH=.:$PATH:$SCALA_HOME/bin
- 将scala的程序文件和配置文件拷贝分发到从节点机器上:
scp -r scala slaves1:/usr/local/
scp -r scala slaves2:/usr/local/
-
下载安装配置Spark
-
我们首先在主节点master上配置Spark程序,然后将配置好的程序文件复制分发到集群的各个从结点上。下载解压缩:
下载地址:http://d3kbcqa49mib13.cloudfront.net/spark-0.9.0-incubating-bin-hadoop1.tgz
tar -zxvf spark-0.9.0-incubating-bin-hadoop1.tgz
-
在/etc/profile 中增加环境变量SPARK_HOME,并使之生效:
export SPARK_HOME=/usr/local/spark
export PATH=.:$PATH:$SCALA_HOME/bin:$SPARK_HOEM/bin
-
在master上配置Spark,修改spark-env.sh配置文件:
cd /usr/local/spark
cp spark-env.sh.template spark-env.sh
在该脚本文件中,同时将SCALA_HOME和JAVA_HOEM配置为Unix环境下实际指向路径,例如:
SCALA_HOME=/usr/local/scala
JAVA_HOEM=/usr/local/jdk
-
修改conf/slaves文件,将计算节点的主机名添加到该文件,一行一个,例如:
slaves1
salves2
-
最后,将Spark的程序文件和配置文件拷贝分发到从节点机器上:
scp -r spark slaves1:/usr/local/
scp -r spark slaves2:/usr/local/
-
启动Spark集群
我们会使用HDFS集群上存储的数据作为计算的输入,所以首先要把Hadoop集群安装配置好,并成功启动,我这里使用的是Hadoop 1.2.1版本。启动Spark计算集群非常简单,执行如下命令即可:
cd /usr/local/spark
sbin/start-all.sh
可以看到,在master上启动了一个名称为Master的进程,在slaves1和slaves2上启动了一个名称为Worker的进程,如下所示,我这里也启动了Hadoop集群:
主节点msater上:
从节点slaves1上:
从节点slaves2上:
各个进程是否启动成功,也可以查看日志来诊断,例如:
tail -100f $SPARK_HOME/logs/spark-root-org.apache.spark.deploy.worker.Worker-1-slaves1.out
tail -100f $SPARK_HOME/logs/spark-root-org.apache.spark.deploy.worker.Worker-1-slaves2.out
-
Spark集群计算验证
我们使用我的网站的访问日志文件来演示,示例如下:
统计该文件里面IP地址出现频率,来验证Spark集群能够正常计算。另外,我们需要从HDFS中读取这个日志文件,然后统计IP地址频率,最后将结果再保存到HDFS中的 指定目录。
首先,需要启动用来提交计算任务的Spark Shell:
sbin/spark-shell
在Spark Shell上只能使用Scala语言写代码来运行。
然后,执行统计IP地址频率,在Spark Shell中执行如下代码来实现:
var file=sc.textFile("hdfs://master:9000/apachelog/ida_20141022_001.log")
val result = file.flatMap(line => line.split("\\s+.*")).map(word => (word, 1)).reduceByKey((a, b) => a + b)
-
最后,我们想要将结果保存到HDFS中,只要输入如下代码:
result.saveAsTextFile("hdfs://master:9000/apachelog/ida_20141022_001.log.result")
-
查看HDFS上的结果数据:
-
hadoop fs -cat /apachelog/ida_20141022_001.log_result/part-00000
(42.156.250.103,2)
(14.110.234.12,98)
(123.147.245.120,117)
(14.152.68.149,1)
(125.84.60.71,20)
(223.85.132.24,3)
(117.159.28.22,21)