1. 程式人生 > >Mapreduce,Hive,Spark平臺搭建

Mapreduce,Hive,Spark平臺搭建

Mapreduce,Hive,Spark平臺搭建

歡迎光臨我的github page

說明

平臺搭建成功後,使用Scala語言進行演算法設計和應用的開發。文末有使用scala設計的Item-Based Collaboration Filtering和SlopeOne 兩個協同過濾演算法

一、搭建準備

VMWare Workstation

Ubuntu 14.04 Server.iso

Xshell——遠端連線主機終端

Server 版安裝配置
新建三臺虛擬機器,安裝時選擇OpenSHH Server預安裝環境

一臺作為master

另兩臺作為slave,命名為slave1和slave2

master的配置比slave要稍微高一些

IP 設定
VMnet8是VM配置的虛擬網絡卡

設定VMnet8,選擇「NAT 模式」

設定子網IP (192.168.142.0)和子網掩碼(255.255.255.0)

Ubuntu 系統的登入和 IP 的固化

輸入 ifconfig 回車查詢當前的 ip 地址,準備將其長期繫結到當前虛擬機器,為了方便後續實驗。

master的ip:192.168.142.128

slave1的ip:192.168.142.130

slave2的ip:192.168.142.132

此時的 IP 地址是由 DHCP 伺服器動態分配的,為了讓這個 IP 地址能一直與這臺
虛擬機器繫結,我們需要改變系統啟動時獲取 IP 的方式,從 DHCP 切換到靜態 IP
地址,為此需要編輯 Linux 的網絡卡配置檔案(/etc/network/interfaces),輸入命令

sudo vi /etc/network/interfaces

回車,可以看到 eth0 的 IP 獲取方式是 dhcp:

此時需要修改 ip 的獲取方式從 DHCP 到 static,設定靜態的 ip 地址、子網掩碼和
預設閘道器。

把這個檔案更改為:

#This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo iface lo inet loopback # The primary network interface auto eth0 iface eth0 inet static address 192.168.142.128 gateway 192.168.142.2 netmask 255.255.255.0

為了進一步固化 DNS 伺服器 IP,輸入

sudo vi /etc/resolvconf/resolv.conf.d/bas

將裡面的內容替換成nameserver 192.168.142.2,vi 儲存

系統的登入和 IP 的固化重啟後完成

使用Xshell連線三個虛擬機器終端

Xshell.png

下載lrzsz工具
用於虛擬機器與宿主機之間檔案的上傳和下載

sudo apt-get update

sudo apt-get install lrzsz

rz命令,從宿主機傳檔案至虛擬機器

sz命令,從虛擬機器獲取檔案至宿主機

二、Hadoop 及相關環境的安裝

開源分散式平臺 Hadoop 可以聚合多個計算機形成叢集,在各個節點上安裝配置完Hadoop後可以直接提交分散式程式碼到叢集計算。本次實驗可以在個人電腦上用VMware完成,或使用天河二號上的 OpenStack平臺建立記憶體為2G的虛擬機器資源完成。

安裝包準備

Hadoop環境——hadoop-2.6.0.tar.gz

Java環境——jdk-8u60-linux-x64.tar.gz

虛擬機器ip配置測試

sudo vi /etc/hosts #編輯 /etc/hosts 檔案,插入角色與 IP 對映

ping master -c 4 #嘗試用角色名 ping 其它主機,一次 4 個包

hosts檔案修改為:

127.0.0.1       localhost

192.168.142.128 master
192.168.142.130 slave1
192.168.142.132 slave2

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

三個虛擬機器能夠使用主機名(不是ip)ping通即配置正確

配置 SSH 無密碼登入
保障了 Hadoop 可以通過角色名在局域網裡找到各個節點,為了讓 Hadoop 可以進
一步讀取、操作各個節點,需要賦予其登入的許可權,意即讓 Hadoop 擁有各個節點的普通使用者賬
號,從而在需要操作各個節點時直接用對應的賬號登入獲取操作許可權。SSH 協議可以為節點上的
賬戶建立唯一的公私鑰,然後利用這些公私鑰實現無密碼登入,從而讓 Hadoop 直接繞開傳統的
賬號密碼登入過程,直接用公私鑰訪問節點。

生成各個節點的 SSH 公私鑰:

cd ~/.ssh # 如果沒有該目錄,先執行一次 ssh localhost
rm ./id_rsa* # 刪除之前生成的公匙(如果有)
ssh-keygen -t rsa # 一直按回車就可以

為了讓每個節點都擁有其它節點的公鑰,要先把所有公鑰放進一個檔案裡

  1. 在 master 上,將 master 的公鑰複製到 authorized_keys 檔案裡:
cat ./id_rsa.pub >> ./authorized_keys # cat 命令用於提取內容,>>輸出重定向
  1. 將 slave1、slave2 的公鑰檔案傳送給 master,此時的傳送要輸入密碼:
scp ~/.ssh/id_rsa.pub hadoop@master:/home/hadoop/
  1. Master 將接收到的 slave1 的公鑰檔案裡的內容提取追加到 authorized_keys 文
    件裡:
cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
  1. 將 slave2 的公鑰內容也放進 authorized_keys 檔案,然後將
    authorized_keys 檔案分別傳送到兩個 slave 的~/.ssh/下:
scp ~/.ssh/authorized_keys hadoop@slave1:/home/hadoop/.ssh/

搭建成功表現:每個節點嘗試使用 ssh <角色名>的命令直接登入其它節點,直到每個節點都可以
成功免密碼登入其它節點,則免密碼登入配置成功! 如在 master 上輸入:ssh slave1即可直接登陸slave1的虛擬機器,不需要再輸入密碼登陸,便於後續實驗操作。

配置 Java環境和Hadoop環境

安裝包準備:
jdk-8u60-linux-x64.tar

hadoop-2.6.0.tar.gz

  1. 安裝 JDK
    將上傳的 JDK 壓縮包(jdk-8u60-linux-x64.tar)放到根目錄/home/hadoop/,解
    壓並放到指定的資料夾:
sudo mkdir -p /usr/local/jvm
tar -zxvf jdk-8u60-linux-x64.tar.gz -C /usr/local/jvm
  1. 安裝 Hadoop

在各個節點上將 hadoop 解壓到/usr/local/目錄下,改變其所屬使用者和所屬組(讓
hadoop 軟體用 hadoop 賬號登入時對 hadoop 資料夾擁有最高許可權):

tar -zxvf hadoop-2.6.0.tar.gz -C /usr/local/
sudo mv /usr/loca/hadoop-2.6.0 /usr/local/hadoop #mv 實現重新命名
sudo chown -R hadoop:hadoop /usr/local/hadoop

將當前的 PATH 環境變數提取儲存到 P.sh

環境變數如下:

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/local/jvm/jdk1.8.0_60/bin:/usr/local/jvm/jdk1.8.0_60/bin:/usr/local/hadoop/bin:/sbin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/local/jvm/jdk1.8.0_60/bin:/usr/local/hive/bin

export HADOOP_HOME=/usr/local/hadoop
export HIVE_HOME=/usr/local/hive
export JAVA_HOME=/usr/local/jvm/jdk1.8.0_60
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$($HADOOP_HOME/bin/hadoop classpath):$CLASSPATH
export PATH=$PATH:${JAVA_HOME}/bin:$HADOOP_HOME/bin:$HADOOP/sbin:$PATH:${HIVE_HOME}/bin

之後每次重啟系統都需要重定向環境變數

echo $PATH >> ~/setenv.sh
vi ~/P.sh

使環境變數生效:

source ~/setenv.sh

檢視java版本資訊,如果出現版本資訊則環境配置成功

java -version
javac -version

重點:hadoop節點配置

修改 slaves 檔案,讓 hadoop 知道自己可以聚合的節點名(保證與 hosts 裡的角色
名一致)

vi /usr/local/hadoop/etc/hadoop/slaves
master
slave1
slave2

修改 core-site.xml 檔案如下:
配置埠和路徑

vi /usr/local/hadoop/etc/hadoop/core-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- Put site-specific property overrides in this file. -->

<configuration>
        <property>
                <name>fs.default.name</name>
                <value>hdfs://master:9000</value>
        </property>
        <property>
                <name>hadoop.tmp.dir</name>
                <value>/usr/local/hadoop/tmp</value>
        </property>
</configuration>

修改 hdfs-site.xml 檔案如下(啟用所有節點作為 DataNode,包括master故 replication_value=3):
當節點增多時,需要更改配置檔案,如主機名、IP地址、節點資訊等配置都要重新修改

vi /usr/local/hadoop/etc/hadoop/hdfs-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
        <property>
                <name>dfs.replication</name>
                <value>3</value>
        </property>
        <property>
                <name>dfs.name.dir</name>
                <value>/usr/local/hadoop/hdfs/name</value>
        </property>
        <property>
                <name>dfs.data.dir</name>
                <value>/usr/local/hadoop/hdfs/data</value>
        </property>
</configuration>

修改 mapred-site.xml 檔案如下:

vi /usr/local/hadoop/etc/hadoop/mapred-site.xml

yarn為叢集的表示

<configuration>

        <property>
                <name>mapreduce.framework.name</name>
                <value>yarn</value>
        </property>
</configuration>

修改 yarn-site.xml 檔案如下(啟用 yarn 資源管理器),為大資料計算分配計算、儲存資源等

vi /usr/local/hadoop/etc/hadoop/yarn-site.xml
<configuration>

<!-- Site specific YARN configuration properties -->
        <property>
                <name>yarn.nodemanager.aux-services</name>
                <value>mapreduce_shuffle</value>
        </property>
        <property>
                <name>yarn.log-aggregation-enable</name>
                <value>true</value>
        </property>
</configuration>

修改 hadoop-env.sh 檔案,將 25 行 JAVA_HOME 的值換成 jdk 所在的路徑:

vi /usr/local/hadoop/etc/hadoop/hadoop-env.sh

當前jdk路徑為:JAVA_HOME=/usr/local/jvm/jdk1.8.0_60

重點:hadoop啟動及驗證

對 hadoop 進行 NameNode 的格式化:
/usr/local/hadoop/bin/hdfs namenode -format

啟動 hdfs 和 yarn,並在各個節點上輸入 jps 檢視啟動的服務:

只需在master上啟動

/usr/local/hadoop/sbin/start-dfs.sh
/usr/local/hadoop/sbin/start-yarn.sh

或者
/usr/local/hadoop/sbin/start-all.sh

jps # 每個節點都檢視一次

jps.png

嘗試在 hdfs 上建立輸入資料夾input,並把 測試的txt文字檔案放進去:

/usr/loca/hadoop/bin/hdfs dfs -mkdir /input
/usr/local/hadoop/bin/hdfs dfs -put /usr/local/hadoop/a.txt /input
/usr/local/hadoop/bin/hdfs dfs -put /usr/local/hadoop/b.txt /input
a.txt
Hello world
bye hadoop

b.txt
bye world
hello hadoop hadoop

可以在外部瀏覽器輸入 master 的 IP 地址和 50070 埠檢視 hdfs 上的檔案

輸入:http://192.168.142.128:50070

sumary-hadoop.png

hadoopdatanode.png

hadoop-input.png

嘗試用 寫一個簡單的 WordCount.java程式碼,統計上面文字檔案中每個單詞
出現的頻數:
hadoop的工作是把大任務切分成小jobs,再通過資源管理器分配儲存和計算等資源給相應hadoop叢集內的節點

/usr/local/hadoop/bin/hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-
examples-2.6.0.jar wordcount /input /output

/usr/local/hadoop/bin/hdfs dfs -cat /output/* #檢視輸出結果

hadoop-output.png

hadoop 搭建完成

三、Hive 資料倉庫安裝部署及測試

安裝包準備

apache-hive-1.2.0-bin.tar.gz

mysql-connector-java-5.1.44-bin.jar

testdata.zip

Hive 是建立在 Hadoop 上的資料倉庫基礎構架。它提供了一系列的工
具,可以用來 進行資料提取轉化載入(ETL) ),這是一種可以儲存、查詢和分析
儲存在 Hadoop 中的大規模資料的機制。另外,它定義了簡單的類 SQL 查詢
語言,稱為 HQL,允許熟悉 SQL 的使用者查詢資料。

如果是實施的交通資料,那麼搭建動態的資料倉庫是很有必要的。

原理圖

Hive的工作原理簡單來說就是一個查詢引擎

Hive的架構圖:
hive架構.png

Hive的工作原理如下:
接收到一個sql,後面做的事情包括:
1.詞法分析/語法分析
使用antlr將SQL語句解析成抽象語法樹-AST

2.語義分析
從Megastore獲取模式資訊,驗證SQL語句中隊表名,列名,以及資料型別的檢查和隱式轉換,以及Hive提供的函式和使用者自定義的函式(UDF/UAF)

3.邏輯計劃生產
生成邏輯計劃-運算元樹

4.邏輯計劃優化
對運算元樹進行優化,包括列剪枝,分割槽剪枝,謂詞下推等

5.物理計劃生成
將邏輯計劃生產包含由MapReduce任務組成的DAG的物理計劃

6.物理計劃執行
將DAG傳送到Hadoop叢集進行執行

7.將查詢結果返回

流程如下圖:
hive流程.png

hive和mapreduce共同運作

hive原理.png

使用者介面
CLI:就是 Shell 命令列.

JDBC:這個是 Hive 的 java 介面,與通常的資料庫類似.

WebGUI:網頁介面。

驅動元件(Driver)
Hive 的編譯、解析、優化轉化為 MapReduce 任務提交給 Hadoop 進行分派
和執行相應的任務。

元資料元件(Metatore)

儲存著 hive 的元資料資訊,包括表名、列、分割槽和屬性等。預設資料庫為
Derby,為了更健壯,一般使用 Mysql 來代替。另外,MetaStore 分為服務
端和客戶端,服務端提供給客戶端對 RDBMS 的訪問服務。

安裝 Mysql

sudo apt-get install mysql-server

安裝完成後設定資料庫root使用者的密碼,123456

配置 Mysql

mysql –uroot –p 的 使用初始化時設定的 root 密碼登入

新增 hive 使用者,並給於許可權:

create user 'hive' identified by 'hive';
grant all privileges on *.* to 'hive' with grant option;
flush privileges;

Hive 安裝與配置

  1. 安裝 hive

將 apache-hive-1.2.0-bin.tar.gz 解壓在/usr/local 目錄下

sudo tar –zxvf apache-hive-1.2.0-bin.tar.gz –C /usr/local

重新命名資料夾為 hive 資料夾,並將其許可權修改成 hadoop

mv /usr/local/ apache-hive-1.2.0-bin /usr/local/hive
sudo chown -R hadoop:hadoop /usr/local/hive

把 mysql 的 jdbc 的驅動 mysql-connector-java-5.1.44-bin.jar 拷貝到
\usr\local\hive\lib 目錄下

cp mysql-connector-java-5.1.44-bin.jar /usr/local/hive/lib
  1. 配置環境變數

修改之前的P.sh

環境變數如下:

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/local/jvm/jdk1.8.0_60/bin:/usr/local/jvm/jdk1.8.0_60/bin:/usr/local/hadoop/bin:/sbin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/local/jvm/jdk1.8.0_60/bin:/usr/local/hive/bin

export HADOOP_HOME=/usr/local/hadoop
export HIVE_HOME=/usr/local/hive
export JAVA_HOME=/usr/local/jvm/jdk1.8.0_60
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$($HADOOP_HOME/bin/hadoop classpath):$CLASSPATH
export PATH=$PATH:${JAVA_HOME}/bin:$HADOOP_HOME/bin:$HADOOP/sbin:$PATH:${HIVE_HOME}/bin

修改完成後source P.sh

  1. Hive 的配置

hive 有關於 metastore 具有三種配置,分別為內嵌模式、本地元儲存以及遠端
在 元儲存.

目前在 namenode 上配置服務端,datanode 上配置為客戶端,在 datanode
行 進行 hql 時通過遠端模式訪問在 namenode 的元資料。(實際場景 metastore 的資料庫可以在任何節點,以減輕 namenode 的壓力)

在 /usr/local/hive/conf 目錄下建立 hive-site.xml 檔案:

sudo vi /usr/local/hive/conf/hive-site.xml

在 server 端配置 hive-stie.xml,修改後儲存

ConnectionURL 屬性用於設定 mysql 服務所在地址與埠,這裡 mysql-server 在 在
本地, hive.metastore.warehouse.dir 是在 HDFS 上的檔案路徑,hive.metastore.local 的 的
為 值為 true 表示對 metastore 的訪問為本地模式。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
    <property>
        <name>javax.jdo.option.ConnectionURL</name>
        <value>jdbc:mysql://localhost:3306/db_hive?createDatabaseIfNotExist=true</value>
    </property>

    <property>
        <name>javax.jdo.option.ConnectionDriverName</name>
        <value>com.mysql.jdbc.Driver</value>
    </property>

    <property>
        <name>javax.jdo.option.ConnectionUserName</name>
        <value>hive</value>
    </property>

    <property>
        <name>javax.jdo.option.ConnectionPassword</name>
        <value>hive</value>
    </property>

    <property>
        <name>hive.metastore.warehouse.dir</name>
        <value>/hive/warehouse</value>
    </property>

    <property>
        <name>hive.metastore.local</name>
        <value>true</value>
    </property>


    /////////////////////////////////////////////////////////////////
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>192.168.142.128</value>
    </property>

    <property>
        <name>yarn.resourcemanager.address</name>
        <value>master:8032</value>
    </property>

    <property>
        <name>yarn.resourcemanager.schedulaer.address</name>
        <value>master:8030</value>
    </property>

    <property>
        <name>yarn.resourcemanager.resource-tracker.address</name>
        <value>master:8031</value>
    </property>


</configuration>

在 client 端配置 hive-stie.xml,修改後儲存

hive.metastore.uris 項指向提供資料庫訪問的 metastore 服務端,值須為 IP 地 地
了 址。由於設定了 uris 的內容,因而對於 metastore 的訪問預設為遠端模式。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
    <property>
        <name>hive.metastore.warehouse.dir</name>
        <value>/hive/warehouse</value>
    </property>

    <property>
        <name>hive.metastore.local</name>
        <value>false</value>
    </property>

    <property>
        <name>hive.metastore.uris</name>
        <value>thrift://192.168.142.128:9083</value>
    </property>


</configuration>
  1. 執行 Hive

檢查 jline 版本,hive 與 hadoop 的 jline 版本不對應可能導致執行錯誤,
先刪除之前的舊版本,然後將 hive 上 jline 的 jar 包拷貝至 hadoop 的對應目錄下:

cp /usr/local/hive/lib/jline-2.12.jar /usr/local/hadoop/share/hadoop/yarn/lib

更新 yarn-site.xml 配置

重要:為了使得 mapreduce 程式可以在各個節點提交,對各個節點的 hive-site.xml 配置檔案 追加下 以下 property

其中 yarn.resourcemanager.hostname 配置的是執行 ResourceManager 程序所在
的主機(master 節點)IP 地址。

<property>
        <name>yarn.resourcemanager.hostname</name>
        <value>192.168.142.128</value>
    </property>

    <property>
        <name>yarn.resourcemanager.address</name>
        <value>master:8032</value>
    </property>

    <property>
        <name>yarn.resourcemanager.schedulaer.address</name>
        <value>master:8030</value>
    </property>

    <property>
        <name>yarn.resourcemanager.resource-tracker.address</name>
        <value>master:8031</value>
    </property>

只需在master上進行:

啟動hadoop:/usr/local/hadoop/sbin/start-all.sh

初始化 Schema

/usr/local/hive/bin/./schematool –dbType mysql –initSchema

服務端啟動 metastore 服務

hive --service metastore

接著在slave1和slave2啟動hive的客戶端

hive
  1. 測試hive資料倉庫:

匯入資料可以是使用Tab間隔的原資料形式,從本地匯入。

也可以從 HDFS 中匯入。與本地的類似,只要把本地載入的命令中’local’去掉,輸入路徑即為HDFS 上的路徑。

list1.txt
10001   1003    c2sld54sfkid    paul
10002   1014    d5dsd32sdkif    rose
10005   1008    e0dlp92mklpi    harry
10203   1099    p3skd29llsie    bob
list2.txt
20004   2991    e2ifp12adlpi    alice
20132   1014    l8doo32haodp    jerry
50232   3022    d3sod41dsooo    smith
40001   1023    s3dfdlksdfj3    rose

登入 hive 客戶端,建立 user_info 表

>hive
>create table user_info(uid int, did int, pwd string, uname string)
>row format delimited
>fields terminated by ‘\t’
>lines terminated by ‘\n’;

把資料載入到表:

load data local inpath ‘list*.txt’ into table user_info;

將查詢結果插入到表

說明:將所有名為 rose 的記錄插入到 account_rose 表中

先建立 account_rose 表

create table user_info(uid int,did int,pwd string,uname string)
row format delimited
fields terminated by '\t'
lines terminated by '\n'

select * from user_info;

hive-result.png

Hive資料倉庫建立成功

動態資料倉庫可以使用jsp進行動態的新增,結合Android、html或者其他視覺化工具進行操作

四、spark的配置和測試

Spark 是專為大規模資料處理而設計的快速通
用的計算引擎,有與 hadoop 相似的開源叢集計算環境,但是能在某些工作負載方面表現得
更加優越,換句話說,spark 啟用了記憶體分佈資料集,除了能夠提供互動式查詢外,它還可
以優化迭代工作負載。
spark 有三種模式,分別是 standalone、spark on yarn,spark on mesos,這裡我們選擇 spark on
yarn 的模式,即在我們之前部署的 hadoop 叢集上部署 spark。

我的電腦是 1G 執行記憶體,所以設定的是 1000M,executor cores 是 2(經過測試 driver memory 和 worker。memory 如果小於 512M,executor cores 大於 2 的話用 spark 提交任務會很容易就崩死,提示的是 SparkContext 相關錯誤)。

  1. 將 spark-1.6.0-bin-hadoop2.6.tgz 放到/home/hadoop/目錄下
  2. 解壓檔案到/usr/local 下,重新命名資料夾並修改屬主
sudo tar -xzvf spark-1.6.0-bin-hadoop2.6.tgz -C /usr/local/

sudo mv /usr/local/spark-1.6.0-bin-hadoop2.6 /usr/local/spark

sudo chown -R hadoop:hadoop /usr/local/spark/
  1. 利用 spark 的 template 檔案生成配置檔案
cp /usr/local/spark/conf/spark-env.sh.template /usr/local/spark/conf/spark-env.sh


cp /usr/local/spark/conf/slaves.template /usr/local/spark/conf/slaves


cp /usr/local/spark/conf/spark-defaults.conf.template /usr/local/spark/conf/spark-defaults.conf
  1. 修改 spark-env.sh,在檔案末尾新增如下內容
export HADOOP_HOME=/usr/local/hadoop
export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-amd64
export HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop
export SPARK_MASTER_IP=master
export SPARK_LOCAL_DIRS=/usr/local/spark
export SPARK_WORKER_MEMORY=1000M
export SPARK_EXECUTOR_MEMORY=1000M
export SPARK_DRIVER_MEMORY=1000M
export SPARK_EXECUTOR_CORES=3

這一步是為了配置spark的執行引數,hadoop_conf_dir的設定是為了讓spark執行在yarn上。
幾個 memory 命令分別用於設定 driver 和 executor 程序的記憶體,executor_cores 設定的是每個
executor 程序的 CPU cores 的數量,這些設定請依據自己的電腦實際可負載情況設定。

  1. 修改 slaves 檔案,在檔案末尾新增其他節點 IP
vi /usr/local/spark/conf/slaves

修改成

master
slave1
slave2
  1. 修改 spark-defaults.conf,在檔案末尾新增如下內容:
vi /usr/local/spark/conf/spark-defaults.conf
spark.executor.extraJavaOptions  -XX:+PrintGCDetails -Dkey=value -Dnumbers="one two three"
spark.eventLog.enabled           true
spark.eventLog.dir               hdfs://master:9000/historyserverforSpark
spark.yarn.historyServer.address master:18080
spark.history.fs.logDirectory    hdfs://master:9000/historyserverforSpark
spark.speculation                true

這一步是為儲存 spark 的執行日誌,並且是儲存到 hdfs 上的資料夾裡面,方便運維。

  1. 將配置好的 spark 資料夾傳到 slave1、slave2。

  2. 配置 hadoop:修改 yarn-site.xml 檔案,新增新的屬性。

<configuration>

<!-- Site specific YARN configuration properties -->
        <property>
                <name>yarn.nodemanager.aux-services</name>
                <value>mapreduce_shuffle</value>
        </property>
        <property>
                <name>yarn.log-aggregation-enable</name>
                <value>true</value>
        </property>
</configuration>

這一步是為了開啟日誌整合功能,spark 在遇到問題時,利用命令
/usr/local/hadoop/bin/yarn logs -applicationId XXX
即可檢視 applicationId 為 XXX 的例項的執行日誌

執行spark

  1. 開啟hadoop叢集
/usr/local/hadoop/sbin/start-all.sh
  1. 在 spark 中建立 historyserverforSpark 資料夾

這個資料夾可以在網頁上看見(hdfs)

/usr/local/hadoop/bin/hdfs dfs -mkdir historyserverforSpark
  1. 執行 spark
/usr/local/spark/sbin/start-all.sh

可以進入 spark 的 webui 檢視是否成功啟動:192.1468.142.128:8080/
可以進入 spark 的 webui 檢視節點是否成功啟動:192.1468.142.128:8080/cluster

sparkstartall.png

  1. 執行 history-server,這樣應用執行完的結果可以通過 webui 看到:192.1468.142.128:18080
usr/local/spark/sbin/start-history-server.sh

spark執行歷史

spark

執行spark例項

  1. 本地模式
/usr/local/spark/bin/run-example SparkPi > SparkPiRes.txt

vi SparkPiRes.txt

Piresult.png

  1. 在yarn叢集上執行

執行可以有client模式和cluster模式
區別如下

When run SparkSubmit –class [mainClass], SparkSubmit will call a childMainClass which is

  1. client mode, childMainClass = mainClass

  2. standalone cluster mde, childMainClass = org.apache.spark.deploy.Client

  3. yarn cluster mode, childMainClass = org.apache.spark.deploy.yarn.Client

The childMainClass is a wrapper of mainClass. The childMainClass will be called in SparkSubmit, and if cluster mode, the childMainClass will talk to the the cluster and launch a process on one woker to run the mainClass.

ps. use “spark-submit -v” to print debug infos.

Yarn client: spark-submit -v –class “org.apache.spark.examples.JavaWordCount” –master yarn JavaWordCount.jar
childMainclass: org.apache.spark.examples.JavaWordCount
Yarn cluster: spark-submit -v –class “org.apache.spark.examples.JavaWordCount” –master yarn-cluster JavaWordCount.jar
childMainclass: org.apache.spark.deploy.yarn.Client

Standalone client: spark-submit -v –class “org.apache.spark.examples.JavaWordCount” –master spark://aa01:7077 JavaWordCount.jar
childMainclass: org.apache.spark.examples.JavaWordCount
Stanalone cluster: spark-submit -v –class “org.apache.spark.examples.JavaWordCount” –master spark://aa01:7077 –deploy-mode cluster JavaWordCount.jar
childMainclass: org.apache.spark.deploy.rest.RestSubmissionClient (if rest, else org.apache.spark.deploy.Client)

Taking standalone spark as example, here is the client mode workflow. The mainclass run in the driver application which could be reside out of the cluster.

client 模式結構
clientmode.jpg

On cluster mode showed as below, SparkSubmit will register driver in the cluster, and a driver process launched in one work running the main class.

cluster模式結構
clustermode.jpg

yarn-client模式可以在執行中看見輸出日誌。如果是使用 yarn-cluster 模式,在執行過程中不會看到統計結果。需要到日誌檔案中檢視。由於cluster模式,分配資源的driver不在本節點,無法把結果輸出到命令列,但是通常cluster模式速度更快一些。因為driver是任務提交後自行分配的,資源和job分配更加合理。

鍵入命令執行wordcount

/usr/local/spark/bin/spark-submit --deploy-mode cluster --master yarn --driver-memory 1G --class org.apache.spark.examples.JavaWordCount --executor-memory 1G --total-executor-cores 2 /usr/local/spark/lib/spark-examples-1.6.3-hadoop2.6.0.jar hdfs://master:9000/input

出現下圖表示程式無錯誤,執行成功

spark成功.png

本次測試使用的也是單詞的統計
輸入如下

a.txt
Hello world
bye hadoop

b.txt
bye world
hello hadoop hadoop

鍵入命令檢視輸出測試的輸出結果
/usr/local/hadoop/bin/yarn logs -applicationId XXX

sparkwordcount.png

五、Scala與Sbt的配置和測試

這篇博文解釋得非常清楚~https://blog.csdn.net/a532672728/article/details/72477591

六、Item-based Collaboration Filtering

見另一篇博文

七、SlopeOne

見另一篇博文