分享

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

问题导读
1、怎样部署在程序中调用spark服务的环境?
2、在程序中IDE中远程调用服务,需要做哪些配置?
3、JavaSparkContext初始化需要哪四个参数?





摘要
最近开始接触spark,发现网上很多例子都已经过期,而spark各个版本提供的示例程序有些也不一样,包路径也有很多变化。所以走了很多弯路,借助官方文档和查看spark源码和脚本文件,终于顺利的理解了spark的搭建。 本文并不是详细的spark完全安装教程,只是把我觉得重要或者我走了弯路的,关于spark的详细解释,其他基础的配置一笔带过,详细可问谷老师 www.google.com
spark idea eclipse 远程调用 安装

目录
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. sudo vim /etc/profile
  2. export JAVA_HOME=/usr/lib/jdk7
  3. export JRE_HOME=${JAVA_HOME}/jre
  4. export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
  5. export SCALA_HOME=/home/zarchary/software/scala-2.9.3
  6. export SPARK_HOME=/home/zarchary/software/spark-0.8.1
  7. PATH=$PATH:$JAVA_HOME/bin:${SCALA_HOME}/bin:${SPARK_HOME}/bin
  8. 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
  2. export SCALA_HOME=/home/zarchary/software/scala-2.9.3
  3. export JAVA_HOME=/usr/lib/jdk7
  4. 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.or ... ark-standalone.html
1.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就可以看到任务运行信息:
1.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.
  1. package com.zachary;
  2. import org.apache.spark.api.java.JavaPairRDD;
  3. import org.apache.spark.api.java.JavaRDD;
  4. import org.apache.spark.api.java.JavaSparkContext;
  5. import org.apache.spark.api.java.function.FlatMapFunction;
  6. import org.apache.spark.api.java.function.Function2;
  7. import org.apache.spark.api.java.function.PairFunction;
  8. import scala.Tuple2;
  9. import java.util.Arrays;
  10. import java.util.List;
  11. /**
  12. * Created with IntelliJ IDEA.
  13. * User: zarchary
  14. * Date: 14-1-19
  15. * Time: 下午6:23
  16. * To change this template use File | Settings | File Templates.
  17. */
  18. public final class WordCount {
  19. public static void main(String[] args) throws Exception { <span></span>
  20. JavaSparkContext ctx = new JavaSparkContext("spark://masterIP:7077", "WordCount",
  21.             "/home/zarchary/software/spark-0.8.1",
  22.             "/home/zarchary/repo/com/zachary/module/0.0.1/module-0.0.1.jar");
  23.     JavaRDD<String> lines = ctx.textFile("/home/zarchary/software/nie.txt", 1);
  24.     JavaRDD<String> words = lines.flatMap(new FlatMapFunction<String, String>() {
  25.         public Iterable<String> call(String s) {
  26.             return Arrays.asList(s.splihttp://masterIP:8080t(" "));
  27.         }
  28.     });
  29.     System.out.println("====words:"+words.count());
  30.     JavaPairRDD<String, Integer> ones = words.map(new PairFunction<String, String, Integer>() {
  31.         public Tuple2<String, Integer> call(String s) {
  32.             return new Tuple2<String, Integer>(s, 1);
  33.         }
  34.     });
  35.     JavaPairRDD<String, Integer> counts = ones.reduceByKey(new Function2<Integer, Integer, Integer>() {
  36.         public Integer call(Integer i1, Integer i2) {
  37.             return i1 + i2;
  38.         }
  39.     });
  40.     System.out.println("====结果:"+counts.count());
  41. //    List<Tuple2<String, Integer>> output = counts.collect();
  42. //    for (Tuple2 tuple : output) {
  43. //        System.out.println(tuple._1 + ": " + tuple._2);
  44. //    }
  45.     System.exit(0);
  46. }
  47.         }
复制代码

/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,可以看到刚才提交的任务:
1.png



如果想看一下你的任务提交时都提交了什么和正在运行到哪个阶段,可以在提交任务后查看http://yourIP:4040查看任务详情,spark提交任务后都会在本机上启动一个4040的端口,用户可以在此查看任务详情,但是任务运行结束后就会关闭该端口。

介绍完毕,希望可以帮助到你。


已有(4)人评论

跳转到指定楼层
lyman825726 发表于 2014-8-24 12:16:27
挣积分,40积分才能看到密码
回复

使用道具 举报

刚果 发表于 2015-11-24 15:31:01
奇怪,我开发项目,代码里还添加本项目开发完后的jar包???死循环啊
回复

使用道具 举报

llp 发表于 2015-11-25 09:51:17
运行SparkPi,在http://master:8080界面没有看到任务提交的相关信息  ,是不是意味着spark没有搭建成功?  请教各位
回复

使用道具 举报

chyeers 发表于 2016-1-25 16:24:30
请教下,spark通过SSH联通master和worker,都是使用的默认SSH端口22,但是安装SSH的时候通常会更改默认端口22,那这样,spark能自定义SSH端口么
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条