前几天刚着实研究spark,spark安装与配置是入门的关键,本人也是根据网上各位大神的教程,尝试配置,发现版本对应最为关键。现将本身的安装与配置过程介绍以下,若有兴趣的同窗能够尝试安装。所谓工欲善其事必先利其器,下面我们将进入安装教程。html
2016-12-06 10:17:07java
环境linux
本教程使用了Ubuntu 14.04 64位做为系统环境,用到的安装程序有:jdk 1.七、spark-1.6.0 、scala-2.10.六、scala-SDK-4.4.1-vfinal-2.11-linux.gtk.x86_64(集成了scala的 eclipse)、hadoop 2.6.0。下面将一一介绍各个程序的安装过程。
shell
×××注意:apache
一、 文中和截图中会出现hadoop字样,这是因为做者在以前装过hadoop,并以hadoop为用户名登录了电脑,好比/home/hadoop/下载, 这中间的hadoop就是hadoop用户家目录下的下载文件夹,大家的应该是/home/用户名(大家本身设置的)/Downloads(中文版的是下 载)编程
二、linux中用到的解压方法大部分都是vim
tar -zxvf 文件名(适用于以.tar.gz为结尾的压缩文件)api
unzip 文件名 (适用于以.zip为结尾的压缩文件)安全
三、移动文件或文件夹时,如遇到权限不够的问题bash
可将目标文件夹权限更改成777:
chmod -R 777 目标文件夹
可是在更改事后尽可能将权限再改到755(为了安全):
chmod -R 755 目标文件夹
四、若是要用到hdfs,请安装hadoop,个人hadoop版本是2.6.0,参照 给力星 的文章(写的特别好):
转载:http://www.powerxing.com/install-hadoop/
1、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(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
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 运行环境就安装好了。
2、scala环境安装
Scala是一门多范式的编程语言,一种相似java的编程语言 ,设计初衷是实现可伸缩的语言,并集成面向对象编程和函数式编程的各类特性。
scala是spark的原生语言,各类新特性确定是scala最早支持的。
Scala两大特色,正好匹配Spark的需求:
首先下载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的安装阶段。
3、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程序开发。
4、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(); } }