OS:CentOS 6.4 64-bit
RAM:2G
CPU:Intel Core i5-2400 3.10GHz
Hadoop版本:hadoop-2.4.0.tar.gz
HBase版本:hbase-0.98.2-hadoop2-bin.tar.gz
html
主機 |
IP地址 |
用途 |
cos2 |
192.168.135.54 |
namenode,hmaster,zookeeper node |
cos3 |
192.168.135.55 |
datanode,hregionserver,zookeeper node |
cos4 |
192.168.135.102 |
datanode,hregionserver,zookeeper node |
Hadoop(HBase)集羣內全部主機必須具備惟一主機名,配置中均不能直接使用IP做爲主機的標識。
下面以cos2主機爲例說明:
#vim /etc/sysconfig/network java
NETWORKING=yes
HOSTNAME=cos2.cosdomain
其他各主機以此類推。 node
127.0.0.1 localhost localhost.localdomain
192.168.135.54 cos2 cos2.cosdomain
192.168.135.55 cos3 cos3.cosdomain
192.168.135.102 cos4 cos4.cosdomain linux
其中192.168.135.54爲主機cos2一個網卡的固定IPV4地址。 shell
# tar zxvf jdk_1.8.0_linux_x64.tar.gz -C /jdk apache
# vim /etc/profile vim
最後加入下面幾行 bash
export JAVA_HOME=/jdk1.8.0_05
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar dom
# groupadd hadoop
# useradd -g hadoop hadoop
# passwd hadoop
# groupadd hbase
# useradd -g hbase hbase
# passwd hbase
以Linux系統下用戶hadoop、hbase的名義運行hadoop、hbase程序時,必須確保hadoop、hbase用戶對hadoop、hbase配置文件中相應的目錄(如/opt/hadoop_data)有讀、寫、執行權限。 ssh
若沒有安裝ssh,執行
# yum install -y openssh
下面開始設置cos2到cos3和cos4主機上的無密碼登陸:
在cos2主機上作以下操做:
# sudo hadoop
$ ssh-keygen -t rsa-P '' -f ~/.ssh/id_rsa
$ ssh-copy-id -i ~/.ssh/id_rsa.pub cos3
hadoop@cos3‘s password:
$ ssh cos3 //驗證是否配置成功,不用輸密碼便可登陸cos3。
$ ssh cos4 //驗證是否配置成功,不用輸密碼便可登陸cos4。
集羣的時鐘要保證基本的一致。稍有不一致是能夠容忍的,可是很大的不一致會形成奇怪的行爲。 所以,可運行 NTP 或者採用其它方式同步集羣的時間.
若是你查詢的時候或者是遇到奇怪的故障,能夠檢查一下系統時間是否正確!
集羣內機器的環境(JDK、Hadoop、HBase安裝目錄、JAVA_HOME、HADOOP_HOME)徹底同樣,這樣能夠在一臺機器上配置好,而後把配置好的hadoop目錄hadoop-2.4.0整個文件夾經過scp拷貝拷貝到其餘機器的相同位置便可。
# tar zxvf hadoop-2.4.0.tar.gz -C /opt/hadoop-2.4.0 # chown -R hadoop:hadoop /opt/hadoop-2.4.0
(2)配置/opt/hadoop-2.4.0/etc/hadoop目錄下的四個文件:
core-site.xml:
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://cos2:8020</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/opt/hadoop_data</value> </property> </configuration>
hdfs-site.xml:
<configuration> <property> <name>dfs.name.dir</name> <value>/opt/hadoop-name-dir/name1, /opt/hadoop-name-dir/name2</value> <description>dfs.name.dir是namenode持久存儲命名空間鏡像及編輯日誌的本地文件系統路徑。 當這個值是一個逗號分割的目錄列表時,nametable數據將會被複制到全部目錄中作冗餘備份。 </description> </property> <property> <name>dfs.data.dir</name> <value>/opt/hadoop-data-dir/data1,/opt/hadoop-data-dir/data2</value> <description>dfs.data.dir是datadode存放塊數據的本地文件系統路徑,逗號分割的列表。 當這個值是逗號分割的目錄列表時,數據將被存儲在全部目錄下,一般分佈在不一樣設備上。 </description> </property> <property> <name>dfs.replication</name> <value>2</value> <description>dfs.replication是數據須要備份的數量,默認是3,若是此數大於集羣的機器數會出錯。 </description> </property> <property> <name>dfs.datanode.max.transfer.threads</name> <value>4096</value> </property> </configuration>
<configuration> <property> <name>mapred.job.tracker</name> <value>cos2:8021</value> </property> <property> <name>mapred.local.dir</name> <value>/opt/mapred-local-dir</value> </property> </configuration>
hadoop-env.sh:
export JAVA_HOME=/jdk1.8.0_05/
(3)
$ vim /etc/profile 最後加入下面幾行 export HADOOP_HOME==/opt/hadoop-2.4.0 export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
(4)
$ vim $HADOOP-HOME/etc/hadoop/slaves 加入兩行,即datanode的節點名稱 cos3 cos4
經過以上步驟hadoop即安裝配置完成。
$ hdfs namenode -format
格式化hadoop namenode,不少時候namenode啓動不起來能夠試試格式化一下
# start-dfs.sh 和start-yarn.sh //啓動hadoop的各個監護進程
在namenode機器上執行完命令後,namenode會自動啓動全部從節點的hadoop。查看每一臺主機會看到/opt/hadoop-name-dir/和/opt/hadoop-data-dir等目錄。
在主機cos2上執行1 - 4步:
1. 將hbase-0.98.2-hadoop2-bin.tar.gz包解壓在目錄/opt/hbase-0.98.2,並執行#chown -R hbase:hbase /opt/hbase-0.98.2命令
2. 配置/opt/hbase-0.98.2/conf/hbase-env.sh文件
export JAVA_HOME=/jdk1.8.0_05/
export HBASE_MANAGES_ZK=true
3. 編輯/opt/hbase-0.98.2/conf/hbase-site.xml 文件,增長如下內容
<property>
<name>hbase.rootdir</name>
<value>hdfs://cos2:8020/hbase</value>
<description>粗體部分的路徑必定要跟hadoop中core-site.xml中fs.defaultFS中的路徑相同,不然拋錯。這個目錄是region server的共享目錄,用來持久化Hbase。URL須要是'徹底正確'的,還要包含文件系統的scheme。例如,要表示hdfs中的'/hbase'目錄,namenode運行在cos2的8020端口。則須要設置爲hdfs://cos2:8020/hbase。默認狀況下Hbase是寫到/tmp的。不改這個配置,數據會在重啓的時候丟失。默認: file:///tmp/hbase-${user.name}/hbase
</description>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/opt/zookeeper-data-dir</value>
<description>ZooKeeper保存數據的目錄(這個路徑hadoop用戶擁有操做權限)。默認值是/tmp將會在重啓的時候會被操做系統刪掉。
</description>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>cos2,cos3,cos4</value>
<description>hbase中zookeeper的quorum個數,必須是奇數。</description>
</property>
<property>
<name>hbase.zookeeper.property.clientPort</name>
<value>2181</value>
</property>
4.編輯/opt/hbase-0.98.2/conf/regionservers
徹底分佈式模式的還須要修改conf/regionservers. 在這裏列出了你但願運行的所有 HRegionServer,一行寫一個host (就像Hadoop裏面的 slaves 同樣).
列在這裏的server會隨着集羣的啓動而啓動,集羣的中止而中止.
vim /opt/hbase-0.98.2/conf/regionservers
加入兩行
cos3
cos4
,而後使用SCP命令拷貝hbase安裝目錄到cos三、cos4主機上。
5.啓動HBase
在cos2執行
$start-hbase.sh //必須先啓動hadoop。若是採用不受hbase管理的單獨zookeepe,還要先啓動zookeeper。
這樣全部節點的HBase服務都會被啓動。
6.查看HBase集羣信息
若是一切正常,使用jdk自帶的jps命令查看可獲得相似以下輸出
在Master節點(cos2)上:
$ jps 2721 NameNode 2898 SecondaryNameNode 8197 HQuorumPeer 3766 HMaster 3887 Jps
$ jps 2968 HRegionServer 5720 HQuorumPeer 2525 DataNode 3023 Jps也能夠在地址 http://cos2:60010/master.jsp 查看HBase運行信息。
7.hbase shell控制檯操做
接下來就能夠啓動hbase shell
$./hbase shell
執行基本操做命令
>create 'table1','cf1'
8.中止hbase集羣
$ stop-hbase.sh #必須先中止hbase,而hadoop和zookeeper中止順序沒有限制
$ stop-dfs.sh
$ 中止zookeeper(若是採用不受hbase管理的單獨zookeeper,須要執行該命令。)
配置方法:
在$HBASE_HOME/conf/ 目錄下新增文件配置backup-masters,在其內添加要用作Backup Master的節點hostname。例如:
$ vim backup-masters
-------------------------------
cos03
以後,啓動整個集羣,咱們會發現,在cos03主機上也啓動了HMaster進程:
$ jps
----------------
7902 jps
5338 HMaster
此時查看cos03上master節點的log,能夠看到以下的信息:
2014-12-31 14:40:10,120 INFO org.apache.hadoop.hbase.master.ActiveMasterManager: Another master is the active master, cons02,60000,xxxxxxx; waiting to become the next active master
2014-12-31 14:40:10,436 DEBUG org.apache.hadoop.hbase.master.ActiveMasterManager: No master available. Notifying waiting threads 2014-12-31 14:40:10,438 INFO org.apache.hadoop.hbase.master.ActiveMasterManager: Master=cos03,60000,xxxxxxxx 2014-12-31 14:40:10,443 DEBUG org.apache.hadoop.hbase.master.ActiveMasterManager: A master is now available
(1)ERROR: Can't get master address from ZooKeeper; znode data == null
緣由:運行hbase(zookeeper)的用戶沒法寫入zookeeper文件,致使znode data爲空。
解決:在hbase-site.xml指定一個運行hbase的用戶有寫入文件權限的目錄做爲zookeeper數據目錄,如
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/home/user88/zk_data</value>
</property>
(2)HMaster起動失敗,HBASE_HOME/logs/下的master日誌有打印
master.HMaster: Unhandled exception. Starting shutdown.
java.net.ConnectException: Call From cos2.com/10.0.3.218 to cos2:8020 failed on connection exception: java.net.ConnectException: Connection refused; For more details see: http://wiki.apache.org/hadoop/ConnectionRefused
緣由:除了http://wiki.apache.org/hadoop/ConnectionRefused中緣由外,還應保證/etc/hosts文件中不存在 ::1 localhost localhost.localdomain這一行
解決:刪除/etc/hosts文件中不存在 ::1 localhost localhost.localdomain這一行
(3)start-dfs.sh啓動HDOOP_HOME/logs下日誌中報錯org.apache.hadoop.hdfs.server.common.InconsistentFSStateException: Directory /tmp/xxxxxxxx/dfs/name is in an inconsistent state: storage directory does not exist or is not accessible.
緣由: 在linux下hadoop等的各類數據默認保存在/tmp目錄下。 當重啓系統後/tmp目錄中的數據信息被清除,致使hadoop啓動失敗。
解決: bin/hadoop namenode -format 格式化後,恢復了默認設置,便可正常啓動。
或者在hadoop的core-site.xml中加入如下配置
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop_data</value>
</property>
#!/bin/bash #validate user or group validate() { if [ 'id -u' == 0 ];then echo "must not be root!" exit 0 else echo "---------welcome to hadoop---------" fi } #hadoop install hd-dir() { if [ ! -d /home/hadoop/ ];then mkdir /home/hadoop/ else echo "download hadoop will begin" fi } download-hd() { wget -c http://archive.apache.org/dist/hadoop/core/stable/hadoop-1.0.4.tar.gz -O /home/hadoop/hadoop-1.0.4.tar.gz tar -xzvf /home/hadoop/hadoop-1.0.4.tar.gz -C /home/hadoop rm /home/hadoop/hadoop-1.0.4.tar.gz Ln -s /home/hadoop/hadoop-1.0.4 /home/hadoop/hadoop1.0.4 } #hadoop conf hd-conf() { echo "export JAVA_HOME=/usr/lib/jvm/java-6-openjdk-i386" >> /home/hadoop/hadoop1.0.4/conf/hadoop-env.sh echo "#set path jdk" >> /home/hadoop/.profile echo "export JAVA_HOME=/usr/lib/jvm/java-6-openjdk-i386" >> /home/hadoop/.profile echo "#hadoop path" >> /home/hadoop/.profile echo "export HADOOP_HOME=/home/hadoop/hadoop1.0.4" >> /home/hadoop/.profile echo "PATH=$PATH:$HADOOP_HOME/bin:$JAVA_HOME/bin" >> /home/hadoop/.profile echo "HADOOP_HOME_WARN_SUPPRESS=1" >> /home/hadoop/.profile #hadoop core-site.xml echo "<configuration>" >> /home/hadoop/hadoop1.0.4/conf/core-site.xml echo "<property>" >> /home/hadoop/hadoop1.0.4/conf/core-site.xml echo "<name>fs.default.name</name>" >> /home/hadoop/hadoop1.0.4/conf/core-site.xml echo "<value>hdfs://hadoop-master:9000" >> /home/hadoop/hadoop1.0.4/conf/core-site.xml echo "</property>" >> /home/hadoop/hadoop1.0.4/conf/core-site.xml echo "<property>" >> /home/hadoop/hadoop1.0.4/conf/core-site.xml echo "<name>hadoop.tmp.dir</name>" >> /home/hadoop/hadoop1.0.4/conf/core-site.xml echo "<value>/home/hadoop/tmp</value>" >> /home/hadoop/hadoop1.0.4/conf/core-site.xml echo "</property>" >> /home/hadoop/hadoop1.0.4/conf/core-site.xml echo "</configuration>" >> /home/hadoop/hadoop1.0.4/conf/core-site.xml #hadoop hdfs-site.xml echo "<configuration>" >> /home/hadoop/hadoop1.0.4/conf/hdfs-site.xml echo "<property>" >> /home/hadoop/hadoop1.0.4/conf/hdfs-site.xml echo "<name>dfs.name.dir</name>" >> /home/hadoop/hadoop1.0.4/conf/hdfs-site.xml echo "<value>/home/hadoop/name</value>" >> /home/hadoop/hadoop1.0.4/conf/hdfs-site.xml echo "</property>" >> /home/hadoop/hadoop1.0.4/conf/hdfs-site.xml echo "<property>" >> /home/hadoop/hadoop1.0.4/conf/hdfs-site.xml echo "<name>dfs.data.dir</name>" >> /home/hadoop/hadoop1.0.4/conf/hdfs-site.xml echo "<value>/home/hadoop/data</value>" >> /home/hadoop/hadoop1.0.4/conf/hdfs-site.xml echo "</property>" >> /home/hadoop/hadoop1.0.4/conf/hdfs-site.xml echo "<property>" >> /home/hadoop/hadoop1.0.4/conf/hdfs-site.xml echo "<name>dfs.replication</name>" >> /home/hadoop/hadoop1.0.4/conf/hdfs-site.xml echo "<value>1</value>" >> /home/hadoop/hadoop1.0.4/conf/hdfs-site.xml echo "</property>" >> /home/hadoop/hadoop1.0.4/conf/hdfs-site.xml echo "</configuration>" >> /home/hadoop/hadoop1.0.4/conf/hdfs-site.xml # hadoop mapred-site.xml echo "<configuration>" >> /home/hadoop/hadoop1.0.4/conf/mapred-site.xml echo "<property>" >> /home/hadoop/hadoop1.0.4/conf/mapred-site.xml echo "<name>mapred.job.tracker</name>" >> /home/hadoop/hadoop1.0.4/conf/mapred-site.xml echo "<value>hadoop-master:9001</value>" >> /home/hadoop/hadoop1.0.4/conf/mapred-site.xml echo "</property>" >> /home/hadoop/hadoop1.0.4/conf/mapred-site.xml echo "</configuration>" >> /home/hadoop/hadoop1.0.4/conf/mapred-site.xml #hadoop master echo "hadoop-master" >> /home/hadoop/hadoop1.0.4/conf/masters #hadoop slaves echo "hadoop-master" >> /home/hadoop/hadoop1.0.4/conf/slaves source /home/hadoop/.profile } hd-start() { hadoop namenode -format } yes-or-no() { echo "Is your name $* ?" while true do echo -n "Enter yes or no: " read x case "$x" in y | yes ) return 0;; n | no ) return 1;; * ) echo "Answer yes or no";; esac done } echo "Original params are $*" if yes-or-no "$1" then echo "HI $1,nice name!" validate hd-dir download-hd hd-conf else echo "Never mind!" fi
http://blog.csdn.net/hguisu/article/details/7237395
http://hbase.apache.org/book.html#basic.prerequisites
http://www.cnblogs.com/ventlam/archive/2011/01/22/HBaseCluster.html