您好,登錄后才能下訂單哦!
Spark是Apache的一個頂級項目,Apache Spark 是專為大規模數據處理而設計的快速通用的計算引擎。Spark是UC Berkeley AMP lab (加州大學伯克利分校的AMP實驗室)所開源的類Hadoop MapReduce的通用并行框架,Spark擁有Hadoop MapReduce所具有的優點;但不同于MapReduce的是——Job中間輸出結果可以保存在內存中,從而不再需要讀寫HDFS,因此Spark能更好地適用于數據挖掘與機器學習等需要迭代的MapReduce的算法。
Spark的計算速度也要比MapReduce快得多,它有一個先進的DAG執行引擎,支持非循環的數據流和內存計算。官網介紹說在使用內存的情況下快100倍,而使用磁盤的情況下快10倍。
而且Spark 是在 Scala 語言中實現的,它將 Scala 用作其應用程序框架。與 Hadoop 不同,Spark 和 Scala 能夠緊密集成,其中的 Scala 可以像操作本地集合對象一樣輕松地操作分布式數據集。
Spark也比MapReduce要易于使用,并且可以使用Java, Scala, Python, R等語言進行開發。Spark 提供了80多個高級API,可以很容易地實現并行計算的應用程序。還可以通過Scala、Python和R shells等交互式命令行,交互地使用它。
Spark 主要有四個特點:
高級 API 剝離了對集群本身的關注,Spark 應用開發者可以專注于應用所要做的計算本身。下圖是python使用Spark API的代碼:
Spark 很快,支持交互式計算和復雜算法以及非循環的數據流和內存計算。下圖是官網上展示的MapReduce與Spark進行回歸計算時,計算速度的對比圖:
Spark官網地址:
http://spark.apache.org/
Spark的生態系統簡稱BDAS。如下圖:
Hadoop生態圈對比Spark BDAS:
Hadoop對比Spark:
MapReduce對比Spark:
Spark支持的開發語言:
Spark運行模式:
安裝Scala時,需要先準備好JDK環境,而我這里已經準備好jdk1.8的環境了。
Scala官網下載地址:
http://www.scala-lang.org/download/
下載Scala:
[root@study-01 ~]# cd /usr/local/src
[root@study-01 /usr/local/src]# wget https://downloads.lightbend.com/scala/2.12.5/scala-2.12.5.tgz
解壓:
[root@study-01 /usr/local/src]# tar -zxvf scala-2.12.5.tgz -C /usr/local/
[root@study-01 /usr/local/src]# cd ../
[root@study-01 /usr/local]# ls
bin etc games include lib lib64 libexec sbin scala-2.12.5 share src
[root@study-01 /usr/local]# cd scala-2.12.5/
[root@study-01 /usr/local/scala-2.12.5]# ls
bin doc lib man
[root@study-01 /usr/local/scala-2.12.5]#
配置環境變量:
[root@study-01 ~]# vim .bash_profile # 更改如下內容
export SCALA_HOME=/usr/local/scala-2.12.5
PATH=$PATH:$HOME/bin:$JAVA_HOME/bin:$SCALA_HOME/bin
export PATH
[root@study-01 ~]# source .bash_profile
[root@study-01 ~]# scala # 測試能否執行scala命令
Welcome to Scala 2.12.5 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_161).
Type in expressions for evaluation. Or try :help.
scala>
Maven官網下載地址:
https://maven.apache.org/download.cgi
下載并解壓:
[root@study-01 ~]# cd /usr/local/src/
[root@study-01 /usr/local/src]# wget http://mirror.bit.edu.cn/apache/maven/maven-3/3.5.2/binaries/apache-maven-3.5.2-bin.tar.gz
[root@study-01 /usr/local/src]# tar -zxvf apache-maven-3.5.2-bin.tar.gz -C /usr/local
[root@study-01 /usr/local/src]# cd ../apache-maven-3.5.2/
[root@study-01 /usr/local/apache-maven-3.5.2]# ls
bin boot conf lib LICENSE NOTICE README.txt
[root@study-01 /usr/local/apache-maven-3.5.2]#
配置環境變量:
[root@study-01 ~]# vim .bash_profile # 更改如下內容
export MAVEN_HOME=/usr/local/apache-maven-3.5.2
PATH=$PATH:$HOME/bin:$JAVA_HOME/bin:$SCALA_HOME/bin:$MAVEN_HOME/bin
[root@study-01 ~]# source .bash_profile
[root@study-01 ~]# mvn --version # 測試能否執行mvn命令
Apache Maven 3.5.2 (138edd61fd100ec658bfa2d307c43b76940a5d7d; 2017-10-18T15:58:13+08:00)
Maven home: /usr/local/apache-maven-3.5.2
Java version: 1.8.0_161, vendor: Oracle Corporation
Java home: /usr/local/jdk1.8/jre
Default locale: zh_CN, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-327.el7.x86_64", arch: "amd64", family: "unix"
[root@study-01 ~]#
Spark官網下載地址:
http://spark.apache.org/downloads.html
我這里下載的是2.1.0版本的源碼包,官網的編譯安裝文檔:
http://spark.apache.org/docs/2.1.0/building-spark.html
從官網的介紹,我們得知:
下載Spark2.1.0版本的源碼包:
下載并解壓:
[root@study-01 /usr/local/src]# wget https://archive.apache.org/dist/spark/spark-2.1.0/spark-2.1.0.tgz
[root@study-01 /usr/local/src]# tar -zxvf spark-2.1.0.tgz -C /usr/local
[root@study-01 /usr/local/src]# cd ../spark-2.1.0/
[root@study-01 /usr/local/spark-2.1.0]# ls
appveyor.yml common data external licenses NOTICE R scalastyle-config.xml yarn
assembly conf dev graphx mesos pom.xml README.md sql
bin CONTRIBUTING.md docs launcher mllib project repl streaming
build core examples LICENSE mllib-local python sbin tools
[root@study-01 /usr/local/spark-2.1.0]#
安裝完成之后我們還需要使用Spark源碼目錄中的dev下的make-distribution.sh腳本進行編譯,官方提供的編譯命令如下:
./dev/make-distribution.sh --name custom-spark --tgz -Psparkr -Phadoop-2.4 -Phive -Phive-thriftserver -Pmesos -Pyarn
參數說明:
那么我們就可以根據具體的條件來編譯Spark,比如我們使用的Hadoop版本是2.6.0-cdh6.7.0,并且我們需要將Spark運行在YARN上、支持對Hive的操作,那么我們的Spark源碼編譯腳本就是:
[root@study-01 /usr/local/spark-2.1.0]# ./dev/make-distribution.sh --name 2.6.0-cdh6.7.0 --tgz -Pyarn -Phadoop-2.6 -Phive -Phive-thriftserver -Dhadoop.version=2.6.0-cdh6.7.0
但是在執行這個命令之前我們先需要編輯pom.xml文件,增加cdh的maven repository:
[root@study-01 /usr/local/spark-2.1.0]# vim pom.xml # 在<repositories>標簽內,加入如下內容
<repository>
<id>cloudera</id>
<url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
</repository>
[root@study-01 /usr/local/spark-2.1.0]#
然后還需要更改編譯腳本的mvn命令路徑,因為使用自帶的mvn編譯有些慢:
[root@study-01 /usr/local/spark-2.1.0]# vim dev/make-distribution.sh
MVN="$MAVEN_HOME/bin/mvn"
[root@study-01 /usr/local/spark-2.1.0]#
完成以上的修改后,就可以執行編譯命令了,編譯的過程會有些慢(我這里編譯了半個多小時)。而且內存盡量分配得大一些,避免內存不足導致編譯中斷。
編譯完成之后,spark目錄下會增加一個.tgz的文件,把這個文件解壓到/usr/local/目錄下:
[root@study-01 /usr/local/spark-2.1.0]# ls |grep *.tgz
spark-2.1.0-bin-2.6.0-cdh6.7.0.tgz
[root@study-01 /usr/local/spark-2.1.0]# tar -zxvf spark-2.1.0-bin-2.6.0-cdh6.7.0.tgz -C /usr/local
[root@study-01 /usr/local/spark-2.1.0]# cd ../spark-2.1.0-bin-2.6.0-cdh6.7.0/
[root@study-01 /usr/local/spark-2.1.0-bin-2.6.0-cdh6.7.0]# ls
bin conf data examples jars LICENSE licenses NOTICE python README.md RELEASE sbin yarn
[root@study-01 /usr/local/spark-2.1.0-bin-2.6.0-cdh6.7.0]#
到此為止,我們的spark就安裝完成了。接下來我們嘗試一下啟動Spark的shell終端:
[root@study-01 /usr/local/spark-2.1.0-bin-2.6.0-cdh6.7.0]# ./bin/spark-shell --master local[2]
命令說明:
關于啟動spark shell的官方文檔說明:
http://spark.apache.org/docs/2.1.0/submitting-applications.html
啟動成功:
啟動成功后,我們來實現wordcount的案例。官網的快速入門文檔:
http://spark.apache.org/docs/2.1.0/quick-start.html
現在有一個文件,內容如下:
[root@study-01 /data]# cat hello.txt
hadoop welcome
hadoop hdfs mapreduce
hadoop hdfs
hello hadoop
spark vs mapreduce
[root@study-01 /data]#
在spark shell里完成對該文件的wordcount:
scala> val file = sc.textFile("file:///data/hello.txt") # 讀取文件
file: org.apache.spark.rdd.RDD[String] = file:///data/hello.txt MapPartitionsRDD[1] at textFile at <console>:24
scala> file.collect # 打印讀取的數據
res1: Array[String] = Array(hadoop welcome, hadoop hdfs mapreduce, hadoop hdfs, hello hadoop, spark vs mapreduce)
scala> val a = file.flatMap(line => line.split(" ")) # 按空格進行拆分
a: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[2] at flatMap at <console>:26
scala> a.collect
res2: Array[String] = Array(hadoop, welcome, hadoop, hdfs, mapreduce, hadoop, hdfs, hello, hadoop, spark, vs, mapreduce)
scala> val b = a.map(word => (word,1)) # 進行map操作,給每個單詞附上1
b: org.apache.spark.rdd.RDD[(String, Int)] = MapPartitionsRDD[3] at map at <console>:28
scala> b.collect
res3: Array[(String, Int)] = Array((hadoop,1), (welcome,1), (hadoop,1), (hdfs,1), (mapreduce,1), (hadoop,1), (hdfs,1), (hello,1), (hadoop,1), (spark,1), (vs,1), (mapreduce,1))
scala> val c = b.reduceByKey(_ + _) # 進行Reduce操作,把每個相同key的值相加,并整合在一起
c: org.apache.spark.rdd.RDD[(String, Int)] = ShuffledRDD[4] at reduceByKey at <console>:30
scala> c.collect
res4: Array[(String, Int)] = Array((mapreduce,2), (hello,1), (welcome,1), (spark,1), (hadoop,4), (hdfs,2), (vs,1))
scala>
如上,可以看到,通過簡單的交互式的代碼我們就完成了對文件的詞頻統計,并且這些方法都可以形成一個方法鏈的調用,所以其實一句代碼就可以完成wordcount了,如下示例:
scala> sc.textFile("file:///data/hello.txt").flatMap(line => line.split(" ")).map(word => (word,1)).reduceByKey(_ + _).collect
res5: Array[(String, Int)] = Array((mapreduce,2), (hello,1), (welcome,1), (spark,1), (hadoop,4), (hdfs,2), (vs,1))
scala>
我們還可以在web頁面上看到任務執行的信息,訪問主機ip的4040端口即可,如下:
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。