mac下Spark的安装与使⽤
每次接触⼀个新的知识之前我都抱有恐惧之⼼,因为总认为⾃⼰没有接触到的知识都很⾼⼤上,⽐如上篇介绍到的与本篇要介绍的Spark,其实在⾃⼰真正琢磨以后才发现本以为⾼⼤上的知识其实也不过如此。
由于Spark是最新⽕起来的处理⼤数据的框架,国内教程资源少之甚少,所以本篇⽂章是本⼈在看了教程后总结下来的经验,由于Spark同Hadoop⼀样可以运⾏在多种模式下,⽽本⼈⼜⽐较穷只有⼀台电脑,所以本篇⽂章为⼤家介绍如何在mac系统的本地模式下安装Spark以及安装后如何⽤Spark来进⾏交互式分析。
本⽂结构:前部分介绍Spark的⼀点点(详情介绍请⾃⾏google)基础概念以及安装过程,后部分通过⼀个demo让⼤家快速学会使⽤Spark基本Api。
1.Spark的运⾏模式
在正式安装Spark之前,先给⼤家介绍下Spark可以在哪⼏种模式下运⾏。同上篇中介绍的Hadoop可以运⾏在其3种模式中的任意⼀种模式之上,Spark也可以运⾏在多种模式之上,主要有以下4种运⾏模式:
1.local: 本地单进程模式,⽤于本地开发测试Spark代码。
2.standalone:分布式集模式,Master-Worker架构,Master负责调度,Worker负责具体Task的执⾏。
< yarn/mesos:运⾏在yarn/mesos等资源管理框架之上,yarn/mesos提供资源管理,spark提供计算调度,并可与其他计算框架(如
MapReduce/MPI/Storm)共同运⾏在同⼀个集之上。
< cloud(EC2): 运⾏在AWS的EC2之上
由于博主⽐较穷,所以下⾯为⼤家介绍本地模式下Spark的安装与使⽤。
2.Spark的安装
2.1准备⼯作
第⼀步:安装Java JDK 1.7及以上版本,并配置好环境变量。本电脑安装的jdk是1.7.0_79版本的。
第⼆步:安装Hadoop。本电脑安装的Hadoop是2.7.3版本的。
疑惑:上篇⽂章说到可以不学Hadoop直接学习Spark,那为什么还要安装Hadoop?亲,我的意思是不
⽤学习Hadoop的相关知识例如它的API 啥的,但是没说不⽤先搭建Hadoop的环境呀!
合理解释:Spark会⽤到HDFS与YARN,因此请先安装Hadoop,关于Hadoop的安装请参考我的上篇博⽂,在此就不再复述。
第三步:安装Scala 2.9.3以上版本。这⾥介绍下Scala在mac下的安装与环境变量的配置。点击链接进⼊的下载页,下载2.11.8版本(第⼀次操作的时候我下载了最新版2.12.1,后来测试spark-shell命令时发现最新版本的scala与1.7版本的jdk不兼容,所以后来换成了2.11.8版本)的Scala:
点击图上下载链接会⾃动将scala下载到Dowmloads⽬录下,⽂件名为:scala-2.,还有⼀种下载⽅法就是直接在命令⾏使⽤homebrew 命令(作为⼀个Linux开发⼈员我建议使⽤这种⽅式)进⾏下载:brew install scala,该命令会⾃动帮你把scala下载到/usr/local⽬录下。使⽤在官⽹点击链接下载的⽅式的话,我们也要将该scala⽂件加到/usr/local⽬录下,你可以直接拷贝过去,当然作为⼀个Linux开发⼈员你可以直接使⽤⼀条命令完成将该压缩包进⾏解压并移动到/usr/local/⽬录下:sudo tar -zxf ~/downloads/scala-2. -C /usr/local/,然后使⽤命令cd /usr/local进⼊到该⽬录下,由于解压后的⽂件名为:scala-2.12.1,所以为了之后配置的⽅便我们使⽤命令:sudo mv ./scala-2.12.1 ./scala将⽂件名修改为scala。因为该⽬录属于管理员级别的⽬录所以如果当前⽤户不是管理员的话应该在命令前⾯使⽤sudo关键字表⽰使⽤管理员权限。
这样scala的安装便完成,但是还要配置scala的环境变量,使⽤命令:sudo vim ./etc/profile打开系统中配置环境变量的⽂件,在⾥⾯添加如下内容:
1 2export SCALA_HOME=/usr/local/scala export PATH=$PATH:$SCALA_HOME/bin
然后:wq!保存并退出该⽂件,输⼊命令使该⽂件的内容⽴刻⽣效:source /etc/profile,接下来在(根⽬录下)命令⾏输⼊:scala并敲击回车,看到控制台打印如下信息说明我们的scala安装并成功配置了环境变量:
图中信息即表明我们使⽤的scala版本为2.11.8,jdk版本为1.7.0_79。
使⽤命令⾏快捷键control+c或者:quit退出scala shell环境(⽹上教程有说使⽤exit命令可以退出scala shell环境,我试了但貌似不⾏)。
疑惑:既然Spark提供了Scala、Python、Java三种程序设计语⾔的API,那么我直接⽤java不就好了,为什么还要下载Scala呢?是因为等会我们会使⽤Spark shell连接到Spark引擎进⾏交互式数据分析,⽽Spark shell只⽀持Scala和Python两种语⾔。Java不⽀持交互式的Shell,因此这⼀功能暂未在Java语⾔中实现(当然你也可以不使⽤shell编程,直接在IDE中⽤java编程语⾔连接到Spark引擎进⾏交互式数据分析也是可以的)。所以建议⼤家还是⽼⽼实实在电脑上⾯下载好scala并配置好环境变量,反
正也占不了多⼤空间啊,⽽且万⼀哪天⽤到这东西了呢?所以下⾯我都是采⽤的scala⽀持的shell来配置的Spark,之后我也会使⽤scala运⾏spark-shell进⾏交互式数据分析的⼀个⼩⽰例带⼤家快速⼊门。
准备好如上环境后,接下来就可以进⾏Spark的安装与相关配置操作了。
2.2安装Spark并配置
接下来才是正题,进⼊进⾏Spark的下载,看到如下页⾯:
第2条你要是选择的是Hadoop2.7的话,你要保证你之前安装的Hadoop版本也是2.7版本。选择第4条的下载链接即可(当然你也可以直接⽤Homebrew命令进⾏下载),系统会将下好的⽂件放在Dowmloads⽂件⽬录下,⽂件名为:spark-2.0.,同scala的安装⽅法⼀样,我们使⽤命令:sudo tar -zxf ~/Dowmloads/spark-2.0. -C /usr/local/直接将该压缩包解压并移动到/usr/local/⽬录下,然后我们cd
/usr/local进⼊到/usr/local⽬录下,使⽤命令更改该⽬录下的spark⽂件名:sudo mv ./spark-2.0.2-bin-hadoop2.7 ./spark将⽂件名改为spark。
经过上述步骤从官⽹下载到Spark的⽂件,这样我们便完成了Spark的安装,但是Spark也是要进⾏相
应的环境变量配置的,所以接下来我们进⾏Spark环境变量的配置。
使⽤命令:sudo vim /etc/profile,在⽂件中加⼊Spark的环境变量:
1 2export SPARK_HOME=/usr/local/spark export PATH=$PATH:$SPARK_HOME/bin
然后我们进⼊到Spark⽬录的conf配置⽂件中:cd /usr/local/spark/conf,执⾏命令:cp plate spark-env.sh将plate拷贝⼀份,然后打开拷贝后的spark-env.sh⽂件:vim spark-env.sh,在⾥⾯加⼊如下内容:
1 2 3 4 5export SCALA_HOME=/usr/local/scala export SPARK_MASTER_IP=localhost export SPARK_WORKER_MEMORY=4g
这样我们便完成了Spark环境变量的配置,接下来测试测试⼀下Spark,在根⽬录(因为我们配置了spark环境变量,所以可以直接在根⽬录)下输⼊命令:spark-shell,看到控制台输出如下信息:
恭喜你,尽情享受Spark吧。
3.安装过程出现的问题分析
1.运⾏spark-shell命令时控制台出现:
1..我忘了是啥报错了.connection out.中间报错信息是这个..
的错误,说明没有配置SSH,配置SSH请参考我上篇⽂章中Hadoop安装的配置过程。
python安装教程mac
2.运⾏命令:scala时控制台出现:
的错误信息,表⽰scala没有成功安装,或者安装的scala与jdk不兼容,所以这⾥我建议你们就按本教程的2.11.8scala版本与1.7jdk版本来操作吧。这些坑我都试过了,所以才能为你们总结经验。(⼤哭脸)
3.其他错误,有以下原因,你们⼀定要⼀⼀进⾏检查:
1.关于JDK:JDK版本不对,所以我建议⼤家⽤1.7;或者是JDK版本正确但是没有成功配置它的环境变量,我配置时更改了两个⽂件的环
境变量:⼀个是/etc/profile⽬录下的,⼀个是.bash_profile⽂件中的,配置环境变量信息如下:
1 2export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home export PATH=$JAVA_HOME/bin:$PATH
2.关于scala:Scala版本不对,所以我建议⼤家⽤2.11.8;或者是没有成功配置scala的环境变量,配置环境变量按照⽂中介绍的即可。
3.Hadoop版本与Spark版本不兼容:所以⼤家在Spark官⽹下载Spark的时候⼀定要注意下载Spark时选择的第⼆条信息的Hadoop版本要
与电脑上⾯已经安装的Hadoop⼀致才⾏。
4.快速⼊门Spark基础Api
这⾥我介绍两种使⽤Spark基础Api的⽅式,⼀种是在spark-shell中进⾏简单的测试,⼀种是在开发⼯具IDEA中进⾏代码的编写来教⼤家快速学习Spark基础API。
4.1使⽤spark-shell完成单词统计功能
smarty模板引擎的工作流程
由于spark-shell只⽀持scala和python两种语⾔的编写,不⽀持Java,所以我在spark-shell中通过scala的语法来进⾏简单测试。
在配置好Spark环境变量之后,我们打开命令⾏,直接在当前⽤户⽬录下输⼊命令spark-shell进⼊scala编写环境(当然前提是你⾸先使⽤命
令start-all.sh命令开启了Spark):
java语言程序设计第三版pdf
我们从/usr/local/spark/README.md⽂件新建⼀个 RDD,代码如下(本⽂出现的 Spark 交互式命令代码中,第⼀⾏为代码及其解释,第⼆⾏及以后是控制台返回的结果):
1 2scala> val textFile = sc.textFile("file:///usr/local/spark/README.md")
>textFile: org.apache.spark.rdd.RDD[String] = file:///usr/local/spark/README.md MapPartitionsRDD[1] at textFile at <console>:24
代码中通过file://前缀或者不加file://前缀表⽰指定读取本地⽂件。如果你这⾥传⼊的路径写的是HDFS上的⽂件路径,例如hdfs://远程主机名:Hadoop端⼝号我/⽂件名代表你要是读取的是 HDFS 中的⽂件,你需要先上传⽂件到 HDFS 中(⾄于如何上传,后⾯的demo中我们会进⾏讲解),否则会有org.apache.hadoop.mapred.InvalidInputException: Input path does not exist: hdfs://localhost:9000/user/hadoop/README.md的错误。这⾥我们就以读取本地⽂件进⾏讲解。
RDDs ⽀持两种类型的操作:1.actions: 在数据集上运⾏计算后返回值。2.transformations: 转换, 从现有数据集上创建⼀个新的数据集。
使⽤上述命令创建好的RDD对象,下⾯我们就来通过该对象演⽰ count() 和 first() 操作:
1 2 3 unt()  // RDD 中的 item 数量,对于⽂本⽂件,就是总⾏数
>res0: Long = 95
textFile.first() // RDD 中的第⼀个 item,对于⽂本⽂件,就是第⼀⾏内容>res1: String = # Apache Spark
接着演⽰ transformation,通过 filter transformation 来返回⼀个新的 RDD,代码如下:
1 2 3 4 5val linesWithSpark = textFile.filter(line => ains("Spark"))  // 筛选出包含 Spark 的⾏
>linesWithSpark: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[2] at filter at <console>:unt()      // 统计⾏数
>res4: Long = 17
上述我们完成了RDD的简单计算,⽽RDD 的 actions 和 transformations 其实可⽤在更复杂的计算中,例如通过如下代码可以到包含单词最多的那⼀⾏内容共有⼏个单词:
1 2textFile.map(line => line.split(" ").size).reduce((a, b) => if (a > b) a else b) >res1: Int = 22
代码⾸先将每⼀⾏内容 map 为⼀个整数,这将创建⼀个新的 RDD,并在这个 RDD 中执⾏ reduce 操
作,到最⼤的数。map()、reduce()中的参数是 Scala 的函数字⾯量(function literals,也称为闭包 closures),并且可以使⽤语⾔特征或 Scala/Java 的库。例如,通过使⽤Math.max() 函数(需要导⼊ Java 的 Math 库),可以使上述代码更容易理解:
1 2 3 4import java.lang.Math //先导⼊Math函数
textFile.map(line => line.split(" ").size).reduce((a, b) => Math.max(a, b)) >res6: Int = 14
Hadoop MapReduce 是常见的数据流模式,在 Spark 中同样可以实现(下⾯这个例⼦也就是 WordCount):
1 2 3 4 5val wordCounts = textFile.flatMap(line => line.split(" ")).map(word => (word, 1)).reduceByKey((a, b) => a + b)  // 实现单词统计>wordCounts: org.apache.spark.rdd.RDD[(String, Int)] = ShuffledRDD[4] at reduceByKey at <console>:29
>res7: Array[(String, Int)] = Array((package,1), (For,2), (Programs,1), (processing.,1), (Because,1), (The,1)...)
上述我们通过spark-shell完成单词的统计简单对我们spark的基础Api进⾏了熟悉,采⽤的是scala语⾔,由于我是⼀个java开发⼈员,所以接下来就在开发⼯具IDEA中通过编写Java代码来实现HDFS中某个路径下⽂件内容中单词的统计功能。
4.2在IDEA中编写Java代码完成HDFS中某个⽂件中的单词统计功能
既然要统计HDFS中某个⽂件中的单词,那么我们⾸先要将⽂件上传到HDFS上吧!如何上传?听我慢慢道来。
使⽤命令:quit退出scala命令环境,⾸先在本地电脑的当前⽤户⽬录下创建⼀个⽂件,我这⾥创建了⼀个叫hello的txt⽂件,⾥⾯写上内容hello world hello you hello hello ,内容可以随便打啦,然后输⼊hadoop的命令(关于Hadoop的更多命令请⾃⾏google):hadoop fs -put ~/hello /,实现将本机⽬
录下的hello⽂件推⾄远程主机的根⽬录下,然后便可以开始编写我们的java代码了。
nonstick使⽤IDEA创建⼀个Maven项⽬(便于管理我们的jar包嘛!),在l中添加上Spark相应jar包坐标:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40<project xmlns="/POM/4.0.0" xmlns:xsi="/2001/XMLSchema-instance"  xsi:schemaLocation="maven.apach
<modelVersion>4.0.0</modelVersion>
<groupId&dingxiaxw.spark</groupId>
<artifactId>spark-mvn</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>spark-mvn Maven Webapp</name>
<url></url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency> <!-- Spark dependency -->
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>2.0.2</version>
</dependency>
</dependencies>
<build>
<finalName>spark-mvn</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
php网上书店系统源码然后创建⼀个WordCount.java⽂件,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34public class Simple
{
private static final Pattern SPACE = Patternpile(" ");
public static void main(String[] args) throws Exception {
//        if (args.length < 1) {
//            println("Usage: JavaWordCount <file>");
//            it(1);
//        }
//创建⼀个RDD对象
SparkConf conf=new SparkConf().setAppName("Simple").setMaster("local");
//创建spark上下⽂对象,是数据的⼊⼝
JavaSparkContext spark=new JavaSparkContext(conf);
//获取数据源
JavaRDD<String> lines = File("hdfs://localhost:8020/hello");
/**
* 对于从数据源得到的DStream,⽤户可以在其基础上进⾏各种操作,
* 对于当前时间窗⼝内从数据源得到的数据⾸先进⾏分割,
* 然后利⽤Map和ReduceByKey⽅法进⾏计算,当然最后还有使⽤print()⽅法输出结果;        */
JavaRDD<String> words = lines.flatMap(new FlatMapFunction<String, String>() {
@Override
public Iterator<String> call(String s) {
return Arrays.asList(SPACE.split(s)).iterator();
}
});
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62        //使⽤RDD的map和reduce⽅法进⾏计算
JavaPairRDD<String, Integer> ones = words.mapToPair(
new PairFunction<String, String, Integer>() {
@Override
public Tuple2<String, Integer> call(String s) {
return new Tuple2<>(s, 1);
}
});
JavaPairRDD<String, Integer> counts = duceByKey(                new Function2<Integer, Integer, Integer>() {
@Override
public Integer call(Integer i1, Integer i2) {
return i1 + i2;
}
});
List<Tuple2<String, Integer>> output = llect();
for (Tuple2<?,?> tuple : output) {
//输出计算结果
dreamweaver网页制作视频教程System.out.println(tuple._1() + ": " + tuple._2());
}
spark.stop();
}
}
各⾏代码意思见代码旁的注释,上述代码都是从官⽅⽂档抄的,但是貌似要注释掉官⽅⽂档的:
1 2 3 4//        if (args.length < 1) {
//            println("Usage: JavaWordCount <file>"); //            it(1);
//        }
然后运⾏程序,控制台输出结果如下图:
成功统计出HDFS上⽂件内容的单词个数。到此,我们便简单熟悉了Spark的相关API,下篇⽂章我将介绍通过Spark的为⼤家介绍Spark中Streming库的相关Api操作。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。