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=$HOME/bin:$JAVA_HOME/bin:$PATH

使配置文件生效source ~/.bash_profile

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

2、安裝scala

在用戶下的環境變數中添加scala的目錄即可

export SCALA_HOME=/usr/scala-2.10.4

export PATH=$HOME/bin:$JAVA_HOME/bin:$PATH:$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=$HOME/bin:$JAVA_HOME/bin:$PATH:$SCALA_HOME/bin:$HADOOP_HOME/bin:$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即可

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/us").flatMap(_.split(" ")).map((_,1)).reduceByKey(_ + _).collect

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

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

2、確保防火牆關閉

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

在集群運行的時候可以登錄網頁查看執行的詳細情況

此時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,稍等片刻即可看到如下輸出。

[root@node1 ~]# 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,增加如下內容

<property>

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

<value>false</value>

</property>

<property>

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

<value>4</value>

</property>

將新的yarn-site.xml文件分發到其他Hadoop節點對應的目錄下,最後在重新啟動YARN。

再執行spark-shell --master yarn-client命令時,就不會報上面異常了。

解決辦法2:

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

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

想了解更多資料請加QQ:773640911


推薦閱讀:

MapReduce Shuffle深入理解
基於Alluxio的HDFS多集群統一入口的實現
《Hadoop權威指南》書摘-初識Hadoop
Hadoop機架感知
Spark學習總結(一)

TAG:Hadoop | MapReduce | Spark |