最最最詳細的Hadoop+HBase+Zookeeper+Hive完全分佈式環境搭建教程

一、準備工作

雖然前面已經給出了Hadoop搭建的教程,但是因爲這裏要將Hadoop、HBase和Hive三者一起搭建,所以這裏還是從頭開始搭建一遍,需要準備的材料如下:
在這裏插入圖片描述
材料地址:https://pan.baidu.com/s/19s05T_aVTOi2i1Cpi_uQ1w 提取碼:tzrm
下面開始解壓這些壓縮包,我這裏事先在根目錄新建一個臨時存放壓縮包的目錄software,將上面8個文件全都拖進去,然後逐個解壓到opt目錄下,在對其簡化一些解壓後的名字,這裏我就不做詳細說明,相信你們都已經熟練操作解壓步驟了,我只展示一下我修改後的目錄名稱:

[root@hadoop1 opt]# ll
total 40
drwxr-xr-x. 17 1106 4001  4096 Jun 26 18:22 hadoop
drwxr-xr-x. 32 1106 4001  4096 Jun 26 14:36 hbase
drwxr-xr-x. 11 1106 4001   197 Mar 28  2018 hive
drwxr-xr-x.  7   10  143   245 Jul  4  2019 java8
drwxr-xr-x. 10 1000 1000  4096 Jun 28 22:50 zookeeper

其中Mysql的兩個壓縮包我們先不管他們,後面配到Hive再來對它們進行解壓。

二、hadoop搭建

1.配置主機名和主機列表

首先就是新建好一臺虛擬機,配置好網絡地址,我這裏配置的是:192.168.234.111。下面開始修改hostname和hosts,以便後面遠程連接時比較方便。下面我就簡化步驟了,詳細的可以看我之前寫的hadoop環境搭建

vi /etc/hostname

第一臺的主機名就叫hadoop1。
然後配置主機列表:

vi /etc/hosts

我這裏提前增加了三個主機名:hadoop1、hadoop2、hadoop3,爲後面集羣搭建要三臺虛擬機做準備。

2.配置免密登錄

這裏我們可以先將私鑰和免密登錄設置好:

 ssh-keygen -t rsa -P ""    --生成私鑰
cat .ssh/id_rsa.pub > .ssh/authorized_keys   複製成公鑰
3.配置環境變量

因爲我們後面需要用到jdk、hadoop、hbase、hive,所以這裏配置環境變量就直接一次性配置完成,後面的複製虛擬機就可以不需要再對另外兩臺機器再次配置了。

export JAVA_HOME=/opt/java8
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/dt.jar:$JAVA_HOME/tools.jar:$JAVA_HOME/rt.jar
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
export HADOOP_HOME=/opt/hadoop
export HIVE_HOME=/opt/hive
export HBASE_HOME=/opt/hbase
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin:$JAVA_HOME/bin:$JRE_HOME/bin:$HBASE_HOME/bin:$HIVE_HOME/bin

就這麼幾個,相信你們能記得下來,我這裏每一個名稱的使用都是我改過後的名字,注意一下。

4.配置hadoop配置文件

這裏我就不在贅述了,相信你們已經搭了幾百遍了,不清楚的可以繼續參考我之前的hadoop環境搭建。然後就可以嘗試啓動hadoop,也可以用連接網頁測試。

三、HBase配置

這裏直接切到/opt/hbase/conf/下,然後開始配置相關文件。

1.配置hbase-site.xml文件

下面的配置信息可能很長,需要修改的部分我已經在後面加了註釋,一共有兩個地方。

<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://hadoop1:9000/hbase</value>             ----修改成自己的主機名
<description>The directory shared by region servers.</description>
</property>
<property>
  <name>hbase.cluster.distributed</name>
  <value>true</value>
</property>
<property>
  <name>hbase.master.port</name>
  <value>60000</value>
</property>
<property>
  <name>hbase.zookeeper.quorum</name>
  <value>hadoop1,hadoop2,hadoop3</value>    ----集羣的每一個主機名,這裏可以提前寫好,因爲集羣我們還沒有配置
</property>
<property>
  <name>hbase.regionserver.handler.count</name>
  <value>300</value>
</property>
<property>
  <name>hbase.hstore.blockingStoreFiles</name>
  <value>70</value>
</property>
<property>
  <name>zookeeper.session.timeout</name>
  <value>60000</value>
</property>
<property>
<name>hbase.regionserver.restart.on.zk.expire</name>
<value>true</value>
<description>
Zookeeper session expired will force regionserver exit.
Enable this will make the regionserver restart.
</description>
</property>
<property>
  <name>hbase.replication</name>
  <value>false</value>
</property>
<property>
  <name>hfile.block.cache.size</name>
  <value>0.4</value>
</property>
<property>
  <name>hbase.regionserver.global.memstore.upperLimit</name>
  <value>0.35</value>
</property>
<property>
  <name>hbase.hregion.memstore.block.multiplier</name>
  <value>8</value>
</property>
<property>
  <name>hbase.server.thread.wakefrequency</name>
  <value>100</value>
</property>
<property>
  <name>hbase.master.distributed.log.splitting</name>
  <value>false</value>
</property>
<property>
  <name>hbase.regionserver.hlog.splitlog.writer.threads</name>
  <value>3</value>
</property>
<property>
  <name>hbase.hstore.blockingStoreFiles</name>
  <value>20</value>
</property>
<propetty>
<name>hbase.hregion.memstore.flush.size</name>
<value>134217728</value>
</property>
<property>
  <name>hbase.hregion.memstore.mslab.enabled</name>
  <value>true</value>
</property>
</configuration>
2.配置hbase-env.sh文件
export HBASE_HEAPSIZE=4000
export HBASE_OFFHEAPSIZE=1G
export JAVA_HOME=/opt/java8
export HBASE_OPTS="-Xmx4g -Xms4g -Xmn128m -XX:+UseParNewGC  -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -verbose:gc  -XX:+PrintGCDetails -XX:+PrintGCTimeStamps  -Xloggc:$HBASE_HOME/logs/gc-$(hostname)-hbase.log"     ----這裏的Xmx4g -Xms4g是基於自己虛擬機設置的內存來配置的,因爲我配置的是4096M(4G),所以這裏寫的是4G。
export HBASE_MANAGES_ZK=false
export HBASE_CLASSPATH=/opt/hadoop     ----hadoop配置文件位置

這些參數文件裏應該都是註釋掉的,可以直接添加在文件的最後,但還是要看仔細,防止名稱一樣,路徑不一樣。

3.配置log4j.properties文件
hbase.root.logger=WARN,console
log4j.logger.org.apache.hadoop.hbase=WARN

這裏需要自己找一下這兩個配置,原本都是INFO,需要改成WARN。只對WARN以上級別的日誌進行保存。

4.配置regionservers

這裏就是加上集羣的所有節點名就可以了。配置完後這裏先不啓動,先去搭建集羣和配置zookeeper後再啓動。

四、集羣搭建

這裏前面和之前hadoop集羣搭建一樣,只要注意修改主機地址、再次生成MAC地址、修改主機名。
完成後開始配置三臺機器的遠程連接。
另外兩臺機器也要配置好私鑰、免密登錄。然後實現遠程連接:

 ssh-copy-id -i .ssh/id_rsa.pub -p22 [email protected]
 ssh-copy-id -i .ssh/id_rsa.pub -p22 [email protected]

然後另外兩臺也對其他兩臺進行連接。

1.修改hdfs-site.xml文件
<configuration>
<property>
  <name>dfs.replication</name>
  <value>3</value>   --改成3個副本
</property>
<property>
  <name>dfs.namenode.secondary.http-address</name>
  <value>hadoop2:50090</value>   ----hadoop2作爲namenode的從元數據節點,合併NameNode的edit logs到fsimage文件中,
  輔助NameNode將內存中元數據信息持久化
</property>
</configuration>
2.修改slaves文件
hadoop1
hadoop2
hadoop2
3.複製到另外兩臺機器上
[root@hadoop01 hadoop]# scp /opt/hadoop/etc/hadoop/hdfs-site.xml root@hadoop2:/opt/hadoop/etc/hadoop/hdfs-site.xml
[root@hadoop01 hadoop]# scp /opt/hadoop/etc/hadoop/hdfs-site.xml root@hadoop3:/opt/hadoop/etc/hadoop/hdfs-site.xml
[root@hadoop01 hadoop]# scp /opt/hadoop/etc/hadoop/slaves root@hadoop2:/opt/hadoop/etc/hadoop/slaves
[root@hadoop01 hadoop]# scp /opt/hadoop/etc/hadoop/slaves root@hadoop3:/opt/hadoop/etc/hadoop/slaves

這樣我們集羣就搭建完畢,下面可以開始配置zookeeper。

五、Zookeeper搭建

zookeeper是hadoop和hbase的一個重要組件。直接切到zookeeper目錄下的conf目錄。可以看到其目錄下有一個zoo.cfg文件(如果不叫這個名字,可能是zoo.xxx.cfg,直接改成zoo.cfg就可以)。然後開始配置這個文件。

1.配置zoo.cfg文件
# The number of milliseconds of each tick
tickTime=2000    --時間單元
maxClientCnxns=0     ----這裏是指單個客戶端和單個服務器之間連接數的限制,我們將其設置成0,不作任何限制。
# The number of ticks that the initial
# synchronization phase can take
initLimit=50   ----集羣中的服務器和主服務器之間的初始化連接時間,50表示50個tickTime時間
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5    ----主節點和分節點請求和應答時間
# the directory where the snapshot is stored.
dataDir=/opt/hadoop/zookeeperdata    ----存儲快照文件snapshot的目錄
# the port at which the clients will connect
clientPort=2181    ----客戶端連接server的端口號,一般設置爲2181
server.1=hadoop1:2888:3888
server.2=hadoop2:2888:3888
server.3=hadoop3:2888:3888    ----每臺機器的服務器要與主機名對應
2.創建myid文件並啓動zookeeper

配置完後,將這個文件複製到另外兩臺機器上,完成之後,在剛剛配置存儲快照目錄下面新建一個myid文件,裏面寫上對應的server號,例如hadoop1下的myid文件就要填入1。另外兩臺重複此步驟。配置完成後就可以啓動zookeeper了:

[root@hadoop1 zookeeper]# ./bin/zkServer.sh start
3.啓動hbase

成功啓動zookeeper後,便可以開始啓動hbase了,切到hbase目錄下,輸入命令啓動hbase:

start-hbase.sh

能夠成功啓動就可以jps查看所有啓動的進程,有下面幾個:

[root@hadoop1 hbase]# jps
6626 Jps
3242 NameNode
4186 HMaster
3371 DataNode
2700 QuorumPeerMain
3612 ResourceManager
3710 NodeManager
4334 HRegionServer

zookeeper成功啓動的進程是:2700 QuorumPeerMain
hbase成功啓動的進程是:4186 HMaster 和 4334 HRegionServer
如果不能成功顯示這些,因爲報錯的問題太不統一,這裏如果有問題,需要自己去解決了qaq。

4.測試hbase

成功啓動hbase後,我們可以測試一下hbase,輸入命令:

hbase shell

跳出hbase編輯命令行,類似於mysql:

[root@hadoop1 hbase]# hbase shell
2020-06-29 00:58:03,948 INFO  [main] Configuration.deprecation: hadoop.native.lib is deprecated. Instead, use io.native.lib.available
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/hbase/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
HBase Shell; enter 'help<RETURN>' for list of supported commands.
Type "exit<RETURN>" to leave the HBase Shell
Version 1.2.0-cdh5.14.2, rUnknown, Tue Mar 27 13:31:54 PDT 2018
hbase(main):001:0>

能夠成功跳出此信息的,可以先查看一下當前的list信息,直接輸入list回車,應該顯示的是0rows,然後可以使用命令創建一個table:

create 'stu','name','age'  ----table名stu,列字段名name 和age

然後回車,再次輸入list查看一下,會顯示table名:

hbase(main):001:0> create 'stu','name','age'
0 row(s) in 1.4660 seconds

=> Hbase::Table - stu
hbase(main):002:0> list
TABLE
aaa
hello1
stu
3 row(s) in 0.0150 seconds
=> ["aaa", "hello1", "stu"]
hbase(main):003:0>

我這裏之前已經建了兩個table了。所以一共是3rows。

5.最常見的異常

異常:Can’t get master address from ZooKeeper; znode data == null
這個問題會在hbase shell 跳出命令行後輸入list產生,出現此問題,有一下兩種可能

(1).zookeeper不穩定

這裏的解決辦法就是重啓hbase,先stop掉,然後再start。

(2).三臺機器的網絡時間不同步

參考博客:ntp同步時間

六、Hive搭建

1.Mysql配置和創建用戶和數據庫

配置hive之前,先將兩個Mysql的rpm文件進行解壓,這裏我就不多做說明,你們已經做爛了。
解壓完之後,在mysql命令行輸入:

use mysql;
create user 'bigdata'@'hadoop1' IDENTIFIED BY ’ok‘;    ----創建用戶
create database hive_metadata    ----創建數據庫
grant all privileges on "." to  'bigdata'@'hadoop1'      ----給hadoop1的bigdata用戶賦所有權限
flush privileges    ----使賦權即時生效

ok之後開始配置hive配置文件。

2.修改hive-env.sh文件

切花到/opt/hive/conf目錄下,修改hive-env.sh文件(這裏可能是hive-env.sh.template文件,修改成hive-env.sh文件):

export HADOOP_HOME=/opt/hadoop
export HIVE_CONF_DIR=/opt/hive/conf
export HIVE_AUX_JARS_PATH=/opt/hive/lib
export JAVA_HOME=/opt/java8

添加這四個路徑信息。

3.修改hive-site.xml文件

hive-site.xml文件是根據hive-default.xml.template 修改過後的,如果沒有這個文件,需要自己寫一個hive-site.xml文件:

<?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>/opt/hive/warehouse</value>    ----hive目錄
</property>
<property>
<name>hive.metastore.local</name>
<value>true</value>     ----是否是本地的hive庫
</property>
<!-- 如果是遠程mysql數據庫的話需要在這裏寫入遠程的IP或hosts -->
<property>
<name>javax.jdo.option.ConnectionURL</name>      ----URL
<value>jdbc:mysql://127.0.0.1:3306/hive_metadata?createDatabaseIfNotExist=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>    ----DRIVER
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>     ----USERNAME
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>     ----PASSWORD
<value>ok</value>   
</property>
</configuration>
4.上傳Mysql的connecter的jar包

將mysql-connector-java-5.1.38.jar上傳到/opt/hive/lib下。
資料鏈接:jar文件地址 提取碼:2do2

5.創建hdfs文件夾,並賦予權限
hadoop fs -mkdir -p /opt/hive/warehouse   ----創建warehouse目錄
hadoop fs -chmod 777 /user/opt/warehouse   ----賦權
hadoop fs -chmod -R 777 /opt/hive    ----給hive也賦權
6.初始化hive並啓動hive
schematool -dbType mysql -initSchema     ----初始化

初始化成功後,直接輸入:hive,然後就可以跳出hive命令行:

hive> show tables;
OK
aaa
Time taken: 3.888 seconds, Fetched: 1 row(s)
hive>

這裏的aaa是我之前在Mysql那邊建的一個aaa表,下面就可以使用mysql命令進行一系列操作了。

七、總結

講實話,這麼多操作,不練習個幾十遍,怎麼能記得住。這裏面有太多的坑,需要自己一步一步百度搜答案,總之,加油吧!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章