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

来源:互联网 发布:mysql从零开始学 编辑:程序博客网 时间:2024/05/21 09:36
  • 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

    1tar zxvf spark-0.8.1-incubating-bin-hadoop2.tgz
    用mv命令修改解压后的文件名为spark-0.8.1
    1mv spark-0.8.1-incubating-bin-hadoop2 spark-0.8.1
    配置spark环境变量到path,
    1sudo vim /etc/profile
    1export JAVA_HOME=/usr/lib/jdk7
    2export JRE_HOME=${JAVA_HOME}/jre
    3export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
    4export SCALA_HOME=/home/zarchary/software/scala-2.9.3
    5export SPARK_HOME=/home/zarchary/software/spark-0.8.1
    6PATH=$PATH:$JAVA_HOME/bin:${SCALA_HOME}/bin:${SPARK_HOME}/bin
    7export PATH

    修改完成别忘了运行source让配置生效


    1source /etc/profile


    然后进入安装的${SPARK_HOME}/conf下,按照模板创建spark-env.sh和log4j.properties 

    1cp spark-env.sh.template spark-env.sh
    2cp log4j.properties.template  log4j.properties

    修改spark-env.sh文件,加入spark必要的配置

    1vim spark-env.sh
    1export SCALA_HOME=/home/zarchary/software/scala-2.9.3
    2export JAVA_HOME=/usr/lib/jdk7
    3export 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,添加

    1export  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文件到其他工作节点。

    1scp -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.

    01package com.zachary;
    02 
    03 
    04import org.apache.spark.api.java.JavaPairRDD;
    05import org.apache.spark.api.java.JavaRDD;
    06import org.apache.spark.api.java.JavaSparkContext;
    07import org.apache.spark.api.java.function.FlatMapFunction;
    08import org.apache.spark.api.java.function.Function2;
    09import org.apache.spark.api.java.function.PairFunction;
    10import scala.Tuple2;
    11 
    12import java.util.Arrays;
    13import 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 */
    22public final class WordCount {
    23 
    24public static void main(String[] args) throws Exception { <span></span>
    01JavaSparkContext 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的端口,用户可以在此查看任务详情,但是任务运行结束后就会关闭该端口。

    0 0
    原创粉丝点击