spark 1.6.0 安裝與配置(spark1.6.0、Ubuntu14.0四、hadoop2.6.0、scala2.10.六、jdk1.7)

前幾天剛着實研究spark,spark安裝與配置是入門的關鍵,本人也是根據網上各位大神的教程,嘗試配置,發現版本對應最爲關鍵。現將本身的安裝與配置過程介紹以下,若有興趣的同窗能夠嘗試安裝。所謂工欲善其事必先利其器,下面我們將進入安裝教程。html

2016-12-06  10:17:07java

環境linux

本教程使用了Ubuntu 14.04 64位做爲系統環境,用到的安裝程序有:jdk 1.七、spark-1.6.0 、scala-2.10.六、scala-SDK-4.4.1-vfinal-2.11-linux.gtk.x86_64(集成了scala的 eclipse)、hadoop 2.6.0。下面將一一介紹各個程序的安裝過程。
shell

×××注意apache

一、 文中和截圖中會出現hadoop字樣,這是因爲做者在以前裝過hadoop,並以hadoop爲用戶名登錄了電腦,好比/home/hadoop/下載, 這中間的hadoop就是hadoop用戶家目錄下的下載文件夾,大家的應該是/home/用戶名(大家本身設置的)/Downloads(中文版的是下 載)編程

二、linux中用到的解壓方法大部分都是vim

      tar -zxvf 文件名(適用於以.tar.gz爲結尾的壓縮文件)api

      unzip 文件名     (適用於以.zip爲結尾的壓縮文件)安全

三、移動文件或文件夾時,如遇到權限不夠的問題bash

    可將目標文件夾權限更改成777:  

chmod -R 777 目標文件夾

 可是在更改事後儘可能將權限再改到755(爲了安全):

chmod -R 755 目標文件夾

 四、若是要用到hdfs,請安裝hadoop,個人hadoop版本是2.6.0,參照 給力星 的文章(寫的特別好):

轉載:http://www.powerxing.com/install-hadoop/

 

1、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 運行環境就安裝好了。

 

2、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的安裝階段。

 

3、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程序開發。

 

4、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(); } }
相關文章
相關標籤/搜索