大數據集群環境搭建(7節點)


 

系統版本及相關軟件:

CentOS6.7 64 2.6.32-573.el6.x86_64,選擇安裝時為mini選項,不安裝圖形界面

hadoop-2.7.1.tar.gz

jdk-7u79-linux-x64.tar.gz

zookeeper-3.4.9.tar.gz

apache-hive-2.1.1-bin.tar.gz

hbase-1.2.4-bin.tar.gz

hadoop-2.7.1 hbase-1.2.4 版本匹配

Hadoop集群、NameNode+HAResourceManager+HAHive使用MYSQL管理元數據、HBase+HA、使用ZooKeeper來管理Hadoop集群

 

 

集群規划

主機名

IP地址

應用軟件

運行進程(運行jps后的顯示)

Node01

192.168.1.1

Jdk hadoop

DFSZKFailoverController

NameNode

Node02

192.168.1.2

Jdk hadoop

DFSZKFailoverController

NameNode

Node03

192.168.1.3

Jdk hadoop hbase

ResourceManager

Main

HMaster

Node04

192.168.1.4

Jdk hadoop hbase

HMaster

ResourceManager

Node05

192.168.1.5

Jdk hadoop hbase zookeeper

QuorumPeerMain HRegionServer

DataNode

NodeManager

JournalNode

Node06

192.168.1.6

Jdk hadoop hbase zookeeper

JournalNode NodeManager

HRegionServer

QuorumPeerMain

DataNode

Node07

192.168.1.7

Jdk hadoop hbase  zookeeper hive mysql

HRegionServer

JournalNode

DataNode

QuorumPeerMain

NodeManager

 

說明:

1、本次搭建,安排了兩個NameNode節點,分別是12號機,兩台NameNode,一台處於active狀態,另一台處於standby狀態。ActiveNameNode對外提供服務,Standby NameNode不對外提供服務,僅同步active namenode狀態,以便能夠在它失敗時進行     快速切換。

2Hadoop 官方提供了兩種 HDFSHA的解決方案,一種是NFS,另一種是QJM。在本次搭建中,我們使用QJM,主備NameNode通過JournalNode同步數據,只要成功寫入多數JournalNode即認為寫入成功,所以要配置奇數個JournalNode,我們配置了3個。

3、本次搭建上,配置了2ResourceManager,一個是Active,一個是Standby,狀態由zookeeper進行協調

二、安裝步驟大概有以下幾個部分組成,開通用戶、時鍾同步、關閉防火牆、配置JAVA運行環境、hadoop安裝、zookeeperhivemysqlhbase等相關軟件的安裝。

2.1、開能用戶,開通一個專屬用戶hduser,以后所有用戶都以這個普通用戶的權限進行操作,提高安全性,在7台機器都開通同樣的用戶名,設置同樣的口令,編輯 /etc/sudoers文件,給用戶hduser開放部分root權限。

2.2、編輯 /etc/hosts,1號機上編輯,等設置好無密碼登錄后,復制到其它6台機器上

cat /etc/hosts

127.0.0.1  localhost localhost.localdomain localhost4 localhost4.localdomain4

::1        localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.1.1     node01

192.168.1.2     node02

192.168.1.3     node03

192.168.1.4     node04

192.168.1.5     node05

192.168.1.6     node06

192.168.1.7     node07

2.3、實現機器間無密登,錄配置免密碼登陸

首先要配置node01node02node03node04node05node06node07的免密碼登陸在node01上生產一對鑰匙

                                     ssh-keygen  -t rsa

將公鑰拷貝到其他節點,包括自己

                                     ssh-coyp-id node01

                                     ssh-coyp-id node02

                                     ssh-coyp-id node03

                                     ssh-coyp-id node04

                                     ssh-coyp-id node05

                                     ssh-coyp-id node06

                                     ssh-coyp-id node07

配置node03node04node05node06node07的免密碼登陸,node03上生產一對鑰匙

                                     ssh-keygen -t rsa

將公鑰拷貝到其他節點

                                     ssh-coyp-id node04

                                     ssh-coyp-id node05

                                     ssh-coyp-id node06

                                     ssh-coyp-id node07

兩個namenode之間要配置ssh免密碼登陸,配置node02node01的免登陸,node02上生產一對鑰匙

                                     ssh-keygen -t rsa

                                     ssh-coyp-id-i node01                                  

 

2.4、時鍾同步,本次搭建以1號機的時鍾為准,1號機開通ntpd服務

[hduser@node01~]$ service ntpd status

ntpd (pid 21729) is running...

其它6部機器運行ntpdate命令,以此類似

[hduser@node02 ~]$ sudo ntpdate node01

[sudo] password for hadoop:

6 Mar 14:24:28 ntpdate[10817]: step timeserver 192.168.1.1 offset -23.277136 sec

為確保時鍾同步,應將該命令寫入計划任務

2.5、安裝lrzsz工具,用於上傳下載文件,安裝openssh-clients,以便可以執行scp命令

sudo yum install lrzsz

安裝lrzsz,使用rzsz命令可以方便地上傳和下載文件

sudo yum install openssh-clients

安裝openssh-clients,可以方便地使用scp 命令遠程拷貝目錄和文件

2.6、安裝JDK

         1號機中,解壓釋放jdk-7u79-linux-x64.tar.gz,指定放在/home/hadoop下,編輯/etc/profile文件,在文件尾部加上

############################

export      JAVA_HOME=/home/hadoop/jdk1.7.0_79

export      JRE_HOME=${JAVA_HOME}/jre

export      CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib

export      PATH=$JAVA_HOME/bin:$PATH

############################

export      HADOOP_HOME=/home/hadoop/hadoop-2.7.1

export      PATH=$HADOOP_HOME/bin:$PATH

export     PATH=$HADOOP_HOME/sbin:$PATH

export  CLASSPATH=$($HADOOP_HOME/bin/hadoop classpath):$CLASSPATH

在這里只需要上半部分就可以,下半部分是給hadoop准備的,編輯完成后用source命令使之生效,在任務路徑下執行java 命令,都可以如下顯示

[node01 ~]$ java -version

java version "1.7.0_79"

Java(TM) SE Runtime Environment (build1.7.0_79-b15)

Java HotSpot(TM) 64-Bit Server VM (build24.79-b02, mixed mode)

說明在1號中,已經完成java的運行環境的准備工作

2.7、安裝HDFS+HA

HDFS是通過分布的集群來存儲文件的,存儲的文件被切成一塊一塊的block,存儲文件的block存放在若干台datanode上的,映射關系由namenode進行管理,每一個block在集群中存儲多個副本。前面講到過,使用JournalNode來確保主備NameNode的數據同步,由Zookeeper來解決ResourceManager的單一故障點問題。

2.7.1、安裝配置zookeeper集群

zookeepergooglechubby一個開源的實現,是hadoop分布式協調服務,chubby是一種為了實現mapreducebigdata而構建的內部的工具。zookeeper首先是一個集群,提供少量數據的儲存和管理,zookeeper不能存業務數據,只能存儲狀態信息,zookeeper由奇數個節點組成,每個節點的角色分FllowerLeader兩種,Leader為主節點,負責寫操作,當超過一半的節點操作成功,就認為本次操作成功,擔任什么角色不是事先分配,啟動時各個節點地位平等,至於擔任什么角色通過選舉機制決定

2.7.1.1 5號機上運行,解壓 tar-zxvf  zookeeper-3.4.9.tar.gz

2.7.1.2 修改配置

cd  ./zookeeper-3.4.9/conf/

cp zoo_sample.cfg zoo.cfg

vi zoo.cfg

$ cat zoo.cfg

# The number of milliseconds of each tick

tickTime=2000

# The number of ticks that the initial

# synchronization phase can take

initLimit=10

# The number of ticks that can pass between

# sending a request and getting anacknowledgement

syncLimit=5

# the directory where the snapshot isstored.

# do not use /tmp for storage, /tmp here isjust

# example sakes.

#dataDir=/tmp/zookeeper

dataDir=/home/hadoop/zookeeper-3.4.9/data

# the port at which the clients willconnect

clientPort=2181

# the maximum number of client connections.

# increase this if you need to handle moreclients

#maxClientCnxns=60

#

# Be sure to read the maintenance sectionof the

# administrator guide before turning onautopurge.

#

#http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance

#

# The number of snapshots to retain indataDir

#autopurge.snapRetainCount=3

# Purge task interval in hours

# Set to "0" to disable autopurge feature

#autopurge.purgeInterval=1

server.5=node05:11605:11615

server.6=node06:11605:11615

server.7=node07:11605:11615

紅色部為修改的部分

然后創建一個data文件夾

mkdir ./zookeeper-3.4.9/data

再創建一個空文件

touch ./zookeeper-3.4.9/data/myid

最后向該文件寫入ID

echo 5 > ./zookeeper-3.4.9/data/myid

2.7.1.3將配置好的zookeeper拷貝到其他節點(node06node07)

scp -r /home/hadoop/zookeeper-3.4.5/ node06:/home/hadoop/

scp -r /home/hadoop/zookeeper-3.4.5/ node07:/home/hadoop/

注意:修改node06node07對應/home/hadoop/zookeeper-3.4.9/data/myid內容

         node06

         echo 6 > /home/hadoop/zookeeper-3.4.9/data/myid

         node07

         echo 7 > /home/hadoop/zookeeper-3.4.9/data/myid

2.7.1.4 啟動測試zookeeper集群

$ pwd

/home/hadoop/zookeeper-3.4.9/bin

./zkServer.sh start

#查看狀態:一個leader,兩個follower

./zkServer.sh status

$ ./zkServer.sh status

ZooKeeper JMX enabled by default

Using config:/home/hadoop/zookeeper-3.4.9/bin/../conf/zoo.cfg

Mode: follower

2.7.2 安裝配置hadoop集群(在1號機上操作)

2.7.2.1 解壓在目錄/home/hadoop/下運行tar -zxvf hadoop-2.7.1.tar.gz

2.7.2.2 配置HDFS的環境變量,在/etc/profile下增加

export      HADOOP_HOME=/home/hadoop/hadoop-2.7.1

export      PATH=$HADOOP_HOME/bin:$PATH

export     PATH=$HADOOP_HOME/sbin:$PATH

export  CLASSPATH=$($HADOOP_HOME/bin/hadoop classpath):$CLASSPATH

或是

export JAVA_HOME=/home/hadoop/jdk1.7.0_79

export HADOOP_HOME=/home/hadoop/hadoop-2.7.1

exportPATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin

2.7.2.3 進入hadoop的配置目錄/home/hadoop/hadoop-2.7.1/etc/hadoop

編輯hadoop-env.sh

export JAVA_HOME=/home/hadoop/jdk1.7.0_79

2.7.2.4 編輯core-site.xml

$cat core-site.xml

<?xml version="1.0"encoding="UTF-8"?>

<?xml-stylesheettype="text/xsl" href="configuration.xsl"?>

<!--

 Licensed under the Apache License, Version 2.0 (the"License");

  youmay not use this file except in compliance with the License.

  Youmay obtain a copy of the License at

 

   http://www.apache.org/licenses/LICENSE-2.0

 

 Unless required by applicable law or agreed to in writing, software

 distributed under the License is distributed on an "AS IS"BASIS,

 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

  Seethe License for the specific language governing permissions and

 limitations under the License. See accompanying LICENSE file.

-->

 

<!-- Put site-specific propertyoverrides in this file. -->

 

<configuration>

         <property>      

                   <name>fs.defaultFS</name>

                   <value>hdfs://ns1/</value>

         </property>

         <property>

                   <name>hadoop.tmp.dir</name>

                   <value>/home/hadoop/hadoop-2.7.1/tmp</value>

         </property>

         <property>

                   <name>ha.zookeeper.quorum</name>

                   <value>node05:2181,node06:2181,node07:2181</value>

         </property>

</configuration>

2.7.2.5編輯hdfs-site.xml

cat hdfs-site.xml

 

<configuration>

         <!--指定hdfsnameservicens1,需要和core-site.xml中的保持一致 -->

         <property>

                   <name>dfs.nameservices</name>

                   <value>ns1</value>

         </property>

         <!--ns1下面有兩個NameNode,分別是nn1nn2 -->

         <property>

                   <name>dfs.ha.namenodes.ns1</name>

                   <value>nn1,nn2</value>

         </property>

         <!--nn1RPC通信地址 -->

         <property>

                   <name>dfs.namenode.rpc-address.ns1.nn1</name>

                   <value>node01:9000</value>

         </property>

         <!--nn1http通信地址 -->

         <property>

                   <name>dfs.namenode.http-address.ns1.nn1</name>

                   <value>node01:50070</value>

         </property>

         <!--nn2RPC通信地址 -->

         <property>

                   <name>dfs.namenode.rpc-address.ns1.nn2</name>

                   <value>node02:9000</value>

         </property>

         <!--nn2http通信地址 -->

         <property>

                   <name>dfs.namenode.http-address.ns1.nn2</name>

                   <value>node02:50070</value>

         </property>

         <!--指定NameNode的元數據在JournalNode上的存放位置 -->

         <property>

                   <name>dfs.namenode.shared.edits.dir</name>

                  <value>qjournal://node05:8485;node06:8485;node07:8485/ns1</value>

         </property>

                   <!--指定JournalNode在本地磁盤存放數據的位置 -->

         <property>

                   <name>dfs.journalnode.edits.dir</name>

                   <value>/home/hadoop/hadoop-2.7.1/journaldata</value>

         </property>

         <!--開啟NameNode失敗自動切換 -->

         <property>

                   <name>dfs.ha.automatic-failover.enabled</name>

                   <value>true</value>

         </property>

         <!--配置失敗自動切換實現方式 -->

         <property>

                   <name>dfs.client.failover.proxy.provider.ns1</name>

                   <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>

         </property>

         <!--配置隔離機制方法,多個機制用換行分割,即每個機制暫用一行-->

         <property>

                   <name>dfs.ha.fencing.methods</name>

                   <value>

                            sshfence

                            shell(/bin/true)

                   </value>

         </property>

         <!--使用sshfence隔離機制時需要ssh免登陸 -->

         <property>

                   <name>dfs.ha.fencing.ssh.private-key-files</name>

                   <value>/home/hadoop/.ssh/id_rsa</value>

         </property>

         <!--配置sshfence隔離機制超時時間 -->

         <property>

                   <name>dfs.ha.fencing.ssh.connect-timeout</name>

                   <value>30000</value>

         </property>

</configuration>

如果是直接復制以上配置,需要將中文注釋刪除。

2.7.2.6 編輯mapred-site.xml

<configuration>

         <property>

                   <name>mapred.job.tracker</name>

                   <value>node01:9001</value>

         </property>

         <property>

                   <name>mapred.map.tasks</name>

                   <value>20</value>

         </property>

         <property>

                   <name>mapred.reduce.tasks</name>

                   <value>4</value>

         </property>

         <property>

                   <name>mapreduce.framework.name</name>

                   <value>yarn</value>

         </property>

         <property>

                   <name>mapreduce.jobhistory.address</name>

                   <value>node01:10020</value>

         </property>

         <property>

                   <name>mapreduce.jobhistory.webapp.address</name>

                   <value>node01:19888</value>

         </property>

</configuration>

2.7.2.7 編輯 yarn-site.xml

<configuration>

         <property>

                   <name>yarn.resourcemanager.ha.enabled</name>

                   <value>true</value>

         </property>

         <property>

                   <name>yarn.resourcemanager.cluster-id</name>

                   <value>yrc</value>

         </property>

         <property>

                   <name>yarn.resourcemanager.ha.rm-ids</name>

                   <value>rm1,rm2</value>

         </property>

         <property>

                   <name>yarn.resourcemanager.hostname.rm1</name>

                   <value>node03</value>

         </property>

         <property>

                   <name>yarn.resourcemanager.hostname.rm2</name>

                   <value>node04</value>

         </property>

         <property>

                   <name>yarn.resourcemanager.zk-address</name>

                   <value>node05:2181,node06:2181,node07:2181</value>

         </property>

         <property>

                   <name>yarn.nodemanager.aux-services</name>

                   <value>mapreduce_shuffle</value>

         </property>

</configuration>

2.7.2.8修改slaves(slaves是指定子節點的位置,因為要在node01上啟動HDFS、在node03啟動yarn,所以node01上的slaves文件指定的是datanode的位置,node03上的slaves文件指定的是nodemanager的位置)

[node01 hadoop]$ cat slaves

#localhost

node05

node06

node07

[node03]$ cat slaves

#localhost

node05

node06

node07

2.7.2.9 將配置好的hadoop拷貝到其它節點

scp -r hadoop-2.7.1/ node02:/home/hadoop/

scp -r hadoop-2.7.1/ node03:/home/hadoop/

其它幾個節點類似

同時也要把 /etc/profile   /etc/hosts 兩個文件復制到所有節點機上

2.7.2.10 hadoop格式化

1號上執行 hdfs namenode -fromat,注意格式化后會在根據core-site.xml中的hadoop.tmp.dir配置生成個文件,/home/hadoop/hadoop-2.7.1/tmp,然后將/home/hadoop/hadoop-2.7.1/tmp拷貝到2號機的/home/hadoop/hadoop-2.7.1/下。

                            scp-r tmp/ node02:/home/hadoop/hadoop-2.7.1/

 如果首次格式化失敗,重新格式化需要執行一下命令:

hdfs  namenode -format -force

2.8HA部分

2.8.1 啟動 zookeeper集群

分別在node05node06node07上運行

/home/hadoop/zookeeper-3.4.9/bin/zkServer.sh start

查看狀態

./zkServer.sh status

2.8.2 啟動journalnode

分別在node05node06node07上運行

/home/hadoop-2.7.1/sbin ./hadoop-daemon.sh start journalnode

運行jps命令檢驗,node05node06node07上多了JournalNode進程

2.8.3格式化ZKFC,node01上執行

                            hdfs zkfc  -formatZK

2.8.4 啟動HDFS,noded01上執行

                            sbin/start-dfs.sh

運行jps命令檢驗

2.8.5啟動YARN(#####注意#####:是在node03上執行start-yarn.sh,把namenoderesourcemanager分開是因為性能問題,因為他們都要占用大量資源,所以把他們分開了,他們分開了就要分別在不同的機器上啟動)

                            sbin/start-yarn.sh

運行jps命令檢驗

 

2.8.6測試HDFS

hadoop-2.7.1配置完畢,可以統計瀏覽器訪問:

                   http://192.168.1.1:50070

                   NameNode'node01:9000' (active)

                   http://192.168.1.2:50070

                   NameNode'node2:9000' (standby)

驗證HDFS HA

                   首先向hdfs上傳一個文件

                   hadoopfs -put /etc/profile /profile

                   hadoopfs -ls /

                   然后再killactiveNameNode

                   kill-9 <pid of NN>

                   通過瀏覽器訪問:http://192.168.1.2:50070

                   NameNode'node02:9000' (active)

                   這個時候node02上的NameNode變成了active

                   在執行命令:

                   hadoopfs -ls /

                   -rw-r--r--   3 root supergroup       1926 2014-02-06 15:36 /profile

                   剛才上傳的文件依然存在!!!

                   手動啟動那個掛掉的NameNode

                   sbin/hadoop-daemon.sh start namenode

                   通過瀏覽器訪問:http://192.168.1.1:50070

                   NameNode'node01:9000' (standby)

驗證YARN

                   運行一下hadoop提供的demo中的WordCount程序:

                   hadoopjar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.1.jar wordcount/profile /out,這個試驗還沒有做

測試集群工作狀態的一些指令:

bin/hdfs dfsadmin -report        查看hdfs的各節點狀態信息

bin/hdfs haadmin -getServiceState nn1           獲取一個namenode節點的HA狀態

sbin/hadoop-daemon.sh start namenode  單獨啟動一個namenode進程

./hadoop-daemon.sh start zkfc   單獨啟動一個zkfc進程

 

三、hive+mysql 的安裝與配置

7號機上運行,hive依賴hdfs,注意要先啟動zookeeper,hive本質上翻譯工具,本次搭建用mysql來管理元數據

下載 apache-hive-2.1.1-bin.tar.gz

tar -zxvf apache-hive-2..1.1.tar.gz

cp hive-default.xml.template hive-site.xml

vi hive-site.xml

<?xml version="1.0"encoding="UTF-8" standalone="no"?>

<?xml-stylesheettype="text/xsl" href="configuration.xsl"?><!--

  Licensed to the Apache Software Foundation (ASF) under one or more

  contributor license agreements. See the NOTICE file distributed with

  this work for additional information regarding copyright ownership.

  The ASF licenses this file to You under the Apache License, Version 2.0

  (the "License"); you may not use this file except incompliance with

  the License.  You may obtain acopy of the License at

 

      http://www.apache.org/licenses/LICENSE-2.0

 

  Unless required by applicable law or agreed to in writing, software

  distributed under the License is distributed on an "AS IS"BASIS,

  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

  See the License for the specific language governing permissions and

  limitations under the License.

--><configuration>

 <!-- WARNING!!! This file is auto generated for documentationpurposes ONLY! -->

 <!-- WARNING!!! Any changes you make to this file will be ignored byHive.   -->

 <!-- WARNING!!! You must make your changes in hive-site.xmlinstead.         -->

 <!-- Hive Execution Parameters -->

       <property> 

       <name>javax.jdo.option.ConnectionURL</name> 

       <value>jdbc:mysql://192.168.1.7:3306/hive?useSSL=false</value> 

   </property> 

   <property> 

       <name>javax.jdo.option.ConnectionDriverName</name> 

       <value>com.mysql.jdbc.Driver</value> 

   </property> 

   <property> 

       <name>javax.jdo.option.ConnectionUserName</name> 

        <value>root</value> 

   </property> 

   <property> 

       <name>javax.jdo.option.ConnectionPassword</name> 

       <value>hadoop111</value> 

   </property> 

  <property>   

    <name>hive.metastore.schema.verification</name>   

     <value>false</value>   

    <description>   

   Enforce metastore schema version consistency.   

   True: Verify that version information stored in metastore matches withone from Hive jars.  Also disableautomatic   

         schema migration attempt. Users are required to manully migrate schemaafter Hive upgrade which ensures   

         proper metastore schema migration. (Default)   

   False: Warn if the version information stored in metastore doesn't matchwith one from in Hive jars.   

    </description>   

  </property>  

<property>

    <name>hive.querylog.location</name>

    <value>/home/hive/hive-2.1.1/iotmp/${user.name}</value>

    <description>Location of Hive run time structured log file</description>

  </property>

 

<property>

    <name>hive.server2.logging.operation.log.location</name>

    <value>/home/hive/hive-2.1.1/iotmp/${user.name}/operation_logs</value>

    <description>Top level directory where operation logs are stored if logging functionality is enabled</description>

  </property>

<property>

    <name>hive.exec.local.scratchdir</name>

    <value>/home/hive/hive-2.1.1/iotmp/${user.name}</value>

    <description>Local scratch space for Hive jobs</description>

  </property>

<property>

    <name>hive.downloaded.resources.dir</name>

    <value>/home/hive/hive-2.1.1/iotmp/${hive.session.id}_resources</value>

    <description>Temporary local directory for added resources in the remote file system.</description>

  </property>

</configuration>

/home/hive/hive-2.1.1下新建一個文件夾iotmp

 

注意配置文件中需要指定使用mysql來管理metastore.db,指定驅動,指定mysql 的用戶名和密碼

如果報com.mysql.jdbc.Driver找不到的錯誤,請下載

sudo yum install mysql-connector-java

編輯hive-env.sh

cp hive-env.sh.template hive-env.sh

vi hive-env.sh

在尾部加上

export HADOOP_HOME=/home/hadoop/hadoop-2.7.1

#export HIVE_HOME=/home/hadoop/hive

export HIVE_CONF_DIR=/home/hadoop/hive/conf

export HIVE_AUX_JARS_PATH=/home/hadoop/hive/lib

 

手動創建hive數據庫

mysql 進行連接測試 

schematool -initSchema -dbType mysql

運行 ./hive

注意要確認mysql開啟遠程登錄

 

四、hbase安裝 

下載hbase-1.2.4-bin.tar.gz

解壓、釋放

配置hbase集群,要修改3個文件(首先zk集群已經安裝好了)
    
注意:要把hadoophdfs-site.xmlcore-site.xml 放到hbase/conf,這是因為hbase要使用hdfs客戶端的API,要調用配置文件
  
 
修改hbase-env.sh
    export JAVA_HOME=/usr/java/jdk1.7.0_79
    //
告訴hbase使用外部的zk
    export HBASE_MANAGES_ZK=false
    
    vim hbase-site.xml
    <configuration>
        <!--
指定hbaseHDFS上存儲的路徑 -->
        <property>
                <name>hbase.rootdir</name>
                <value>hdfs://ns1/hbase</value>
        </property>
        <!--
指定hbase是分布式的 -->
        <property>
                <name>hbase.cluster.distributed</name>
                <value>true</value>
        </property>
        <!--
指定zk的地址,多個用“,”分割 -->
        <property>
                <name>hbase.zookeeper.quorum</name>
                <value>hadoop-node5:2181,hadoop-node6:2181,hadoop-node7:2181</value>
        </property>
    </configuration>
    
    vim regionservers  

    hadoop-node5

    hadoop-node6

   hadoop-node7

   
   
拷貝hbase到其他節點
              scp -r hbase-1.2.4/hadoop-node3:/home/hadoop/

     350  scp -r hbase-1.2.4/ hadoop-node4:/home/hadoop/
     359  scp -r hbase-1.2.4/ hadoop-node0x05:/home/hadoop/
     363  scp -r hbase-1.2.4/ hadoop-node0x05:/home/hadoop/
    364  scp -r hbase-1.2.4/ hadoop-node0x06:/home/hadoop/
    365  scp -r hbase-1.2.4/ hadoop-node0x07:/home/hadoop/

將配置好的HBase拷貝到每一個節點並同步時間。

啟動所有的hbase
    
分別啟動zk
        ./zkServer.sh start
    
啟動hbase集群
        start-dfs.sh
    
啟動hbase,在主節點上運行:
        start-hbase.sh
通過瀏覽器訪問hbase管理頁面
    http://hadoop-node3:16010/master-status
為保證集群的可靠性,要啟動多個HMaster
    hbase-daemon.sh start master

測試,34號機運行jps后,應該有三個進程

16783 HMaster
19535 Jps
3905 ResourceManager

567號機運行jps應該有五個進程

$ jps
17101 QuorumPeerMain
5497 Jps
5314 HRegionServer
26076 DataNode
26210 NodeManager
25994 JournalNode


注意,同步時間也很重要,下面是由於沒有同步時間造成的錯誤

ERROR [B.defaultRpcServer.handler=0,queue=0,port=16000] master.MasterRpcServices: Region server hadoop-

node7,16020,1488528679958 reported a fa
tal error:
ABORTING region server hadoop-node0x07,16020,1488528679958: Unhandled: 

org.apache.hadoop.hbase.ClockOutOfSyncException: Server hadoop-node0x07,16020,1488528679958 has be
en rejected; Reported time is too far out of sync with master.  Time difference of 30475ms > max allowed of 30000ms
    at org.apache.hadoop.hbase.master.ServerManager.checkClockSkew(ServerManager.java:409)
    at org.apache.hadoop.hbase.master.ServerManager.regionServerStartup(ServerManager.java:275)
    at org.apache.hadoop.hbase.master.MasterRpcServices.regionServerStartup(MasterRpcServices.java:361)
    at org.apache.hadoop.hbase.protobuf.generated.RegionServerStatusProtos$RegionServerStatusService

$2.callBlockingMethod(RegionServerStatusProtos.java:8615)
    at org.apache.hadoop.hbase.ipc.RpcServer.call(RpcServer.java:2180)
    at org.apache.hadoop.hbase.ipc.CallRunner.run(CallRunner.java:112)
    at org.apache.hadoop.hbase.ipc.RpcExecutor.consumerLoop(RpcExecutor.java:133)
    at org.apache.hadoop.hbase.ipc.RpcExecutor$1.run(RpcExecutor.java:108)
    at java.lang.Thread.run(Thread.java:745)

Cause:
org.apache.hadoop.hbase.ClockOutOfSyncException: org.apache.hadoop.hbase.ClockOutOfSyncException: Server hadoop-

node0x07,16020,1488528679958 has been rejected; Reported 
time is too far out of sync with master.  Time difference of 30475ms > max allowed of 30000ms
    at org.apache.hadoop.hbase.master.ServerManager.checkClockSkew(ServerManager.java:409)
    at org.apache.hadoop.hbase.master.ServerManager.regionServerStartup(ServerManager.java:275)
    at org.apache.hadoop.hbase.master.MasterRpcServices.regionServerStartup(MasterRpcServices.java:361)
    at org.apache.hadoop.hbase.protobuf.generated.RegionServerStatusProtos$RegionServerStatusService

$2.callBlockingMethod(RegionServerStatusProtos.java:8615)
    at org.apache.hadoop.hbase.ipc.RpcServer.call(RpcServer.java:2180)
    at org.apache.hadoop.hbase.ipc.CallRunner.run(CallRunner.java:112)
    at org.apache.hadoop.hbase.ipc.RpcExecutor.consumerLoop(RpcExecutor.java:133)
    at org.apache.hadoop.hbase.ipc.RpcExecutor$1.run(RpcExecutor.java:108)
    at java.lang.Thread.run(Thread.java:745)

    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
運行ntpdate后解決問題

機架感知

Rack awareness 機架感知

1、什么是機架感知,hadoop的策略是什么

這是Hadoop的機架感知機制。

機架感知(RackAwareness)

通常,大型Hadoop集群會分布在很多機架上。在這種情況下,

  -- 希望不同節點之間的通信能夠盡量發生在同一個機架之內,而不是跨機架。

  -- 為了提高容錯能力,名稱節點會盡可能把數據塊的副本放到多個機架上。

綜合考慮這兩點的基礎上Hadoop設計了機架感知功能。

機架感知設計思想

首先,一個重要的假設前提是HDFS運行於一個具有樹狀網絡拓撲結構的集群上。

例如集群由多個數據中心組成,每個數據中心里有多個機架,而每個機架上有多台計算機(數據節點)

 

 

網絡拓撲(NetworkTopology

 

Hadoop里,以類似於一種文件目錄結構的方式來表示節點。

例如,R1的位置可以表示為 /D1/R1,而H12的位置可以表示為 /D2/R4/H12

 

當數據節點啟動的時候,需要通過一種機制來明確它在集群中的位置,才能構建完整的網絡拓撲圖

因此,首先它需要確認它的上級節點(通常也就是機架)的位置。數據節點程序支持選項”-p<id>””-parent<id>”從命令行讀入上級節點位置。

如果沒有指定這個選項,那么會使用一個默認的上級節點。

至於如何獲取上級節點信息,由實施Hadoop的機構自行決定。一個常用的做法是使用腳本打印當前機器的上級節點信息到標准輸出stdout

這樣數據節點啟動的時候就可以獲取到上級節點的信息(Hadoop應該是通過接口’DNSToSwitchMapping’來解析這個信息,具體請參考手冊的Class說明)。



數據節點會把它的位置信息發給名稱節點。

當名稱節點收到數據節點的位置信息以后,它會先檢查網絡拓撲中是否已經有這個數據節點的記錄。

如果有,它會把舊的記錄刪除,加入新的節點位置信息。

 

副本放置(ReplicaPlacement

 

數據塊的副本放置策略的目的是在以下兩者之間取得平衡:

-- 使數據的可靠性和可用性最大化

--
使寫入數據產生的開銷最小化

因此,當一個新的數據塊被創建的時候,遵循以下規則:

 

-- 1個副本放置於本地節點

--
2個副本放置於不同的機架

--
3個副本放置於本地機架的不同節點

--
其余的副本在遵循以下限制的前提下隨機放置

     -- 1個節點最多放置1個副本

     -- 如果副本數少於2倍機架數,不可以在同一機架放置超過2個副本

 

當重新復制一個數據塊的時候,遵循以下規則:

 

-- 如果已有1個副本,把第2個副本放置在不同的機架

--
如果已有2個副本且處於同一機架,把第3個副本放置在不同的機架

--
如果已有2個副本但不處於同一機架,把第3個副本放置在和第1個副本相同的機架

--
當可用副本數超過2個的時候,隨機放置

 

當發生數據讀取的時候,名稱節點首先檢查客戶端是否位於集群中。

如果是的話,就可以按照由近到遠的優先次序決定由哪個數據節點向客戶端發送它需要的數據塊。

也就是說,對於擁有同一數據塊副本的節點來說,在網絡拓撲中距離客戶端近的節點會優先響應

2、編輯hadoop的配置文件 core-site.xml

        <property>
                <name>net.topology.script.file.name</name>
                <value>/home/hadoop/hadoop-2.7.1/rack.py</value>

        </property>

其中rack.py可以采有其它編程語言,例如shell,c等,路徑也可改變,但要注意權限問題

3、在指定目錄下編輯rack.py

 

#!/usr/bin/python
import sys
if sys.argv[1]=="192.168.137.13":
        print "/hadoop-rackA"
elif sys.argv[1]=="192.168.137.14":
        print "/hadoop-rackB"
elif sys.argv[1]=="192.168.137.15":
        print "/hadoop-rackB"
else:
        print "/default-rack"
保存后,加上執行權限

4、測試 

stop-dfs.sh

start-dfs.sh

hdfs dfsadmin -printTopology

[hadoop@hadoop-namenode hadoop]$ hdfs dfsadmin -printTopology
Rack: /hadoop-rackA
   192.168.137.13:50010 (hadoop-datanode1)

Rack: /hadoop-rackB
   192.168.137.14:50010 (hadoop-datanode2)
   192.168.137.15:50010 (hadoop-datanode3)

 

 

原文地址:https://blog.csdn.net/lepton126/article/details/60866664

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM