前幾天剛着實研究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(); } }