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 |
修改完成别忘了运行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
![](https://i-blog.csdnimg.cn/blog_migrate/e019ad16b1f7d0cbd4e0948c13ec03c6.png)
然后就可以在{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就可以看到任务运行信息:
![](http://static.oschina.net/uploads/space/2014/0125/173416_SYjt_132722.png)
现在集群模式也安装完毕了。
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.
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; |
12 | import java.util.Arrays; |
13 | import java.util.List; |
16 | * Created with IntelliJ IDEA. |
20 | * To change this template use File | Settings | File Templates. |
22 | public final class WordCount { |
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 ); |
06 | JavaRDD<String> words = lines.flatMap( new FlatMapFunction<String, String>() { |
07 | public Iterable<String> call(String s) { |
08 | return Arrays.asList(s.splihttp: |
11 | System.out.println( "====words:" +words.count()); |
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 ); |
19 | JavaPairRDD<String, Integer> counts = ones.reduceByKey( new Function2<Integer, Integer, Integer>() { |
20 | public Integer call(Integer i1, Integer i2) { |
24 | System.out.println( "====结果:" +counts.count()); |
/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://static.oschina.net/uploads/space/2014/0125/175240_aUVN_132722.png)
如果想看一下你的任务提交时都提交了什么和正在运行到哪个阶段,可以在提交任务后查看http://yourIP:4040查看任务详情,spark提交任务后都会在本机上启动一个4040的端口,用户可以在此查看任务详情,但是任务运行结束后就会关闭该端口。