Spark作为一种通用且高性能的计算框架,不仅在性能上相对于hadoop mapreduce有了很大的提升;在易用性上也运超hadoop, 不只提供了map/reduce计算接口,还提供了大量其他实用的接口,使得编写分布式程序更加迅速高效。
Spark目前提供了Standalone/Yarn/Mesos几种安装模式,其中Standalone模式最为方便快捷。在这种模式下,Spark使用自由资源管理框架而不是借助Yarn或者Mesos。
下面我们来看看如果快速安装Spark Standalone.
1. 假设我们有4台机器,都是centos系统,上面已经安装了jdk和hadoop, 其中一台用做Master, 另外三台用作Worker。相关系统版本如下:
- Centos版本: 6.4, 假设安装在/opt/java
- dk版本:jdk1.7.0_45
- hadoop版本: CDH 5(hadoop 2.3)
2. 下载对应的spark prebuild版本到Master机器,假设我们放在/home/spark目录下。(文件有200M+,下载比较慢)。
wget http://d3kbcqa49mib13.cloudfront.net/spark-1.3.0-bin-hadoop2.3.tgz
注意, 下载链接选择的Direct Download,在Mirror模式直接wget貌似有点问题。
3. 在/home/spark/目录下解压spark-1.3.0-bin-hadoop2.3.tgz文件
tar xzvf spark-1.3.0-bin-hadoop2.3.tgz
4. 修改配置,到spark-1.3.0-bin-hadoop2.3/conf目录下,使用template创建配置文件(这里只考虑了最简配置)
cp spark-env.sh.template spark-env.sh
cp slaves.template slaves
- 在spark-env.sh中设置JAVA环境变量(不设置这个在启动spark集群的时候可能会报错 JAVA_HOME is not set):export JAVA_HOME=/opt/java
- 在slaves中设置三台worker机器的IP:
# A Spark Worker will be started on each of the machines listed below.
10.71.48.113
10.71.48.114
10.71.48.115
5. 将修改好配置的目录spark-1.3.0-bin-hadoop2.3打包成spark-1.3.0-bin-hadoop2.3.tgz
tar czvf spark-1.3.0-bin-hadoop2.3.tgz spark-1.3.0-bin-hadoop2.3
6. 将压缩包从master拷贝到三台worker机器的/home/spark目录并解压,可以使用下面的脚本批量操作:
#!/bin/bash
if [ $# -ne 0 ]
then
echo "Usage: $0"
exit 1
fi
username=root
dist_dir=/home/spark/
filename=spark-1.3.0-bin-hadoop2.3
ips=(10.71.48.113 10.71.48.114 10.71.48.115)
for ip in ${ips[@]}
do
echo "process ${ip} at ${dist_dir}"
ssh ${username}@${ip} "mkdir -p ${dist_dir}" 0</dev/null
scp ../${filename}.tgz ${username}@${ip}:${dist_dir}
ssh ${username}@${ip} "cd ${dist_dir} && tar xzvf ${filename}.tgz" 0</dev/null
done
exit 0
7. 到master机器的/home/spark/spark-1.3.0-bin-hadoop2.3
- 执行
./sbin/start-all.sh
启动集群。 - 执行
./sbin/stop-all.sh
关闭集群
8. 安装好之后,可以通过http://master-ip:8080/网页可视化查看集群状态。
9. 测试spark程序,有两种模式,以python语言为例(spark另外支持java/scala):
- shell交互模式, 执行
./bin/pyspark
进入交互执行模式 ./bin/spark-submit --master spark://nj106.vl:7077 test.py
可以提交test.py程序到集群执行。[不设置master,默认是local[*]模式]
#!/usr/bin/python
#coding=utf8
import sys;
from pyspark import SparkContext;
if __name__ == "__main__":
sc = SparkContext(appName="my-spark-test"); #创建SparkContext
file = sc.textFile("hdfs://10.71.48.106/data/fuqingchuan/dat.10W.txt"); #读取hadoop文件
result = file.flatMap(lambda line : line.split("\t")).map(lambda word : (word, 1)).reduceByKey(lambda a, b: (a + b)); #word count
first_line = result.first(); #去RDD中的第一行
total_num = result.count(); #统计行数
print first_line;
print total_num;
result.saveAsTextFile("hdfs://10.71.48.106/data/fuqingchuan/spark-test/"); #保存结果数据到集群
sys.exit(0);
【参考】http://spark.apache.org/docs/latest/spark-standalone.html