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(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 运行环境就安装好了。
二、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();
}
}