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ī)終端
下載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è)文件里
- 在 master 上件炉,將 master 的公鑰復(fù)制到 authorized_keys 文件里:
cat ./id_rsa.pub >> ./authorized_keys # cat 命令用于提取內(nèi)容,>>輸出重定向
- 將 slave1矮湘、slave2 的公鑰文件發(fā)送給 master妻率,此時(shí)的傳送要輸入密碼:
scp ~/.ssh/id_rsa.pub hadoop@master:/home/hadoop/
- Master 將接收到的 slave1 的公鑰文件里的內(nèi)容提取追加到 authorized_keys 文
件里:
cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
- 將 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
- 安裝 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
- 安裝 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)都查看一次
嘗試在 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
嘗試用 寫(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 搭建完成
三惧笛、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è)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和mapreduce共同運(yùn)作
用戶接口
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 安裝與配置
- 安裝 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
- 配置環(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
- 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>
- 運(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
- 測(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數(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ò)誤)。
- 將 spark-1.6.0-bin-hadoop2.6.tgz 放到/home/hadoop/目錄下
- 解壓文件到/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/
- 利用 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
- 修改 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è)置益愈。
- 修改 slaves 文件梢灭,在文件末尾添加其他節(jié)點(diǎn) IP
vi /usr/local/spark/conf/slaves
修改成
master
slave1
slave2
- 修改 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)維瘾英。
- 將配置好的 spark 文件夾傳到 slave1枣接、slave2。
- 配置 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
- 開(kāi)啟hadoop集群
/usr/local/hadoop/sbin/start-all.sh
- 在 spark 中創(chuàng)建 historyserverforSpark 文件夾
這個(gè)文件夾可以在網(wǎng)頁(yè)上看見(jiàn)(hdfs)
/usr/local/hadoop/bin/hdfs dfs -mkdir historyserverforSpark
- 運(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
- 運(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)行歷史
運(yùn)行spark實(shí)例
- 本地模式
/usr/local/spark/bin/run-example SparkPi > SparkPiRes.txt
vi SparkPiRes.txt
- 在yarn集群上運(yùn)行
運(yùn)行可以有client模式和cluster模式
區(qū)別如下
When run SparkSubmit --class [mainClass], SparkSubmit will call a childMainClass which is
- client mode, childMainClass = mainClass
- standalone cluster mde, childMainClass = org.apache.spark.deploy.Client
- 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)
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)
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)行成功
本次測(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