天天看點

spark之 spark 2.2.0 Standalone安裝、wordCount示範

說明:前提安裝好hadoop叢集,可參考 http://blog.csdn.net/zhang123456456/article/details/77621487

一、 scala 安裝

1、下載下傳 scala 安裝包 :https://d3kbcqa49mib13.cloudfront.net/spark-2.2.0-bin-hadoop2.7.tgz

2、上傳 scala 安裝包 

[root@hadp-master local]# pwd

/usr/local

[root@hadp-master local]# ll scala-2.11.7.tgz 

-rw-r--r--. 1 root root 28460530 Feb 25 03:53 scala-2.11.7.tgz

3、 解壓并删除安裝包

[root@hadp-master local]# tar -zxvf scala-2.11.7.tgz

[root@hadp-master local]# rm -rf scala-2.11.7.tgz

4、 配置環境變量

vi /etc/profile 添加如下

export SCALA_HOME=/usr/local/scala-2.11.7

export PATH=$PATH:$SCALA_HOME/bin

5、 生效,檢視scala版本

[root@hadp-master local]# scala -version

Scala code runner version 2.11.7 -- Copyright 2002-2013, LAMP/EPFL

6、 其他主機配置scala環境

[root@hadp-master local]# scp -r /usr/local/scala-2.11.7/ hadp-node1:/usr/local/

[root@hadp-master local]# scp -r /usr/local/scala-2.11.7/ hadp-node2:/usr/local/

[root@hadp-master local]# scp -r /etc/profile hadp-node1:/etc/profile

profile 100% 2414 2.4KB/s 00:00 

[root@hadp-master local]# scp -r /etc/profile hadp-node2:/etc/profile

profile 100% 2414 2.4KB/s 00:00

二、 spark 安裝

1、 下載下傳 spark 安裝包,上傳

[root@hadp-master local]# ll spark-2.2.0-bin-hadoop2.7.tgz 

-rw-r--r--. 1 root root 203728858 Feb 25 04:20 spark-2.2.0-bin-hadoop2.7.tgz

2、 解壓

[root@hadp-master local]# tar -zxvf spark-2.2.0-bin-hadoop2.7.tgz

3、 配置環境變量

vi /etc/profile 添加如下内容

export SPARK_HOME=/usr/local/spark-2.2.0-bin-hadoop2.7

export PATH=$PATH:$SPARK_HOME/bin

4、配置Spark環境

[root@hadp-master local]# cd spark-2.2.0-bin-hadoop2.7/conf/

[root@hadp-master conf]# ll

total 32

-rw-r--r--. 1 500 500 996 Jul 1 2017 docker.properties.template

-rw-r--r--. 1 500 500 1105 Jul 1 2017 fairscheduler.xml.template

-rw-r--r--. 1 500 500 2025 Jul 1 2017 log4j.properties.template

-rw-r--r--. 1 500 500 7313 Jul 1 2017 metrics.properties.template

-rw-r--r--. 1 500 500 865 Jul 1 2017 slaves.template

-rw-r--r--. 1 500 500 1292 Jul 1 2017 spark-defaults.conf.template

-rwxr-xr-x. 1 500 500 3699 Jul 1 2017 spark-env.sh.template

4.1

[root@hadp-master conf]# cp spark-env.sh.template spark-env.sh

[root@hadp-master conf]# vi spark-env.sh 末尾添加如下:

export JAVA_HOME=/usr/local/jdk1.8.0_131

export HADOOP_HOME=/usr/local/hadoop/hadoop-2.7.4/

export HADOOP_CONF_DIR=/usr/local/hadoop/hadoop-2.7.4/etc/hadoop

export SPARK_MASTER_IP=hadp-master

export SPARK_WORKER_MEMORY=1g

export SPARK_WORKER_CORES=2

export SPARK_WORKER_INSTANCES=1

變量說明 

- JAVA_HOME:Java安裝目錄 

- SCALA_HOME:Scala安裝目錄 

- HADOOP_HOME:hadoop安裝目錄 

- HADOOP_CONF_DIR:hadoop叢集的配置檔案的目錄 

- SPARK_MASTER_IP:spark叢集的Master節點的ip位址 

- SPARK_WORKER_MEMORY:每個worker節點能夠最大配置設定給exectors的記憶體大小 

- SPARK_WORKER_CORES:每個worker節點所占有的CPU核數目 

- SPARK_WORKER_INSTANCES:每台機器上開啟的worker節點的數目

4.2 

[root@hadp-master conf]# cp slaves.template slaves

[root@hadp-master conf]# vi slaves 添加如下

# A Spark Worker will be started on each of the machines listed below.

hadp-node1

hadp-node2

4.3 

[root@hadp-master local]# scp -r spark-2.2.0-bin-hadoop2.7/ hadp-node1:/usr/local

[root@hadp-master local]# scp -r spark-2.2.0-bin-hadoop2.7/ hadp-node2:/usr/local

[root@hadp-master local]# scp /etc/profile hadp-node1:/etc/

profile 100% 2492 2.4KB/s 00:00 

[root@hadp-master local]# scp /etc/profile hadp-node2:/etc/

profile 100% 2492 2.4KB/s 00:00

5、啟動Spark叢集

5.1

因為我們隻需要使用hadoop的HDFS檔案系統,是以我們并不用把hadoop全部功能都啟動。

[root@hadp-master sbin]# pwd

/usr/local/hadoop/hadoop-2.7.4/sbin

[root@hadp-master sbin]# ./start-dfs.sh 

Starting namenodes on [hadp-master]

hadp-master: starting namenode, logging to /usr/local/hadoop/hadoop-2.7.4/logs/hadoop-root-namenode-hadp-master.out

hadp-node2: starting datanode, logging to /usr/local/hadoop/hadoop-2.7.4/logs/hadoop-root-datanode-hadp-node2.out

hadp-node1: starting datanode, logging to /usr/local/hadoop/hadoop-2.7.4/logs/hadoop-root-datanode-hadp-node1.out

Starting secondary namenodes [0.0.0.0]

0.0.0.0: starting secondarynamenode, logging to /usr/local/hadoop/hadoop-2.7.4/logs/hadoop-root-secondarynamenode-hadp-master.out

[root@hadp-master sbin]# jps

4914 NameNode

5235 Jps

5082 SecondaryNameNode

5.2

/usr/local/spark-2.2.0-bin-hadoop2.7/sbin

[root@hadp-master sbin]# ./start-all.sh 

starting org.apache.spark.deploy.master.Master, logging to /usr/local/spark-2.2.0-bin-hadoop2.7/logs/spark-root-org.apache.spark.deploy.master.Master-1-hadp-master.out

hadp-node1: starting org.apache.spark.deploy.worker.Worker, logging to /usr/local/spark-2.2.0-bin-hadoop2.7/logs/spark-root-org.apache.spark.deploy.worker.Worker-1-hadp-node1.out

hadp-node2: starting org.apache.spark.deploy.worker.Worker, logging to /usr/local/spark-2.2.0-bin-hadoop2.7/logs/spark-root-org.apache.spark.deploy.worker.Worker-1-hadp-node2.out

5301 Master

5369 Jps

[root@hadp-node1 scala-2.11.7]# jps

4305 DataNode

4451 Worker

4500 Jps

[root@hadp-node2 ~]# jps

4444 Worker

4301 DataNode

4494 Jps

-- 進入Spark的WebUI界面

http://10.100.25.30:8080/

-- 進入 Spark-shell

[root@hadp-master sbin]# spark-shell

Welcome to

____ __

/ __/__ ___ _____/ /__

_\ \/ _ \/ _ `/ __/ '_/

/___/ .__/\_,_/_/ /_/\_\ version 2.2.0

/_/

Using Scala version 2.11.8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_131)

Type in expressions to have them evaluated.

Type :help for more information.

scala>

文本檔案中随意輸入一些單詞,用空格隔開,我們會編寫Spark程式對該檔案進行單詞詞頻統計。

[root@hadp-master ~]# cat workCount.txt 

andy leaf

andy taozi

andy hello

[root@hadp-master ~]# hadoop fs -put workCount.txt /tmp

[root@hadp-master ~]# hadoop fs -ls /tmp

Found 3 items

drwx------ - root supergroup 0 2018-02-01 05:48 /tmp/hadoop-yarn

drwx-wx-wx - root supergroup 0 2018-02-25 05:08 /tmp/hive

-rw-r--r-- 1 root supergroup 42 2018-02-25 06:05 /tmp/workCount.txt

[root@hadp-master ~]# hadoop fs -cat /tmp/workCount.txt

詞頻統計

scala> val textFile = sc.textFile("hdfs://hadp-master:9000/tmp/workCount.txt")

scala> val wordCount = textFile.flatMap(line => line.split(" ")).map(word => (word, 1)).reduceByKey((a, b) => a + b)

scala> wordCount.collect()

res0: Array[(String, Int)] = Array((leaf,2), (andy,4), (hello,1), (taozi,1))

上面隻給出了代碼,省略了執行過程中傳回的結果資訊,因為傳回資訊很多。

下面簡單解釋一下上面的語句。

textFile包含了多行文本内容,textFile.flatMap(line => line.split(” “))會周遊textFile中的每行文本内容,當周遊到其中一行文本内容時,會把文本内容指派給變量line,并執行Lamda表達式line => line.split(” “)。line => line.split(” “)是一個Lamda表達式,左邊表示輸入參數,右邊表示函數裡面執行的處理邏輯,這裡執行line.split(” “),也就是針對line中的一行文本内容,采用空格作為分隔符進行單詞切分,從一行文本切分得到很多個單詞構成的單詞集合。這樣,對于textFile中的每行文本,都會使用Lamda表達式得到一個單詞集合,最終,多行文本,就得到多個單詞集合。textFile.flatMap()操作就把這多個單詞集合“拍扁”得到一個大的單詞集合。

然後,針對這個大的單詞集合,執行map()操作,也就是map(word => (word, 1)),這個map操作會周遊這個集合中的每個單詞,當周遊到其中一個單詞時,就把目前這個單詞指派給變量word,并執行Lamda表達式word => (word, 1),這個Lamda表達式的含義是,word作為函數的輸入參數,然後,執行函數處理邏輯,這裡會執行(word, 1),也就是針對輸入的word,建構得到一個tuple,形式為(word,1),key是word,value是1(表示該單詞出現1次)。

程式執行到這裡,已經得到一個RDD,這個RDD的每個元素是(key,value)形式的tuple。最後,針對這個RDD,執行reduceByKey((a, b) => a + b)操作,這個操作會把所有RDD元素按照key進行分組,然後使用給定的函數(這裡就是Lamda表達式:(a, b) => a + b),對具有相同的key的多個value進行reduce操作,傳回reduce後的(key,value),比如(“hadoop”,1)和(“hadoop”,1),具有相同的key,進行reduce以後就得到(“hadoop”,2),這樣就計算得到了這個單詞的詞頻。

本文轉自 張沖andy 部落格園部落格,原文連結: http://www.cnblogs.com/andy6/p/8468862.html  ,如需轉載請自行聯系原作者