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和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
在文件最前面添加如下單獨一行(注意 = 號前后不能有空格),將“JDK安裝路徑”改為上述命令得到的路徑,並保存:
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(); } }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM