Hadoop+Hive+Spark平臺(tái)搭建

Mapreduce+Hive+Spark平臺(tái)搭建


說(shuō)明

平臺(tái)搭建成功后虏肾,使用Scala語(yǔ)言進(jìn)行算法設(shè)計(jì)和應(yīng)用的開(kāi)發(fā)掉缺。文末有使用scala設(shè)計(jì)的Item-Based Collaboration Filtering和SlopeOne 兩個(gè)協(xié)同過(guò)濾算法(另起文章)

一紊遵、搭建準(zhǔn)備

VMWare Workstation

Ubuntu 14.04 Server.iso

Xshell——遠(yuǎn)程連接主機(jī)終端

Server 版安裝配置
新建三臺(tái)虛擬機(jī)觉渴,安裝時(shí)選擇OpenSHH Server預(yù)安裝環(huán)境

一臺(tái)作為master

另兩臺(tái)作為slave雷绢,命名為slave1和slave2

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

IP 設(shè)置
VMnet8是VM配置的虛擬網(wǎng)卡

設(shè)置VMnet8,選擇「NAT 模式」

設(shè)置子網(wǎng)IP (192.168.142.0)和子網(wǎng)掩碼(255.255.255.0)

Ubuntu 系統(tǒng)的登錄和 IP 的固化

輸入 ifconfig 回車查詢當(dāng)前的 ip 地址回怜,準(zhǔn)備將其長(zhǎng)期綁定到當(dāng)前虛擬機(jī),為了方便后續(xù)實(shí)驗(yàn)。

master的ip:192.168.142.128

slave1的ip:192.168.142.130

slave2的ip:192.168.142.132

此時(shí)的 IP 地址是由 DHCP 服務(wù)器動(dòng)態(tài)分配的换薄,為了讓這個(gè) IP 地址能一直與這臺(tái)
虛擬機(jī)綁定玉雾,我們需要改變系統(tǒng)啟動(dòng)時(shí)獲取 IP 的方式,從 DHCP 切換到靜態(tài) IP
地址轻要,為此需要編輯 Linux 的網(wǎng)卡配置文件(/etc/network/interfaces)复旬,輸入命令

sudo vi /etc/network/interfaces

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

此時(shí)需要修改 ip 的獲取方式從 DHCP 到 static冲泥,設(shè)置靜態(tài)的 ip 地址赢底、子網(wǎng)掩碼和
默認(rèn)網(wǎng)關(guān)。

把這個(gè)文件更改為:

#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

為了進(jìn)一步固化 DNS 服務(wù)器 IP柏蘑,輸入

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

將里面的內(nèi)容替換成nameserver 192.168.142.2幸冻,vi 保存

系統(tǒng)的登錄和 IP 的固化重啟后完成

使用Xshell連接三個(gè)虛擬機(jī)終端

Xshell.png

下載lrzsz工具
用于虛擬機(jī)與宿主機(jī)之間文件的上傳和下載

sudo apt-get update

sudo apt-get install lrzsz

rz命令,從宿主機(jī)傳文件至虛擬機(jī)

sz命令咳焚,從虛擬機(jī)獲取文件至宿主機(jī)

二洽损、Hadoop 及相關(guān)環(huán)境的安裝

開(kāi)源分布式平臺(tái) Hadoop 可以聚合多個(gè)計(jì)算機(jī)形成集群,在各個(gè)節(jié)點(diǎn)上安裝配置完Hadoop后可以直接提交分布式代碼到集群計(jì)算革半。本次實(shí)驗(yàn)可以在個(gè)人電腦上用VMware完成碑定,或使用天河二號(hào)上的 OpenStack平臺(tái)創(chuàng)建內(nèi)存為2G的虛擬機(jī)資源完成流码。

安裝包準(zhǔn)備

Hadoop環(huán)境——hadoop-2.6.0.tar.gz

Java環(huán)境——jdk-8u60-linux-x64.tar.gz

虛擬機(jī)ip配置測(cè)試

sudo vi /etc/hosts #編輯 /etc/hosts 文件类溢,插入角色與 IP 映射

ping master -c 4 #嘗試用角色名 ping 其它主機(jī)更鲁,一次 4 個(gè)包

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

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

配置 SSH 無(wú)密碼登錄
保障了 Hadoop 可以通過(guò)角色名在局域網(wǎng)里找到各個(gè)節(jié)點(diǎn),為了讓 Hadoop 可以進(jìn)
一步讀取诡右、操作各個(gè)節(jié)點(diǎn)碘赖,需要賦予其登錄的權(quán)限驾荣,意即讓 Hadoop 擁有各個(gè)節(jié)點(diǎn)的普通用戶賬
號(hào),從而在需要操作各個(gè)節(jié)點(diǎn)時(shí)直接用對(duì)應(yīng)的賬號(hào)登錄獲取操作權(quán)限普泡。SSH 協(xié)議可以為節(jié)點(diǎn)上的
賬戶創(chuàng)建唯一的公私鑰播掷,然后利用這些公私鑰實(shí)現(xiàn)無(wú)密碼登錄,從而讓 Hadoop 直接繞開(kāi)傳統(tǒng)的
賬號(hào)密碼登錄過(guò)程撼班,直接用公私鑰訪問(wèn)節(jié)點(diǎn)歧匈。

生成各個(gè)節(jié)點(diǎn)的 SSH 公私鑰:

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

為了讓每個(gè)節(jié)點(diǎn)都擁有其它節(jié)點(diǎn)的公鑰砰嘁,要先把所有公鑰放進(jìn)一個(gè)文件里

  1. 在 master 上件炉,將 master 的公鑰復(fù)制到 authorized_keys 文件里:
cat ./id_rsa.pub >> ./authorized_keys # cat 命令用于提取內(nèi)容,>>輸出重定向

  1. 將 slave1矮湘、slave2 的公鑰文件發(fā)送給 master妻率,此時(shí)的傳送要輸入密碼:
scp ~/.ssh/id_rsa.pub hadoop@master:/home/hadoop/

  1. Master 將接收到的 slave1 的公鑰文件里的內(nèi)容提取追加到 authorized_keys 文
    件里:
cat ~/id_rsa.pub >> ~/.ssh/authorized_keys

  1. 將 slave2 的公鑰內(nèi)容也放進(jìn) authorized_keys 文件,然后將
    authorized_keys 文件分別發(fā)送到兩個(gè) slave 的~/.ssh/下:
scp ~/.ssh/authorized_keys hadoop@slave1:/home/hadoop/.ssh/

搭建成功表現(xiàn):每個(gè)節(jié)點(diǎn)嘗試使用 ssh <角色名>的命令直接登錄其它節(jié)點(diǎn)板祝,直到每個(gè)節(jié)點(diǎn)都可以
成功免密碼登錄其它節(jié)點(diǎn)宫静,則免密碼登錄配置成功! 如在 master 上輸入:ssh slave1即可直接登陸slave1的虛擬機(jī)券时,不需要再輸入密碼登陸孤里,便于后續(xù)實(shí)驗(yàn)操作。

配置 Java環(huán)境和Hadoop環(huán)境

安裝包準(zhǔn)備:
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

在各個(gè)節(jié)點(diǎn)上將 hadoop 解壓到/usr/local/目錄下捌袜,改變其所屬用戶和所屬組(讓
hadoop 軟件用 hadoop 賬號(hào)登錄時(shí)對(duì) hadoop 文件夾擁有最高權(quán)限):

tar -zxvf hadoop-2.6.0.tar.gz -C /usr/local/
sudo mv /usr/loca/hadoop-2.6.0 /usr/local/hadoop #mv 實(shí)現(xiàn)重命名
sudo chown -R hadoop:hadoop /usr/local/hadoop

將當(dāng)前的 PATH 環(huán)境變量提取保存到 P.sh

環(huán)境變量如下:

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


之后每次重啟系統(tǒng)都需要重定向環(huán)境變量

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

使環(huán)境變量生效:

source ~/setenv.sh

查看java版本信息,如果出現(xiàn)版本信息則環(huán)境配置成功

java -version
javac -version

重點(diǎn):hadoop節(jié)點(diǎn)配置

修改 slaves 文件炸枣,讓 hadoop 知道自己可以聚合的節(jié)點(diǎn)名(保證與 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 文件如下(啟用所有節(jié)點(diǎn)作為 DataNode虏等,包括master故 replication_value=3):
當(dāng)節(jié)點(diǎn)增多時(shí),需要更改配置文件适肠,如主機(jī)名霍衫、IP地址、節(jié)點(diǎn)信息等配置都要重新修改

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 資源管理器)侯养,為大數(shù)據(jù)計(jì)算分配計(jì)算敦跌、存儲(chǔ)資源等

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

當(dāng)前jdk路徑為:JAVA_HOME=/usr/local/jvm/jdk1.8.0_60

重點(diǎn):hadoop啟動(dòng)及驗(yàn)證

對(duì) hadoop 進(jìn)行 NameNode 的格式化:
/usr/local/hadoop/bin/hdfs namenode -format

啟動(dòng) hdfs 和 yarn逛揩,并在各個(gè)節(jié)點(diǎn)上輸入 jps 查看啟動(dòng)的服務(wù):

只需在master上啟動(dòng)

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

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

jps # 每個(gè)節(jié)點(diǎn)都查看一次
jps.png

嘗試在 hdfs 上創(chuàng)建輸入文件夾input柠傍,并把 測(cè)試的txt文本文件放進(jìn)去:

/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

嘗試用 寫(xiě)一個(gè)簡(jiǎn)單的 WordCount.java代碼麸俘,統(tǒng)計(jì)上面文本文件中每個(gè)單詞
出現(xiàn)的頻數(shù):
hadoop的工作是把大任務(wù)切分成小jobs,再通過(guò)資源管理器分配存儲(chǔ)和計(jì)算等資源給相應(yīng)hadoop集群內(nèi)的節(jié)點(diǎn)

/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/* #查看輸出結(jié)果

hadoop-output.png

hadoop 搭建完成

三惧笛、Hive 數(shù)據(jù)倉(cāng)庫(kù)安裝部署及測(cè)試

安裝包準(zhǔn)備

apache-hive-1.2.0-bin.tar.gz

mysql-connector-java-5.1.44-bin.jar

testdata.zip

Hive 是建立在 Hadoop 上的數(shù)據(jù)倉(cāng)庫(kù)基礎(chǔ)構(gòu)架从媚。它提供了一系列的工
具,可以用來(lái) 進(jìn)行數(shù)據(jù)提取轉(zhuǎn)化加載(ETL) )患整,這是一種可以存儲(chǔ)拜效、查詢和分析
存儲(chǔ)在 Hadoop 中的大規(guī)模數(shù)據(jù)的機(jī)制。另外并级,它定義了簡(jiǎn)單的類 SQL 查詢
語(yǔ)言,稱為 HQL侮腹,允許熟悉 SQL 的用戶查詢數(shù)據(jù)嘲碧。

如果是實(shí)施的交通數(shù)據(jù),那么搭建動(dòng)態(tài)的數(shù)據(jù)倉(cāng)庫(kù)是很有必要的父阻。

原理圖

Hive的工作原理簡(jiǎn)單來(lái)說(shuō)就是一個(gè)查詢引擎

Hive的架構(gòu)圖:


hive架構(gòu).png

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

2.語(yǔ)義分析
從Megastore獲取模式信息愈涩,驗(yàn)證SQL語(yǔ)句中隊(duì)表名,列名,以及數(shù)據(jù)類型的檢查和隱式轉(zhuǎn)換加矛,以及Hive提供的函數(shù)和用戶自定義的函數(shù)(UDF/UAF)

3.邏輯計(jì)劃生產(chǎn)
生成邏輯計(jì)劃-算子樹(shù)

4.邏輯計(jì)劃優(yōu)化
對(duì)算子樹(shù)進(jìn)行優(yōu)化履婉,包括列剪枝,分區(qū)剪枝斟览,謂詞下推等

5.物理計(jì)劃生成
將邏輯計(jì)劃生產(chǎn)包含由MapReduce任務(wù)組成的DAG的物理計(jì)劃

6.物理計(jì)劃執(zhí)行
將DAG發(fā)送到Hadoop集群進(jìn)行執(zhí)行

7.將查詢結(jié)果返回

流程如下圖:


hive流程.png

hive和mapreduce共同運(yùn)作

hive原理.png

用戶接口
CLI:就是 Shell 命令行.

JDBC:這個(gè)是 Hive 的 java 接口毁腿,與通常的數(shù)據(jù)庫(kù)類似.

WebGUI:網(wǎng)頁(yè)界面。

驅(qū)動(dòng)組件(Driver)
Hive 的編譯苛茂、解析已烤、優(yōu)化轉(zhuǎn)化為 MapReduce 任務(wù)提交給 Hadoop 進(jìn)行分派
和執(zhí)行相應(yīng)的任務(wù)。

元數(shù)據(jù)組件(Metatore)

存儲(chǔ)著 hive 的元數(shù)據(jù)信息妓羊,包括表名胯究、列、分區(qū)和屬性等躁绸。默認(rèn)數(shù)據(jù)庫(kù)為
Derby裕循,為了更健壯,一般使用 Mysql 來(lái)代替净刮。另外剥哑,MetaStore 分為服務(wù)
端和客戶端,服務(wù)端提供給客戶端對(duì) RDBMS 的訪問(wèn)服務(wù)淹父。

安裝 Mysql

sudo apt-get install mysql-server

安裝完成后設(shè)置數(shù)據(jù)庫(kù)root用戶的密碼星持,123456

配置 Mysql

mysql –uroot –p 的 使用初始化時(shí)設(shè)置的 root 密碼登錄

新增 hive 用戶,并給于權(quán)限:

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 文件夾弹灭,并將其權(quán)限修改成 hadoop

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

把 mysql 的 jdbc 的驅(qū)動(dòng) 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. 配置環(huán)境變量

修改之前的P.sh

環(huán)境變量如下:

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 有關(guān)于 metastore 具有三種配置督暂,分別為內(nèi)嵌模式揪垄、本地元存儲(chǔ)以及遠(yuǎn)程
在 元存儲(chǔ).

目前在 namenode 上配置服務(wù)端,datanode 上配置為客戶端逻翁,在 datanode
行 進(jìn)行 hql 時(shí)通過(guò)遠(yuǎn)程模式訪問(wèn)在 namenode 的元數(shù)據(jù)饥努。(實(shí)際場(chǎng)景 metastore 的數(shù)據(jù)庫(kù)可以在任何節(jié)點(diǎn),以減輕 namenode 的壓力)

在 /usr/local/hive/conf 目錄下創(chuàng)建 hive-site.xml 文件:

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

在 server 端配置 hive-stie.xml,修改后保存

ConnectionURL 屬性用于設(shè)置 mysql 服務(wù)所在地址與端口八回,這里 mysql-server 在 在
本地酷愧, hive.metastore.warehouse.dir 是在 HDFS 上的文件路徑,hive.metastore.local 的 的
為 值為 true 表示對(duì) metastore 的訪問(wèn)為本地模式缠诅。

<?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 項(xiàng)指向提供數(shù)據(jù)庫(kù)訪問(wèn)的 metastore 服務(wù)端溶浴,值須為 IP 地 地
了 址。由于設(shè)置了 uris 的內(nèi)容管引,因而對(duì)于 metastore 的訪問(wèn)默認(rèn)為遠(yuǎn)程模式士败。

<?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. 運(yùn)行 Hive

檢查 jline 版本,hive 與 hadoop 的 jline 版本不對(duì)應(yīng)可能導(dǎo)致運(yùn)行錯(cuò)誤褥伴,
先刪除之前的舊版本谅将,然后將 hive 上 jline 的 jar 包拷貝至 hadoop 的對(duì)應(yīng)目錄下:

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

更新 yarn-site.xml 配置

**重要:為了使得 mapreduce 程序可以在各個(gè)節(jié)點(diǎn)提交,對(duì)各個(gè)節(jié)點(diǎn)的 hive-site.xml 配置文件 追加下 以下 property **

其中 yarn.resourcemanager.hostname 配置的是運(yùn)行 ResourceManager 進(jìn)程所在
的主機(jī)(master 節(jié)點(diǎn))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上進(jìn)行:

啟動(dòng)hadoop:/usr/local/hadoop/sbin/start-all.sh

初始化 Schema

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

服務(wù)端啟動(dòng) metastore 服務(wù)

hive --service metastore

接著在slave1和slave2啟動(dòng)hive的客戶端

hive

  1. 測(cè)試hive數(shù)據(jù)倉(cāng)庫(kù):

導(dǎo)入數(shù)據(jù)可以是使用Tab間隔的原數(shù)據(jù)形式,從本地導(dǎo)入饥臂。

也可以從 HDFS 中導(dǎo)入。與本地的類似似踱,只要把本地載入的命令中’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 客戶端核芽,創(chuàng)建 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’;

把數(shù)據(jù)加載到表:

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

將查詢結(jié)果插入到表

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

先創(chuàng)建 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數(shù)據(jù)倉(cāng)庫(kù)建立成功

動(dòng)態(tài)數(shù)據(jù)倉(cāng)庫(kù)可以使用jsp進(jìn)行動(dòng)態(tài)的添加,結(jié)合Android猛们、html或者其他可視化工具進(jìn)行操作

四、spark的配置和測(cè)試

Spark 是專為大規(guī)模數(shù)據(jù)處理而設(shè)計(jì)的快速通
用的計(jì)算引擎狞洋,有與 hadoop 相似的開(kāi)源集群計(jì)算環(huán)境弯淘,但是能在某些工作負(fù)載方面表現(xiàn)得
更加優(yōu)越,換句話說(shuō)吉懊,spark 啟用了內(nèi)存分布數(shù)據(jù)集庐橙,除了能夠提供交互式查詢外,它還可
以優(yōu)化迭代工作負(fù)載借嗽。
spark 有三種模式态鳖,分別是 standalone、spark on yarn恶导,spark on mesos浆竭,這里我們選擇 spark on
yarn 的模式,即在我們之前部署的 hadoop 集群上部署 spark。

我的電腦是 1G 運(yùn)行內(nèi)存邦泄,所以設(shè)置的是 1000M删窒,executor cores 是 2(經(jīng)過(guò)測(cè)試 driver memory 和 worker。memory 如果小于 512M顺囊,executor cores 大于 2 的話用 spark 提交任務(wù)會(huì)很容易就崩死肌索,提示的是 SparkContext 相關(guān)錯(cuò)誤)。

  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诚亚,在文件末尾添加如下內(nèi)容
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的運(yùn)行參數(shù),hadoop_conf_dir的設(shè)置是為了讓spark運(yùn)行在yarn上午乓。
幾個(gè) memory 命令分別用于設(shè)置 driver 和 executor 進(jìn)程的內(nèi)存站宗,executor_cores 設(shè)置的是每個(gè)
executor 進(jìn)程的 CPU cores 的數(shù)量,這些設(shè)置請(qǐng)依據(jù)自己的電腦實(shí)際可負(fù)載情況設(shè)置益愈。

  1. 修改 slaves 文件梢灭,在文件末尾添加其他節(jié)點(diǎn) IP
vi /usr/local/spark/conf/slaves

修改成

master
slave1
slave2
  1. 修改 spark-defaults.conf,在文件末尾添加如下內(nèi)容:
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 的運(yùn)行日志腕唧,并且是保存到 hdfs 上的文件夾里面或辖,方便運(yùn)維瘾英。

  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>

這一步是為了開(kāi)啟日志整合功能,spark 在遇到問(wèn)題時(shí)湿蛔,利用命令
/usr/local/hadoop/bin/yarn logs -applicationId XXX
即可查看 applicationId 為 XXX 的實(shí)例的運(yùn)行日志

運(yùn)行spark

  1. 開(kāi)啟hadoop集群
/usr/local/hadoop/sbin/start-all.sh
  1. 在 spark 中創(chuàng)建 historyserverforSpark 文件夾

這個(gè)文件夾可以在網(wǎng)頁(yè)上看見(jiàn)(hdfs)

/usr/local/hadoop/bin/hdfs dfs -mkdir historyserverforSpark

  1. 運(yùn)行 spark
/usr/local/spark/sbin/start-all.sh

可以進(jìn)入 spark 的 webui 查看是否成功啟動(dòng):192.1468.142.128:8080/
可以進(jìn)入 spark 的 webui 查看節(jié)點(diǎn)是否成功啟動(dòng):192.1468.142.128:8080/cluster

sparkstartall.png
  1. 運(yùn)行 history-server膀曾,這樣應(yīng)用運(yùn)行完的結(jié)果可以通過(guò) webui 看到:192.1468.142.128:18080
usr/local/spark/sbin/start-history-server.sh

spark運(yùn)行歷史

spark

運(yùn)行spark實(shí)例

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

vi SparkPiRes.txt
Piresult.png
  1. 在yarn集群上運(yùn)行

運(yùn)行可以有client模式和cluster模式
區(qū)別如下

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 模式結(jié)構(gòu)


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模式結(jié)構(gòu)


clustermode.jpg

yarn-client模式可以在運(yùn)行中看見(jiàn)輸出日志。如果是使用 yarn-cluster 模式阳啥,在運(yùn)行過(guò)程中不會(huì)看到統(tǒng)計(jì)結(jié)果添谊。需要到日志文件中查看。由于cluster模式察迟,分配資源的driver不在本節(jié)點(diǎn)斩狱,無(wú)法把結(jié)果輸出到命令行,但是通常cluster模式速度更快一些扎瓶。因?yàn)閐river是任務(wù)提交后自行分配的所踊,資源和job分配更加合理。

鍵入命令運(yùn)行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

出現(xiàn)下圖表示程序無(wú)錯(cuò)誤概荷,運(yùn)行成功

spark成功.png

本次測(cè)試使用的也是單詞的統(tǒng)計(jì)
輸入如下

a.txt
Hello world
bye hadoop

b.txt
bye world
hello hadoop hadoop

鍵入命令查看輸出測(cè)試的輸出結(jié)果
/usr/local/hadoop/bin/yarn logs -applicationId XXX

sparkwordcount.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末秕岛,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌继薛,老刑警劉巖修壕,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異惋增,居然都是意外死亡叠殷,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門诈皿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)林束,“玉大人,你說(shuō)我怎么就攤上這事稽亏『埃” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵截歉,是天一觀的道長(zhǎng)胖腾。 經(jīng)常有香客問(wèn)我,道長(zhǎng)瘪松,這世上最難降的妖魔是什么咸作? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮宵睦,結(jié)果婚禮上记罚,老公的妹妹穿的比我還像新娘。我一直安慰自己壳嚎,他們只是感情好桐智,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著烟馅,像睡著了一般说庭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上郑趁,一...
    開(kāi)封第一講書(shū)人閱讀 49,784評(píng)論 1 290
  • 那天刊驴,我揣著相機(jī)與錄音,去河邊找鬼寡润。 笑死捆憎,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的悦穿。 我是一名探鬼主播攻礼,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼栗柒!你這毒婦竟也來(lái)了礁扮?” 一聲冷哼從身側(cè)響起知举,我...
    開(kāi)封第一講書(shū)人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎太伊,沒(méi)想到半個(gè)月后雇锡,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡僚焦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年锰提,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芳悲。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡立肘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出名扛,到底是詐尸還是另有隱情谅年,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布肮韧,位于F島的核電站融蹂,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏弄企。R本人自食惡果不足惜超燃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拘领。 院中可真熱鬧意乓,春花似錦、人聲如沸院究。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)业汰。三九已至,卻和暖如春菩颖,著一層夾襖步出監(jiān)牢的瞬間样漆,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工晦闰, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留放祟,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓呻右,卻偏偏與公主長(zhǎng)得像跪妥,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子声滥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容