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