最近在新電腦上配置大數(shù)據(jù)開發(fā)環(huán)境赶掖,踩了不少坑,更具網(wǎng)上的一些方法整理了一套比較簡單的hadoop+zookeeper+hbase+hive環(huán)境的搭建(由于虛擬機環(huán)境均以root用戶操作);
- 除了zookeeper的myid佃扼,其他設(shè)置所有虛擬機上都一樣,所以可以一臺虛擬機全部安裝配置完以后直接完全克隆幾個,再配置單獨的靜態(tài)ip汗盘,hostname和myid即可;
- 當(dāng)然最穩(wěn)妥的是配置完ssh后直接克隆忆畅,每配置完一個工具以后scp到各個節(jié)點下衡未,每裝完一個工具后都測試運行一下,確保無誤家凯;
- 要養(yǎng)成每次成功安裝完一個工具后都快照的習(xí)慣缓醋,無數(shù)突發(fā)情況帶來的教訓(xùn)啊绊诲;
所需環(huán)境和工具
- VMware虛擬機
- CentOS7并配置好各個節(jié)點的靜態(tài)ip(先裝一臺CentOS送粱,最后再克隆多臺)
- JDK1.8
- mysql5.7
- Xshell或FinalShell
HostName及HOST配置
由于分布式環(huán)境需要連接各個節(jié)點的linux系統(tǒng),為了方便我們需要配置了HostName主機名和hosts文件掂之;
1. 設(shè)置hostname
hostnamectl set-hostname susur1 #susur1為1號節(jié)點名
2. 查看hostname
[root@susur1 ~]# hostname
susur1
顯示出你配置的hostname就算成功了抗俄;
3. 配置hosts文件(地址/etc/hosts)
vim /etc/hosts
將這個追加的hosts文件最下面(格式為:節(jié)點ip + 節(jié)點hostname)脆丁;
192.168.160.129 susur1
192.168.160.130 susur2
192.168.160.131 susur3
你也可以將這段hosts代碼加到主機的hosts文件,這樣就可以方便的通過hostname訪問虛擬機上的linux系統(tǒng)动雹;
======MacOS的地址和Linux的一樣====槽卫,Windows的地址為C:\Windows\System32\drivers\etc;==
配置成功以后測試一些可不可以ping通胰蝠;
hekaideMacBook-Pro:~ hekai$ ping susur1
PING susur1 (192.168.160.129): 56 data bytes
64 bytes from 192.168.160.129: icmp_seq=0 ttl=64 time=0.260 ms
64 bytes from 192.168.160.129: icmp_seq=1 ttl=64 time=0.222 ms
64 bytes from 192.168.160.129: icmp_seq=2 ttl=64 time=0.182 ms
配置ssh免密鑰登陸
為了保證分布式環(huán)境下各個節(jié)點直接可以無障礙相互訪問歼培,我們需要配置ssh密鑰保證各個節(jié)點可以相互免密鑰登陸;
1. 查看ssh是否啟動
systemctl status sshd.service
如果報命令不存在的話需要安裝ssh
2. yum安裝ssh(ubuntu是apt)
yum install -y openssl openssh-server
3. 修改配置文件
ssh連接時如果報權(quán)限錯誤茸塞,我們需要修改sshd配置文件躲庄,打開權(quán)限;
# 輸入指令
vim /etc/ssh/sshd_config
# 將 PermitRootLogin, RSAAuthentication, PubkeyAuthentication 設(shè)置為 yes
4.啟動ssh服務(wù)
#開啟ssh服務(wù)
systemctl start sshd.service
#設(shè)置開機運行
systemctl enable sshd.service
#重啟ssh服務(wù)
systemctl restart sshd.service
5.生成ssh公鑰私鑰
####一路回車即可
[root@susur1 ~]]# ssh-keygen -t rsa
6.設(shè)置.ssh文件訪問權(quán)限
#在root目錄下
cd ~
chmod 700 .ssh
chmod 600 .ssh/*
ls -la .ssh
7.拷貝公鑰
在生成完公鑰和私鑰之后.ssh文件目錄下為:
-rw-------. 1 root root 1679 Sep 24 20:15 id_rsa
-rw-r--r--. 1 root root 393 Sep 24 20:15 id_rsa.pub
-rw-r--r--. 1 root root 552 Sep 25 11:33 known_hosts
我們將id_rsa.pub復(fù)制為authorized_keys
cp id_rsa.pub authorized_keys
#這里解釋一下:在別的教程中的方式是將公鑰文件復(fù)制到別的節(jié)點下的.ssh文件中的钾虐,這樣確實是規(guī)范的噪窘;
#ssh免密鑰登陸的原理是通過私鑰驗證對應(yīng)的公鑰完成免密鑰登陸;
#由于我們最后再直接克隆系統(tǒng)所有信息都是一樣效扫,所以只需要在一臺機器上配置即可倔监,無需傳輸公鑰文件;
8.驗證ssh免密鑰(克隆系統(tǒng)以后驗證)
ssh susur2 #hostname
ZooKeeper安裝及配置
- 首先從官網(wǎng)上下載合適的zookeeper版本 我下載的是3.4.14(3.5的版本我之前測試的時候不穩(wěn)定)
<html>
https://www.apache.org/dyn/closer.cgi/zookeeper/
</html>
將下載的tar包上傳到Linux系統(tǒng)
- 解壓tar包
mkdir /usr/local/zookeeper #新建zookeeper目錄
tar -zxvf zookeeper-3.4.14.tar.gz -C /usr/local/zookeeper/ #解壓到zookeeper目錄
- 進(jìn)入到conf目錄下配置配置文件
cd /usr/local/zookeeper/zookeeper-3.4.14/conf
cp zoo_sample.cfg zoo.cfg#默認(rèn)是沒有zoo.cfg的所有要將zoo_sample.cfg改名
vim zoo.cfg#配置zoo.cfg
- 需要修改的部分
#修改data文件目錄
dataDir=/usr/local/zookeeper/zookeeper-3.4.14/data
#zookeeper集群的節(jié)點菌仁,添加到末尾
server.1=susur1:2888:3888
server.2=susur2:2888:3888
server.3=susur3:2888:3888
- 創(chuàng)建data文件目錄
mkdir -p /usr/local/zookeeper/zookeeper-3.4.14/data
- 設(shè)置當(dāng)前zookeeper的權(quán)值(1號節(jié)點為1丐枉,2號節(jié)點為2,3號節(jié)點為3...)
echo 1 > /usr/local/zookeeper/zookeeper-3.4.14/data/myid
- 配置環(huán)境變量
vim /etc/profile
#zookeeper
export ZOOKEEPER_HOME=/usr/local/zookeeper/zookeeper-3.4.14
export PATH=$ZOOKEEPER_HOME/bin:$PATH
- 啟動zookeeper集群(每個節(jié)點都要啟動)
zkServer.sh start
zkServer.sh status
zkServer.sh stop
搭建hadooper*
http://hadoop.apache.org/releases.html 同上官網(wǎng)下載tar包(下載bin版本)我用的是版本是2.7.7
- 上傳Linux 解壓
mkdir /usr/local/hadoop
tar -zxvf hadoop-2.7.7.tar.gz -C /usr/local/hadoop/
- 修改配置文件(hadoop的配置文件所有節(jié)點都一樣即可掘托,最后克隆完即可運行)
cd /usr/local/hadoop/hadoop-2.7.7/etc/hadoop
- 配置JAVA_HOME
- hadoop-env.sh
- mapred-env.sh
- yarn-env.sh
將這個三個文件中的JAMA_HOME路徑改為系統(tǒng)上的jdk路徑
export JAVA_HOME=/usr/local/java/jdk1.8.0_221/
- core-site.xml
<property>
<name>fs.defaultFS</name>
<value>hdfs://susur</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>susur1:2181,susur2:2181,susur3:2181</value>
</property>
<!-- 指定hadoop運行時產(chǎn)生文件的存儲目錄 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/hadoop-2.7.7/tmp</value>
</property>
- hdfs-site.xml
<property>
<name>dfs.nameservices</name>
<value>susur</value>
</property>
<property>
<name>dfs.ha.namenodes.susur</name>
<value>nn1,nn2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.susur.nn1</name>
<value>susur1:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.susur.nn2</name>
<value>susur2:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.susur.nn1</name>
<value>susur1:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.susur.nn2</name>
<value>susur2:50070</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://susur1:8485;susur2:8485;susur3:8485/susur</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/var/tmp/hadoop/ha/jn</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.susur</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
<value>shell(true)</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_dsa</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<!--訪問免驗證-->
<property>
<name>dfs.permissions</name>
<value>false</value>
<description>
If "true", enable permission checking in HDFS.
If "false", permission checking is turned off,
but all other behavior is unchanged.
Switching from one parameter value to the other does not change the mode,
owner or group of files or directories.
</description>
</property>
- mapred-site.xml
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>susur1:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>susur1:19888</value>
</property>
- yarn-sit.xml
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>mr_susur</value>
</property>
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>susur3</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>susur1</value>
</property>
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>susur1:2181,susur2:2181,susur3:2181</value>
</property>
- 修改slaves(hadoop3.0以上是workers)
susur1
susur2
susur3
- 配置環(huán)境變量
- vim /etc/profile
#hadoope
export HADOOP_HOME=/usr/local/hadoop/hadoop-2.7.7
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
- 啟動hadoop(啟動前所有節(jié)點都需先啟動zookeeper瘦锹,status確認(rèn)狀態(tài))
- [susur123]啟動JournalNode
- [susur123] hadoop-daemon.sh start journalnode
- 格式化NameNode[a,s]
- [susur1] hdfs namenode -format
- [susur1] hadoop-daemon.sh start namenode
- [susur2] hdfs namenode -bootstrapStandby
- 格式化ZKFC
- [susur1] hdfs zkfc -formatZK
- 啟動集群(只需1號節(jié)點啟動)
- [susur123]啟動JournalNode
start-dfs.sh
- JPS查看狀態(tài)
#如主節(jié)點上的jps如下
[root@susur1 ~]# jps
49536 JournalNode
45713 QuorumPeerMain
50130 NodeManager
49253 DataNode
50469 Jps
49080 NameNode
49944 ResourceManager
49773 DFSZKFailoverController
訪問網(wǎng)頁 susur1:50070(要訪問主節(jié)點,status查看zookeeper的主節(jié)點是哪個)
Hbase安裝與配置
https://hbase.apache.org/downloads.html
官網(wǎng)下載合適的版本闪盔,我下的是1.3.5弯院,上傳到Linux 解壓tar包(下載bin包);
mkdir /usr/local/hbase
tar -zxvf hbase-1.3.5-bin.tar.gz -C /usr/local/hbase
-
修改配置文件
- cd /usr/local/hbase/hbase-1.3.5/conf/
- 配置 RegionServer
vim regionservers susur1 susur2 susur3
- 配置備用節(jié)點 backup-masters(沒有就新建)
vim backup-masters susur1
- 配置Hbase核心配置文件
vim hbase-site.xml <property> <name>hbase.rootdir</name> <value>hdfs://susur/hbase</value> </property> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <property> <name>hbase.zookeeper.quorum</name> <value>susur1:2181,susur2:2181,susur3:2181</value> </property>
- 拷貝hbfs-site.xml到hbase的conf目錄下
cp /usr/local/hadoop/hadoop-2.7.7/etc/hadoop/hdfs-site.xml /usr/local/hbase/hbase-1.3.5/conf
- 配置環(huán)境變量
vim /etc/profile #hbase export HBASE_HOME=/usr/local/hbase/hbase-1.3.5 export PATH=$HBASE_HOME/bin:$PATH
- 克隆完后啟動
啟動集群
zkServer.sh start
start-all.sh
[3] yarn-daemon.sh start resourcemanager
-啟動HBase
[1] start-hbase.sh
- 訪問網(wǎng)址 susur1:16010
安裝配置Hive
- mysql新建hive數(shù)據(jù)庫
#由于hive是基于mysql存儲的所以需要一個對應(yīng)的庫
create database hive;
- 官網(wǎng)下載tar包并上傳解壓
https://mirrors.tuna.tsinghua.edu.cn/apache/hive/
mkdir /usr/local/hive
tar -zxvf apache-hive-2.3.6-bin.tar.gz -C /usr/local/hive
- 修改配置文件hive-site.xml
cp hive-default.xml.template hive-site.xml
vim hive-site.xml
<!--設(shè)置庫名-->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/hive</value>
</property>
<!--配置RDBMS本地存儲-->
<property>
<name>hive.metastore.local</name>
<value>true</value>
</property>
<!--配置mysql連接,如果沒有hive庫則新建-->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true</value>
</property>
<!--配置jdbc驅(qū)動-->
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<!--mysql用戶名root-->
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<!--配置mysql密碼-->
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123456</value>
</property>
-
將mysql的jar包拷貝到hive的lib目錄下
- https://dev.mysql.com/downloads/connector/j/ 官網(wǎng)下載 mysql5.7及以上直接下載8.0即可完美兼容
將jline-2.12.jar拷貝到hadoop
cp /usr/local/hive/apache-hive-2.3.6-bin/lib/jine-2.12.jar /usr/local/hadoop/hadoop-2.7.7/share/hadoop/yarn/lib
- 配置環(huán)境變量
vim /etc/profile
#hive
export HIVE_HOME=/usr/local/hive/apache-hive-2.3.6-bin
export PATH=$HIVE_HOME/bin:$PATH
- 啟動Hive
hive
注意事項以及一些可能會遇到的問題
- 這套分布式環(huán)境是基于zookeeper做節(jié)點的管理的,hbase和hive都是為依賴與hadoop環(huán)境的趟妥,所以啟動順序為zookeeper -> hadoop -> hbase -> hive
- 環(huán)境變量配置完記得 source /etc/profile !!!!!!!
- 如果在hql處理中特別慢受神,優(yōu)先適當(dāng)增加主節(jié)點分配的內(nèi)存和cpu核心;
- 如果遇到zookeeper啟動完status顯示not running 可能是防火墻問題
#關(guān)閉防火墻
systemctl stop firewalld.service
#禁止開機啟動
systemctl disable firewalld.service
- ssh登陸默認(rèn)是同用戶名躺盛,所以要保證每臺虛擬機上的用戶名相同,如果主機ssh虛擬機請設(shè)置登陸用戶
- 格式化namenode報錯,先檢查各個節(jié)點上的JournalNode是否啟動,然后刪除生成的數(shù)據(jù)和日志文件鼠证,我這里設(shè)置的是Hadoop目錄下的tmp目錄,吧tmp刪除后重新hdfs namenode -format
- mysql設(shè)置密碼報密碼太簡單靠抑,請修改密碼限制
mysql> set global validate_password_policy=0;
mysql> set global validate_password_length=1;
- mysql連接時報錯量九,設(shè)置mysql權(quán)限
grant all privileges on *.* to 'root'@'%' identified by '123456';
如果主機navicat連接虛擬機上的mysql,設(shè)置ssh連接
-
eclipse(idea)連接hadoop時報權(quán)限錯誤,或者沒有找著文件目錄荠列,都是權(quán)限問題修改hdfs-site.xml文件类浪,關(guān)閉權(quán)限驗證,這里我已經(jīng)給你們關(guān)了
<!--訪問免驗證--> <property> <name>dfs.permissions</name> <value>false</value> <description> If "true", enable permission checking in HDFS. If "false", permission checking is turned off, but all other behavior is unchanged. Switching from one parameter value to the other does not change the mode, owner or group of files or directories. </description> </property>
//Java代碼中設(shè)置hadoop登陸用戶"root" Properties properties = System.getProperties(); properties.setProperty("HADOOP_USER_NAME", "root");