spark 1.6.0 安装与配置(spark1.6.0、Ubuntu14.04、hadoop2.6.0、scala2.10.6、jdk1.7)

前几天刚着实研究spark,spark安装与配置是入门的关键,本人也是根据网上各位大神的教程,尝试配置,发现版本对应最为关键。现将自己的安装与配置过程介绍如下,如有兴趣的同学可以尝试安装。所谓工欲善其事必先利其器,下面咱们将进入安装教程。

2016-12-06  10:17:07

环境

本教程使用了Ubuntu 14.04 64位作为系统环境,用到的安装程序有:jdk 1.7、spark-1.6.0 、scala-2.10.6、scala-SDK-4.4.1-vfinal-2.11-linux.gtk.x86_64(集成了scala的 eclipse)、hadoop 2.6.0。下面将一一介绍各个程序的安装过程。

×××注意

1、 文中和截图中会出现hadoop字样,这是由于作者在之前装过hadoop,并以hadoop为用户名登陆了电脑,比如/home/hadoop/下载, 这中间的hadoop就是hadoop用户家目录下的下载文件夹,你们的应该是/home/用户名(你们自己设置的)/Downloads(中文版的是下 载)

2、linux中用到的解压方法大部分都是

      tar -zxvf 文件名(适用于以.tar.gz为结尾的压缩文件)

      unzip 文件名     (适用于以.zip为结尾的压缩文件)

3、移动文件或文件夹时,如遇到权限不够的问题

    可将目标文件夹权限更改为777:  

chmod -R 777 目标文件夹

 但是在更改过后尽量将权限再改到755(为了安全):

chmod -R 755 目标文件夹

 4、如果要用到hdfs,请安装hadoop,我的hadoop版本是2.6.0,参照 给力星 的文章(写的特别好):

转载:http://www.powerxing.com/install-hadoop/

 

一、java环境安装(如果已经安装好java环境的同学可以跳过这一步骤)

java安装的方法我是参照给力星的文章(转载 http://www.powerxing.com/install-hadoop/

因为后续可能需要更改一些配置文件,所有我们安装一下vim(也可以用gedit),首先按ctrl+alt+t打开终端窗口,输入:

sudo apt-get install vim

安装软件时需要确认,在提示出输入y即可

下面首先是安装java环境,通过命令直接安装

sudo apt-get install openjdk-7-jre openjdk-7-jdk
JRE和JDK的区别

JRE(Java Runtime Environment,Java运行环境),是运行 Java 所需的环境。JDK(Java Development Kit,Java软件开发工具包)即包括 JRE,还包括开发 Java 程序所需的工具和类库。

安装好 OpenJDK 后,需要找到相应的安装路径,这个路径是用于配置 JAVA_HOME 环境变量的。执行如下命令:

    dpkg -L openjdk-7-jdk | grep '/bin/javac' 

该 命令会输出一个路径,除去路径末尾的 “/bin/javac”,剩下的就是正确的路径了。如输出路径为 /usr/lib/jvm/java-7-openjdk-amd64/bin/javac,则我们需要的路径为 /usr/lib/jvm/java-7-openjdk-amd64。

接着配置 JAVA_HOME 环境变量,为方便,我们在 ~/.bashrc 中进行设置(扩展阅读: 设置Linux环境变量的方法和区别):

vim ~/.bashrc
在文件最前面添加如下单独一行(注意 = 号前后不能有空格),将“JDK安装路径”改为上述命令得到的路径,并保存:
export JAVA_HOME=JDK安装路径 

如下图所示(该文件原本可能不存在,内容为空,这不影响):

配置JAVA_HOME变量

接着还需要让该环境变量生效,执行如下代码:

source ~/.bashrc # 使变量设置生效
设置好后我们来检验一下是否设置正确:
echo $JAVA_HOME                       # 检验变量值

java -version

$JAVA_HOME/bin/java -version     # 与直接执行 java -version 一样
如果设置正确的话,$JAVA_HOME/bin/java -version 会输出 java 的版本信息,且和 java -version 的输出结果一样。

成功配置JAVA_HOME变量

这样,spark 所需的 Java 运行环境就安装好了。

 

二、scala环境安装

Scala是一门多范式的编程语言,一种类似java的编程语言 ,设计初衷是实现可伸缩的语言,并集成面向对象编程函数式编程的各种特性。

scala是spark的原生语言,各种新特性肯定是scala最先支持的。

Scala两大特点,正好匹配Spark的需求:

  • 基于JVM,和Hadoop、YARN等集成比较容易
  • 函数式编程语言,从对外API到对内实现上都更容易统一范式

 

首先下载scala2.10.6版本 下载地址为:http://www.scala-lang.org/download/2.10.6.html,linux下下载的文件一般会保存在  /下载 文件夹下 。下载的文件为:scala-2.10.6.tgz。将其安装在/usr/local/文件夹下,在命令行输入:

tar -zxvf scala-2.10.6.tgz  #解压tgz文件

将文件夹移到/usr/local下

mv /home/local/scala-2.10.6 /usr/local/scala   #移动scala-2.10.6文件夹,并重命名为scala

编辑 /etc/profile文件 增加SCALA_HOME环境变量配置,在/etc/profile中配置文件(用sudo vim /etc/profile或是sudo gedit /etc/profile打开)

sudo vim /etc/profile

 按键盘上的 i 键,在文件最后添加

#Seeting Scala Scala环境变量   
export SCALA_HOME=/usr/local/scala            
export PATH=${SCALA_HOME}/bin:$PATH

按键盘上的 Esc 键,然后按 Shift 键,输入wq,回车键退出配置文件。

接下来立即生效 /etc/profile ,命令行中输入:

 source /etc/profile

验证scala

scala -version

编写简单scala程序,在命令行输入scala,并输入println("hello,Scala"),查看输出结果,是不是很类似java

到此为止scala就安装成功了!下面进入今天的主角spark的安装阶段。

 

三、spark安装与配置

首先下载spark:http://spark.apache.org/downloads.html,选择1.6.0版本,此版本对应hadoop2.6.0(如果需要安装hadoop的同学可以参照给力星的文章,文章开头有介绍)

下载结束后会在下载文件夹看到文件:spark-1.6.0-bin-hadoop2.6.tgz

在命令行终端,输入:

cd /home/hadoop/下载                      #进入下载文件夹
tar -zxvf spark-1.6.0-bin-hadoop2.6.tgz #解压文件
mv /home/hadoop/下载/spark-1.6.0-bin-hadoop2.6 /usr/local/spark #移动spark-1.6.0文件夹,并重命名为spark

下面配置环境变量

编辑 /etc/profile文件 增加SCALA_HOME环境变量配置,在/etc/profile中配置文件(用sudo vim /etc/profile或是sudo gedit /etc/profile打开)

sudo vim /etc/profile

按键盘上的 i 键,在文件最后添加

#setting Spark Spark环境变量
export SPARK_HOME=/usr/local/spark
export PATH=$PATH:${SPARK_HOME}/bin

按键盘上的 Esc 键,然后按 Shift 加:,输入wq,回车键退出配置文件。

接下来使配置文件生效,命令行终端输入:

source /etc/profile

    spark就已经安装好了,下面测试一下:
    在命令行输入:

/usr/local/spark/bin/spark-shell 

    进入bin目录:

cd /usr/local/spark/bin

 接下来输入:

./run-example SparkPi 10     #(迭代次数) 计算π的值

  这就是迭代10次计算的结果:

 

开启spark(scala),在命令行输入:

cd /usr/local/spark/bin
./spark-shell
#把输入文件加载进RDD:
val textFile = sc.textFile("YOUR_INPUT_FILE")    
#MapReduce操作,以work为key,1为value:
val wordCounts = textFile.flatMap(line => line.split(" ")).map(word => (word, 1)).reduceByKey((a, b) => a + b)     
#查看每个单词出现的次数
wordCounts.collect()

结果展示:

至此spark的安装环境已经结束。但是平常咱们习惯用eclipse等集成开发环境来进行实验与开发,所以下面我将介绍如果用eclipse进行spark程序开发。

 

四、eclipse上spark程序开发

还是首先进行下载,这时候下载的是继承了scala编程环境的eclipse。

我们下载是http://scala-ide.org/download/sdk.html:选择linux 64位

 

下载完成后会在下载文件夹看到:scala-SDK-4.4.1-vfinal-2.11-linux.gtk.x86_64.tar.gz

对其解压:

cd /home/hadoop/下载
tar -zxvf  scala-SDK-4.4.1-vfinal-2.11-linux.gtk.x86_64.tar.gz

将其移动到/opt文件夹下,opt文件夹通常用来安装大型软件(其实你愿意放哪就放哪,只要不放在/tmp临时文件夹下就行)

mv /home/hadoop/eclipse /opt

现在打开eclipse:

cd /opt/eclipse   
./eclipse

新建一个scala project,并创建包名为com.dt.spark的package名

然后右键新建,选择other,输入scala,点击scala object

通常Scala library container默认是2.11.8,我们需要改成2.10版本的,解决办法:

选中Scala library container,右键->Properties->Latest 2.10 bundle(dynamic),点击OK:

 

然后新建一个名为WordCount的scala文件

这时候需要导入spark的jar包:spark-assembly-1.6.0-hadoop2.6.0.jar,编写程序需要调用的包都在这个jar包里,它大约180多MB,spark 2.0 及以上将其拆分成若干个小jar包了。

它在文件夹 /usr/local/spark/lib下。

右键Build Path->Configure Build Path->Add External Jars->选择/usr/local/spark/lib下的spark-assembly-1.6.0-hadoop2.6.0.jar。

双击wordCount.scala,编写代码:

package com.dt.spark

import org.apache.spark.SparkConf
import org.apache.spark.SparkContext

/**
 * 使用Scala开发本地测试的Spark WordCount程序
 * 程序注释内容来自王家林的大数据视频
 */

object WordCount {
  def main(args : Array[String]){
    /**
       * 第1步:创建Spark的配置对象SparkConf,设置Spark程序的运行时的配置信息,
       * 例如说通过setMaster来设置程序要链接的Spark集群的Master的URL,如果设置
       * 为local,则代表Spark程序在本地运行,特别适合于机器配置条件非常差(例如
       * 只有1G的内存)的初学者       * 
       */
    val conf = new SparkConf()//创建SparkConf对象
    conf.setAppName("Wow,My First Spark Programe")//设置应用程序的名称,在程序运行的监控界面可以看到名称
    conf.setMaster("local")//此时,程序在本地运行,不需要安装Spark集群
    /**
       * 第2步:创建SparkContext对象
       * SparkContext是Spark程序所有功能的唯一入口,无论是采用Scala、Java、Python、R等都必须有一个SparkContext
       * SparkContext核心作用:初始化Spark应用程序运行所需要的核心组件,包括DAGScheduler、TaskScheduler、SchedulerBackend
       * 同时还会负责Spark程序往Master注册程序等
       * SparkContext是整个Spark应用程序中最为至关重要的一个对象
       */
    val sc = new SparkContext(conf)//创建SparkContext对象,通过传入SparkConf实例来定制Spark运行的具体参数和配置信息
     /**
       * 第3步:根据具体的数据来源(HDFS、HBase、Local FS、DB、S3等)通过SparkContext来创建RDD
       * RDD的创建基本有三种方式:根据外部的数据来源(例如HDFS)、根据Scala集合、由其它的RDD操作
       * 数据会被RDD划分成为一系列的Partitions,分配到每个Partition的数据属于一个Task的处理范畴
       */
    val lines = sc.textFile("/home/hadoop/input/input",1)//读取本地文件并设置为一个Partion
     /**
       * 第4步:对初始的RDD进行Transformation级别的处理,例如map、filter等高阶函数等的编程,来进行具体的数据计算
       *    第4.1步:讲每一行的字符串拆分成单个的单词
       */

    val words = lines.flatMap{line => line.split("    ")}//对每一行的字符串进行单词拆分并把所有行的拆分结果通过flat合并成为一个大的单词集合

     /**
       * 第4步:对初始的RDD进行Transformation级别的处理,例如map、filter等高阶函数等的编程,来进行具体的数据计算
       *    第4.2步:在单词拆分的基础上对每个单词实例计数为1,也就是word => (word, 1)
       */

    val pairs = words.map{word => (word,1)}
     /**
       * 第4步:对初始的RDD进行Transformation级别的处理,例如map、filter等高阶函数等的编程,来进行具体的数据计算
       *    第4.3步:在每个单词实例计数为1基础之上统计每个单词在文件中出现的总次数
       */
    val wordCounts = pairs.reduceByKey(_+_)//对相同的Key,进行Value的累计(包括Local和Reducer级别同时Reduce)
    wordCounts.foreach(wordNumberPair => println(wordNumberPair._1 + " : " +wordNumberPair._2))//在命令行中打印该结果  
    wordCounts.repartition(1).saveAsTextFile("/home/hadoop/output/");//结果保存到本地    
    sc.stop()//记得关闭创建的SparkContext对象
  }
}

等等,先别运行!!!

这时候通常工程名上会出现一个红色的叉叉×,解决办法如下:

WordCount工程->右键->Scala->Set the Scala Installation->Fixed Scala Installation:2.10.6 (bundled)

点击OK,问题解决!(如果还不能解决,请参看google或是百度)

现在开始运行吧!

运行结果展示:

 

至此为止,spark的安装与wordcount的运行历程就结束了,这是我第一次写这种博客,有不足的地方请帮忙指正,其中还有很多地方是参照别人的教程,由于之前安装时比较匆忙,来不及保存网页,如有抄袭请见谅,谢谢!

最后贴一段java语言编写的wordcount:

 

package spark_hdfs;

import org.apache.spark.SparkConf;  
import org.apache.spark.api.java.JavaPairRDD;  
import org.apache.spark.api.java.JavaRDD;  
import org.apache.spark.api.java.JavaSparkContext;  
import org.apache.spark.api.java.function.FlatMapFunction;  
import org.apache.spark.api.java.function.Function2;  
import org.apache.spark.api.java.function.PairFunction;  
import scala.Tuple2;   
  
import java.text.SimpleDateFormat;
import java.util.Arrays;  
import java.util.Date;
import java.util.List;  
import java.util.regex.Pattern;  
  
  
public final class JavaWordCount {      
    
  private static final Pattern SPACE = Pattern.compile(" ");      
  public static void main(String[] args) throws Exception {  
      Date start=new Date();        
      String[] otherArgs=new String[]{"hdfs://localhost:9000/user/hadoop/spark_input/","hdfs://localhost:9000/user/hadoop/spark_output"}; /* 直接设置输入参数 */
      if (otherArgs.length != 2) {
        System.err.println("Usage: wordcount <in> <out>");
        System.exit(2);
      }  
  
    //创建SparkConf,包含application的相关信息  
    // SparkConf sparkConf = new SparkConf().setAppName("JavaWordCount");  
    //创建一个JavaSparkContext对象  
    SparkConf sparkConf = new SparkConf()
    .setAppName("WordCountLocal")
    .setMaster("local");  
    JavaSparkContext ctx = new JavaSparkContext(sparkConf);  
    //textFile()方法可将本地文件或HDFS文件转换成RDD,读取本地文件需要各节点上都存在,或者通过网络共享该文件  
    //读取一行  
    JavaRDD<String> lines = ctx.textFile(otherArgs[0], 1);  
    //flatMap与map的区别是,对每个输入,flatMap会生成一个或多个的输出,而map只是生成单一的输出  
    //用空格分割各个单词,输入一行,输出多个对象,所以用flatMap  
    JavaRDD<String> words = lines.flatMap(new FlatMapFunction<String, String>() {  
      @Override  
      public Iterable<String> call(String s) {  
        return Arrays.asList(SPACE.split(s));  
      }  
    });  
    //对每个单词生成key-value对,PairFunction<T,K,V>  
    //表示输入类型为T,生成的key-value对中的key类型为k,value类型为v,对本例,T=String, K=String, V=Integer(计数)  
    //重写scala的Tupple2方法  
    JavaPairRDD<String, Integer> ones = words.mapToPair(new PairFunction<String, String, Integer>() {  
      @Override  
      //scala.Tuple2<K,V> call(T t)  
      //Tuple2为scala中的一个对象,call方法的输入参数为T,即输入一个单词s,新的Tuple2对象的key为这个单词,计数为1  
      public Tuple2<String, Integer> call(String s) {  
        return new Tuple2<String, Integer>(s, 1);  
      }  
    });  
    //调用reduceByKey方法,按key值进行reduce  
    //调用Function2对象,Function2<T1,T2,R>  
    //输入两个参数,T1,T2,返回R  
    //若ones有<"one", 1>, <"one", 1>,会根据"one"将相同的pair单词个数进行统计,输入为Integer,输出也为Integer  
    //输出<"one", 2>  
    JavaPairRDD<String, Integer> counts = ones.reduceByKey(new Function2<Integer, Integer, Integer>() {  
      @Override  
      public Integer call(Integer i1, Integer i2) {  
        return i1 + i2;  
      }  
    });  
    //将结果保存到HDFS中  
    counts.saveAsTextFile(otherArgs[1]);  
    //collect返回一个包含RDD内所有元素的Array  
    List<Tuple2<String, Integer>> output = counts.collect();  
    for (Tuple2<?, ?> tuple : output) {  
      System.out.println(tuple._1() + ": " + tuple._2());  
    }      
    Date end=new Date();
    System.out.println(end.getTime()-start.getTime());
    ctx.stop();  
  }  
}

 

posted @ 2016-12-06 18:06  张瑞浩  阅读(2241)  评论(2编辑  收藏  举报