1. 程式人生 > >spark 環境搭建及幾種模式測試

spark 環境搭建及幾種模式測試

spark 環境搭建及幾種模式測試
spark安裝部署spark安裝前的環境準備

需要安裝jdk、scala、hadoop作為前提環境。

1、安裝jdk1.7

先解除安裝自帶的jdk,防止自帶的jdk和安裝的出現衝突。而且自帶的版本較低不能滿足現在軟體對jdk的要求。

使用如下命令:

rpm –qa | grep java 用來查詢有多少幾個版本的java,我的電腦為例表示裝了兩個java

需要解除安裝1.7的jdk,1.6系統使用,不允許解除安裝

rpm -e java-1.7.0。45-2.4.3.3.el6.x86_64

安裝jdk1.7

在使用者的環境變數中新增jdk目錄即可

使用如下命令vi ~/.bash_profile

本地圖片,請重新上傳

新增如下資訊

export JAVA_HOME=/usr/jdk1.7.0_25

export PATH= H O M E / b

i n : JAVA_HOME/bin:$PATH

使配置檔案生效source ~/.bash_profile

使用java -version檢查jdk的版本號是否和自己安裝的一致

本地圖片,請重新上傳

2、安裝scala

在使用者下的環境變數中新增scala的目錄即可

export SCALA_HOME=/usr/scala-2.10.4

export PATH=

H O M E / b i n : JAVA_HOME/bin: P A T H : SCALA_HOME/bin

本地圖片,請重新上傳

4 安裝hadoop2.6

1、新增java主目錄位置,hadoop的底層是使用java開發,所以hadoop框架和程式的執行需要能夠找到java的環境。在hadoop的如下三個檔案配置即可。

vi hadoop-env.sh

先把之前的java的環境變數去掉,重新寫自己安裝的jdk

export JAVA_HOME=/usr/jdk1.7.0_25/

本地圖片,請重新上傳

vi mapred-env.sh,直接修改把原來等號之後的去掉,填上自己的環境變數

export JAVA_HOME=/usr/jdk1.7.0_25/

本地圖片,請重新上傳

vi yarn-env.sh 修改yarn的java的環境變數

export JAVA_HOME=/usr/jdk1.7.0_25/

本地圖片,請重新上傳

同時新增hadoop的環境變數到linux的使用者的環境變數中,但是hadoop和其他不同需要配置bin和sbin目錄

export JAVA_HOME=/usr/jdk1.7.0_25

export HADOOP_HOME=/usr/hadoop-2.6.0

export SCALA_HOME=/usr/scala-2.10.4

export PATH= H O M E / b i n : JAVA_HOME/bin: P A T H : SCALA_HOME/bin: H A D O O P H O M E / b i n : HADOOP_HOME/sbin

本地圖片,請重新上傳

配置hadoop的core-site.xml檔案

vi /usr/hadoop-2.6.0/etc/hadoop/core-site.xml

<property>

    <name>hadoop.tmp.dir</name>

    <value>/usr/hadoop-2.6.0/data/tmp</value>

</property>

<property>

    <name>fs.defaultFS</name>

    <value>hdfs://localhost:9000</value>

</property>

3,配置hadoop的hdfs-site.xml檔案

<property>

    <name>dfs.replication</name>

    <value>1</value>

</property>

4,配置hadoop的mapred-site.xml檔案

<property>

    <name>mapreduce.framework.name</name>

    <value>yarn</value>

</property>

5,配置hadoop的yarn-site.xml檔案

<property>

    <name>yarn.resourcemanager.hostname</name>

    <value>dandu</value>

</property>

<property>

    <name>yarn.nodemanager.aux-services</name>

    <value>mapreduce_shuffle</value>

</property>

6,配置hadoop的slaves配置

vi /usr/hadoop-2.6.0/etc/hadoop/slaves

dandu//主機名:nodemanager和datanode地址

Hadoop的單機模式配置完成。下面就可以格式化並且開啟hadoop了。

7,格式化namenode

bin/hdfs namenode -format

本地圖片,請重新上傳

8、開啟hadoop叢集

已經配置了環境變數直接使用start-all.sh命令即可,在開啟的過程中需要多次的輸入密碼,因為沒有做SSH互信機制。確定全部程序開啟完畢後,使用命令JPS檢視,出現6個程序,如圖:

本地圖片,請重新上傳

可以使用hadoop fs -mkdir ….建立資料夾。並且使用hadoop fs -ls /檢視

本地圖片,請重新上傳

3,spark幾種模式的安裝部署

1 spark本地模式的安裝

最簡單的模式,不需要安裝spark即可使用,但是是單機模式,只能作為測試或者學習臨時使用。
1,直接執行

bin/spark-shell

本地圖片,請重新上傳
2、spark的webAPP端檢視,直接開啟網頁,輸入開啟的spark的主機名加預設埠號4040即可

http://dandu:4040

本地圖片,請重新上傳
3,在linux中新建檔案me.txt,編寫內容,使用spark來載入檔案

val test = sc.textFile(“README.md”)

本地圖片,請重新上傳

表示已經載入成功
4、使用count,進行單詞

test.count()

本地圖片,請重新上傳

res1: Long=1表示檔案只有一行內容。
5,使用first來讀取檔案的第一行內容。

test.first()

本地圖片,請重新上傳
6,使用filter過濾檔案的內容。

val lines = test.filter(line => line.contains(“ag”))

本地圖片,請重新上傳

已經統計完成但是沒有輸出結果。可以進行統計一下總共有多少

本地圖片,請重新上傳

也可以把兩次內容寫在一起test.filter(line => line.contains(“ag”)).count()

本地圖片,請重新上傳

相對複雜計算,如下表示首先把載入的檔案使用map運算元,在運算元內使用匿名函式把資料按照空格切分,在使用size求出分割後的單詞字母數量。Map的內容做完後交給reduce運算元,在reduce內使用匿名函式進行判斷大小,最終結果得到文章內的單詞最大值

test.map(line => line.split(” “).size).reduce((a, b) => if (a > b) a else b)

本地圖片,請重新上傳

繼續使用Math的運算,如下表示:首先匯入java的Math包,把資料首先給map處理,map內使用匿名函式,把資料按照空格進行分割,並使用size統計字母數,map處理完後給reduce,reduce內有一個匿名函式,匿名函式使用了Math的max來求最大最小值。

import java.lang.Math

test.map(line => line.split(” “).size).reduce((a, b) => Math.max(a, b))

本地圖片,請重新上傳

繼續做hadoop的wordcount,hadoop使用了六十行左右的程式碼,完成了一個單詞統計,在spark裡大大超出了我們的想象,只需要一行程式碼即可完成。

如下表示:定義一個常量wordCounts,把載入的test交給flatMap處理,flatMap內有一個匿名函式,匿名函式內表示把test的內容按照空格進行分割,所有處理好後交給map處理,map內有一個匿名函式,匿名函式表示把妹一個單詞都變成單詞和1的形式,然後交給reduceByKey(按照key進行統計),內有一個匿名函式,匿名函式表示進來的所有的數進行累加。

val wordCounts = test.flatMap(line => line.split(” “)).map(word => (word, 1)).reduceByKey((a, b) => a + b)

本地圖片,請重新上傳

已經計算完成,但是沒有輸出結果,需要如下運算元進行輸出。

wordCounts.collect()

本地圖片,請重新上傳

2 spark standalone模式的安裝

本地圖片,請重新上傳

1,配置spark-env.sh

HADOOP_CONF_DIR=/usr/hadoop-2.6.0/etc/hadoop

JAVA_HOME=/usr/jdk1.7.0_25/

SCALA_HOME=/usr/scala-2.10.4/

SPARK_MASTER_IP=dandu

SPARK_MASTER_PORT=7077

SPARK_MASTER_WEBUI_PORT=8080

SPARK_WORKER_CORES=1

SPARK_WORKER_MEMORY=1500m

SPARK_WORKER_PORT=7078

SPARK_WORKER_WEBUI_PORT=8081

SPARK_WORKER_INSTANCES=1

2,配置spark-defaults.conf

spark.master spark://dandu:7077

3,配置slaves

dandu

4,使用如下命令啟動spark,啟動完成後使用jps檢視程序,可以看到多了兩個程序Master和Worker

sbin/start-master.sh

sbin/start-slaves.sh

本地圖片,請重新上傳

使用 bin/spark-shell –master spark://dandu:7077開啟shell視窗,或者# bin/spark-shell –master local

本地圖片,請重新上傳

5,命令測試

使用如下命令測試,計算PI的值

/bin/spark-submit –class org.apache.spark.examples.SparkPi –master local examples/jars/spark-examples_2.11-2.1.2.jar

經過運算得到如下結果

本地圖片,請重新上傳

val wordcount = sc.textFile(“file:///testSpark/me.txt”).flatMap(x=>x.split(” “)).map(x=>(x,1)).reduceByKey((a,b)=>a+b).collect()

本地圖片,請重新上傳

如下命令皆可使用叢集測試。

val word1 = textFile.flatMap(x=>x.split(” “)).map(x=>(x,1)).reduceByKey((a,b)=>a+b).sortByKey(true).collect()

val word2 = textFile.flatMap(x=>x.split(” “)).map(x=>(x,1)).reduceByKey((a,b)=>a+b).map(x=>(x._2,x._1)).sortByKey(false).collect()

sc.textFile(“hdfs://spark.learn.com:8020/user/cyhp/spark/wc.input”).flatMap(.split(” “)).map((,1)).reduceByKey(_ + _).collect

注意:遇到如下問題的解決方式

本地圖片,請重新上傳

1、叢集的主機名和/etc/hosts能夠對應

2、確保防火牆關閉

確保有足夠大的記憶體,如果記憶體不夠,spark-env.sh的配置項SPARK_WORKER_MEMORY=1500m就不能夠滿足executor執行的使用。

在叢集執行的時候可以登入網頁檢視執行的詳細情況

此時http://dandu:8080/可以登入web瀏覽器訪問,如下:

本地圖片,請重新上傳

5.7 spark-shell執行在YARN上

HADOOP_CONF_DIR=/usr/hadoop-2.6.0/etc/hadoop/

export SPARK_EXECUTOR_MEMORY=1024M

export YARN_CONF_DIR=/usr/hadoop-2.6.0/etc/hadoop

JAVA_HOME=/usr/jdk1.7.0_25/

SCALA_HOME=/usr/scala-2.10.4/

SPARK_MASTER_IP=dandu

SPARK_MASTER_PORT=7077

SPARK_MASTER_WEBUI_PORT=8080

SPARK_WORKER_CORES=1

SPARK_WORKER_MEMORY=1500m

SPARK_WORKER_PORT=7078

SPARK_WORKER_WEBUI_PORT=8081

SPARK_WORKER_INSTANCES=1

(1)執行在yarn-client上
執行命令spark-shell –master yarn –deploy-mode client,稍等片刻即可看到如下輸出。

[[email protected] ~]# spark-shell –master yarn –deploy-mode client

本地圖片,請重新上傳

說明:從上面的spark-shell日誌中看到spark-shell –master yarn-client命令從Spark2.0開始廢棄了,換成spark-shell –master yarn –deploy-mode client。

(2)雖然已經開啟但是明視訊記憶體在問題
由於是在虛擬機器上執行,虛擬記憶體可能超過了設定的數值。在執行命令spark-shell –master yarn-client時可能報錯,異常資訊如下。

本地圖片,請重新上傳

以上為開啟過程中產生的問題

解決辦法1:
先停止YARN服務,然後修改yarn-site.xml,增加如下內容

    <name>yarn.nodemanager.vmem-check-enabled</name>

    <value>false</value>

</property>

<property>

    <name>yarn.nodemanager.vmem-pmem-ratio</name>

    <value>4</value>

將新的yarn-site.xml檔案分發到其他Hadoop節點對應的目錄下,最後在重新啟動YARN。
再執行spark-shell –master yarn-client命令時,就不會報上面異常了。

解決辦法2:

如果以上辦法沒有解決該問題,那麼增大spark-env.sh的executor和worker的記憶體

下圖為記憶體分別增大後的效果,沒有出現任何警告或者異常,問題的原因是這是JVM申請的memory不夠導致無法啟動SparkContext,

想要了解更多請加QQ:773640911