Hadoop+Hive+Spark平臺搭建

Mapreduce+Hive+Spark平臺搭建


說明

平臺搭建成功后,使用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。
  1. 配置 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
  1. standalone cluster mde, childMainClass = org.apache.spark.deploy.Client
  1. 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
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容