1.软件准备2.基础软件安装 3.安装spark 注:SPARK_MASTER_IP这里填写spark master的IP或者主机名,如果使用的是ip,在指定master调用服务时就只能使用ip,类似spark://192.168.1.39:7077.如果使用的是主机名,那就只能使用主机名了。类似这样spark://主机名:7077.推荐使用主机名,因为就算ip变了也不用老改配置文件。4.在程序中调用spark服务 1.软件准备
我的系统环境为ubuntu 13.10
1.scala-2.9.3.tgz http://www.scala-lang.org/files/archive/scala-2.9.3.tgz
由于spark是依赖scala2.9.3开发的,所以只能安装2.9.3,我试的时候一开始用最新版本的scala2.10.3确实不行。
2.spark-0.8.1-incubating-bin-hadoop2.tgz http://spark.incubator.apache.org/downloads.html
注意spark读取hadoop1和hadoop2的hdfs是不同的,所以下载页面提供了hadoop1和hadoop2两种spark下载,需要按照自己使用的hadoop版本选择一个,而且下载后面已经著名了该版本是prebuilt,所以下载下来后不需要自己编译了。注意:如果选择的版本和你的hadoop版本不一样,spark在读取hdfs数据时会被hadoop的RPC拒绝,因为RPC版本不同。
读取hadoop集群数据,需要将spark所在的节点与hadoop之间的主机名和ip对应关系互相配置到/etc/hosts里面。
3.jdk。
2.基础软件安装
1.首先安装jdk,并且配置环境变量。
2.安装scala,配置scala环境变量。
3.配置无密码的ssh登录,和hadoop一样。
3.安装spark
首先解压spark-0.8.1-incubating-bin-hadoop2.tgz
1
tar
zxvf spark-0.8.1-incubating-bin-hadoop2.tgz
用mv命令修改解压后的文件名为spark-0.8.1
1
mv
spark-0.8.1-incubating-bin-hadoop2 spark-0.8.1
配置spark环境变量到path,
1
export
JAVA_HOME=/usr/lib/jdk7
2
export
JRE_HOME=${JAVA_HOME}/jre
3
export
CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
4
export
SCALA_HOME=/home/zarchary/software/scala-2.9.3
5
export
SPARK_HOME=/home/zarchary/software/spark-0.8.1
6
PATH=$PATH:$JAVA_HOME/bin:${SCALA_HOME}/bin:${SPARK_HOME}/bin
7
export
PATH
修改完成别忘了运行source让配置生效
然后进入安装的${SPARK_HOME}/conf下,按照模板创建spark-env.sh和log4j.properties
1
cp
spark-
env
.sh.template spark-
env
.sh
2
cp
log4j.properties.template log4j.properties
修改spark-env.sh文件,加入spark必要的配置
1
export
SCALA_HOME=/home/zarchary/software/scala-2.9.3
2
export
JAVA_HOME=/usr/lib/jdk7
3
export
SPARK_HOME=/home/zarchary/software/spark-0.8.1
为什么要配置spark-env.sh呢,因为spark在每次初始化时会先运行spark-env.sh,然后就会生成它需要的path,可以找到它需要的变量值。当然,spark-env.sh必须是可执行的。
现在local模式已经安装完成。可以在${SPARK_HOME}下运行测试
1
./run-example org.apache.spark.examples.SparkPi
local
如果日志里面有Pi is roughly 3.1468说明成功了。
如果要安装集群模式的spark,修改继续修改conf/spark-env.sh,添加
1
export
SPARK_MASTER_IP=masterIP
注:SPARK_MASTER_IP这里填写spark master的IP或者主机名,如果使用的是ip,在指定master调用服务时就只能使用ip,类似spark://192.168.1.39:7077.如果使用的是主机名,那就只能使用主机名了。类似这样spark://主机名:7077.推荐使用主机名,因为就算ip变了也不用老改配置文件。
主节点默认使用7077端口对外提供服务。
然后在修改${SPARK_HOME}/conf下的slaves文件,添加上所有工作节点的主机名或者ip,注意是一行一个,这些工作节点服务器也需要配置ssh无密码登录,并加入master的公匙到工作节点。当然可以不配置,但是每次启动都输入密码很纠结。
然后使用scp复制spark文件到其他工作节点。
1
scp
-r ${SPARK_HOME} hadoop@主机名:要复制到的目录
然后就可以在master主机${SPARK_HOME}/bin目录下运行start-all.sh启动集群。然后访问http://masterIP:8080查看节点情况。默认是8080端口,如果不想使用8080端口,需要在spark-env.sh里面配置SPARK_MASTER_WEBUI_PORT来指定端口号。更多配置见http://spark.incubator.apache.org/docs/latest/spark-standalone.html
然后就可以在{SPARK_HOME}下指定master来运行例子了
1
./run-example org.apache.spark.examples.SparkPi spark://masterIP:7077
注意:spark://后面的masterIP必须和你在spark-env.sh里面配置的SPARK_MASTER_IP一致
然后查看http://masterIP:8080就可以看到任务运行信息:
现在集群模式也安装完毕了。
4.在程序中调用spark服务
安装完毕后,如果想在程序中或者说eclipse/idea之类的IDE中远程调用服务。需要做下面配置:
1.首先必须把开发的电脑的IP和主机名配置到spark所在所有节点的/etc/hosts里面,否则提交不成功。
2.将${SPARK_HOME}/assembly/target/scala-2.9.3/spark-assembly_2.9.3-0.8.1-incubating-hadoop2.2.0.jar放入项目classpath,当然如果你下载的版本不一样可能和我的文件名不一样。
注意:只需要这一个文件,其他的spark的包你项目不依赖不需要加入。这个jar文件已经包含了自己的依赖!
3.编写程序
为了方便,我只是把spark 例子里面的JAVAWordCount改成了WordCount.
01
package
com.zachary;
02
03
04
import
org.apache.spark.api.java.JavaPairRDD;
05
import
org.apache.spark.api.java.JavaRDD;
06
import
org.apache.spark.api.java.JavaSparkContext;
07
import
org.apache.spark.api.java.function.FlatMapFunction;
08
import
org.apache.spark.api.java.function.Function2;
09
import
org.apache.spark.api.java.function.PairFunction;
10
import
scala.Tuple2;
11
12
import
java.util.Arrays;
13
import
java.util.List;
14
15
/**
16
* Created with IntelliJ IDEA.
17
* User: zarchary
18
* Date: 14-1-19
19
* Time: 下午6:23
20
* To change this template use File | Settings | File Templates.
21
*/
22
public
final
class
WordCount {
23
24
public
static
void
main(String[] args)
throws
Exception { <span></span>
01
JavaSparkContext ctx =
new
JavaSparkContext(
"spark://masterIP:7077"
,
"WordCount"
,
02
"/home/zarchary/software/spark-0.8.1"
,
03
"/home/zarchary/repo/com/zachary/module/0.0.1/module-0.0.1.jar"
);
04
JavaRDD<String> lines = ctx.textFile(
"/home/zarchary/software/nie.txt"
,
1
);
05
06
JavaRDD<String> words = lines.flatMap(
new
FlatMapFunction<String, String>() {
07
public
Iterable<String> call(String s) {
08
return
Arrays.asList(s.splihttp:
09
}
10
});
11
System.out.println(
"====words:"
+words.count());
12
13
JavaPairRDD<String, Integer> ones = words.map(
new
PairFunction<String, String, Integer>() {
14
public
Tuple2<String, Integer> call(String s) {
15
return
new
Tuple2<String, Integer>(s,
1
);
16
}
17
});
18
19
JavaPairRDD<String, Integer> counts = ones.reduceByKey(
new
Function2<Integer, Integer, Integer>() {
20
public
Integer call(Integer i1, Integer i2) {
21
return
i1 + i2;
22
}
23
});
24
System.out.println(
"====结果:"
+counts.count());
25
26
27
28
29
30
31
System.exit(
0
);
32
}
33
34
}
/home/zarchary/repo/com/zachary/module/0.0.1/module-0.0.1.jar为我项目打包后的存放路径。
JavaSparkContext初始化需要四个参数。分别为:
1.matser地址
2.给任务起得名字,类似hadoop jobname
3.集群上spark的安装目录,也就是配置里面的,SPARK_HOME
4.你的项目的打的jar包和spark里面没有的包,运行时会被提交到集群,所以jar包必须和项目独立。这里指定的是jar路径。(我用的是maven 的install插件打包,这里是我的maven仓库jar存放路径)
ctx.textFile("/home/zarchary/software/nie.txt", 1);里面第一个参数是要计算的文件的路径,如果是想用hdfs的数据文件,可以也称类似hdfs://user/hadoop/nie.txt之类。第二个参数是分割数。可以不要第二个参数。
然后就可以运行了。运行后再查看http://masterIP:8080,可以看到刚才提交的任务:
如果想看一下你的任务提交时都提交了什么和正在运行到哪个阶段,可以在提交任务后查看http://yourIP:4040查看任务详情,spark提交任务后都会在本机上启动一个4040的端口,用户可以在此查看任务详情,但是任务运行结束后就会关闭该端口。