Spark安装启动 and 在程序中调用spark服务

38 篇文章 0 订阅

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 sudo vim /etc/profile
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让配置生效


1 source /etc/profile


然后进入安装的${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 vim spark-env.sh
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://masterIP:8080t(" "));
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 //    List<Tuple2<String, Integer>> output = counts.collect();
28 //    for (Tuple2 tuple : output) {
29 //        System.out.println(tuple._1 + ": " + tuple._2);
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的端口,用户可以在此查看任务详情,但是任务运行结束后就会关闭该端口。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值