HBase安装
hadoop集群:
hadoop1.2.1
master 192.168.1.161
slave01 192.168.1.163
slave02 192.168.1.164
slave03 192.168.1.165
slave04 192.168.1.166
hbase版本: hbase0.94
1、修改hadoop hdfs-site.xml
dfs.datanode.max.xcievers hbase操作时并发量很大,需要修改并发量,默认是1024
dfs.support.append 可以追加数据,添加保存时需要用到。
<property>
<name>dfs.support.append</name>
<value>true</value>
</property>
<property>
<name>dfs.datanode.max.xcievers</name>
<value>4096</value>
</property>
2、启动hadoop,查看进程hadoop进程
3、解压hbase0.94,我解压在与hadoop同一级目录
4、配置hbase/conf/hbase-env.sh
exportJAVA_HOME=/usr/jdk1.7.25
exportHBASE_MANAGES_ZK=true #hbase要用zookeeper来进行管理
5、配置hbase/conf hbase-site.xml
hbase.rootdir 设置hbase在hdfs上的目录,和hadoop连接。主机名为hdfs的节点所在的主机
hbase.cluster.distributed 分布式,表明是完全分布式hbase集群
hbase.master 设置hbase的主机和端口
hbase.tmp.dir hbase的临时文件目录
hbase.zookeeper.quorum zookeeper的主机,建议使用单数
hbase.zookeeper.property.clientPort 设置zookeeper的端口,默认是2181
hbase.zookeeper.property.dataDir 设置zookeeper的存储目录
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://nistest.master:9000/hbase</value>
<description>Thedirectory shared by region servers.</description>
</property>
<property>
<name>hbase.master</name>
<value>nistest.master</value>
</property>
<property>
<name>hbase.master.port</name>
<value>60000</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.tmp.dir</name>
<value>/usr/local/hadoop/hbase/tmp</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/usr/local/hadoop/zookeeper/data</value>
</property>
<property>
<name>hbase.zookeeper.property.clientPort</name>
<value>2181</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>nistest.node1,nistest.node2,nistest.node3,nistest.node4</value>
</property></configuration>
6、配置regionservers,将region server添加到这个文件
Nistest.node1,nistest.node2,nistest.node3,nistest.node4
7、拷贝hadoop-core-1.2.1.jar到hbase/lib目录下,覆盖旧的版本。
替换Hbase中的jar包
需要用{HADOOP_HOME}下的hadoop-1.2.1-core.jar 替换掉{HBASE_HOME}/lib目录下的hadoop-core-0.20-append-r1056497.jar 。如果不替换jar文件Hbase启动时会因为hadoop和Hbase的客户端协议不一致而导致HMaster启动异常。报错如下:
localhost: Exception in thread "main"org.apache.hadoop.ipc.RPC$VersionMismatch: Protocol org.apache.hadoop.hdfs.protocol.ClientProtocolversion mismatch. (client = 42, server = 41)
所以如果遇到以上错误,就通过替换jar包解决。
并把~/hadoop/conf/hdfs-site.xml拷贝至~/hbase/conf/目录下。
8、将hbase复制到各个节点
scp -r hbase [email protected]:/usr/local/hadoop
9、启动hbase
bin/start-hbase.sh
10、查看进程
查看各节点上进程:
jps命令进行查看
11、hbase web界面 http://master:60010
如果此时不能访问那有可能是hadoop没有离开安全模式的原因,此时
当在hbase shell下创建表时,出现MasterNotRunningException异常,list、get等不能正常执行,通过Java API同样不能创建表,究其原因在于分布式文件系统处于安全模式状态下,执行 hadoop dfsadmin-safemode leave,重新启动hbase,问题即可解决。
Hadoop分布式文件系统为什么不自动退出安全模式呢?就让我们来看一下Hadoop安全模式吧。
namenode在启动的时候首先进入安全模式,如果datanode丢失的block达到一定的比例(datanode通过心跳包上报的block块数达到元数据记录的block块数的0.9990,系统会自动退出安全模式),则系统会一直处于安全模式状态即只读状态。默认情况下dfs.safemode.threshold.pct的值为0.999f。关于安全模式的命令:
hadoop dfsadmin -safemode get(获取安全模式是否开启)
hadoop dfsadmin -safemode leave(强制退出)
hadoop dfsadmin -safemode enter(进入)
hadoop dfsadmin -safemode wait(一直等待直到退出安全模式)
11、hbase操作:
bin/habseshell
list
create'user','f1','2','f3'
用shell连接你的Hbase
$ ./bin/hbase shell
HBase Shell; enter 'help<RETURN>' for list of supported commands.
Type "exit<RETURN>" to leave the HBase Shell
Version: 0.90.0, r1001068, Fri Sep 24 13:55:42 PDT 2010
hbase(main):001:0>
输入 help 然后 <RETURN> 可以看到一列shell命令。这里的帮助很详细,要注意的是表名,行和列需要加引号。
创建一个名为 test
的表,这个表只有一个columnfamily 为 cf
。可以列出所有的表来检查创建情况,然后插入些值。
hbase(main):003:0> create 'test', 'cf'
0 row(s) in 1.2200 seconds
hbase(main):003:0> list 'table'
test
1 row(s) in 0.0550 seconds
hbase(main):004:0> put 'test', 'row1', 'cf:a', 'value1'
0 row(s) in 0.0560 seconds
hbase(main):005:0> put 'test', 'row2', 'cf:b', 'value2'
0 row(s) in 0.0370 seconds
hbase(main):006:0> put 'test', 'row3', 'cf:c', 'value3'
0 row(s) in 0.0450 seconds
以上我们分别插入了3行。第一个行key为row1
, 列为 cf:a
,值是 value1
。Hbase中的列是由 columnfamily前缀和列的名字组成的,以冒号间隔。例如这一行的列名就是a
.
检查插入情况.
Scan这个表,操作如下
hbase(main):007:0> scan 'test'
ROW COLUMN+CELL
row1 column=cf:a, timestamp=1288380727188, value=value1
row2 column=cf:b, timestamp=1288380738440, value=value2
row3 column=cf:c, timestamp=1288380747365, value=value3
3 row(s) in 0.0590 seconds
Get一行,操作如下
hbase(main):008:0> get 'test', 'row1'
COLUMN CELL
cf:a timestamp=1288380727188, value=value1
1 row(s) in 0.0400 seconds
disable再 drop 这张表,可以清除你刚刚的操作
hbase(main):012:0> disable 'test'
0 row(s) in 1.0930 seconds
hbase(main):013:0> drop 'test'
0 row(s) in 0.0770 seconds
关闭shell
hbase(main):014:0> exit
用./start-hbase.sh启动HBase后,执行hbaseshell
# bin/hbase shell
HBase Shell; enter 'help<RETURN>' for list of supported commands.
Version: 0.20.6, rUnknown, Thu Oct 28 19:02:04 CST 2010
接着创建表时候出现如下情况:hbase(main):001:0>create 'test',''c
NativeException: org.apache.hadoop.hbase.MasterNotRunningException:null
jps下,发现主节点上HMaster没有启动,查理HBaselog(logs/hbase-hadoop-master-ubuntu.log)里有下面异常:
FATAL org.apache.hadoop.hbase.master.HMaster: Unhandled exception.Starting shutdown.
java.io.IOException: Call to node1/10.64.56.76:49002 failed on local exception:java.io.EOFException
解决:
从hadoop_home/下面cp一个hadoop/hadoop-core-0.20.203.0.jar到hbase_home/lib下。
因为Hbase建立在Hadoop之上,所以他用到了hadoop.jar,这个Jar在 lib 里面。这个jar是hbase自己打了branch-0.20-append补丁的hadoop.jar.Hadoop使用的hadoop.jar和Hbase使用的必须一致。所以你需要将 Hbaselib 目录下的hadoop.jar替换成Hadoop里面的那个,防止版本冲突。比方说CDH的版本没有HDFS-724而branch-0.20-append里面有,这个HDFS-724补丁修改了RPC协议。如果不替换,就会有版本冲突,继而造成严重的出错,Hadoop会看起来挂了。
再用./start-hbase.sh启动HBase后,jps下,发现主节点上HMaster还是没有启动,在HBaselog里有下面异常:
FATAL org.apache.hadoop.hbase.master.HMaster: Unhandled exception.Starting shutdown.
java.lang.NoClassDefFoundError: org/apache/commons/configuration/Configuration
解决:
在NoClassDefFoundError,缺少org/apache/commons/configuration/Configuration
果断给他加一个commons-configuration包,
从hadoop_home/lib下面cp一个hadoop/lib/commons-configuration-1.6.jar到hbase_home/lib下。
(集群上所有机子的hbase配置都需要一样)
1)、先启动hadoop后,再开启hbase
2)、去掉hadoop的安全模式:hadoop dfsadmin -safemode leave
3)、把/etc/hosts里的ubuntu的IP改为服务器当前的IP
4) 、确认hbase的hbase-site.xml中
<name>hbase.rootdir</name>
<value>hdfs://node:49002/hbase</value>
与hadoop的core-site.xml中
<name>fs.default.name</name>
<value>hdfs://node:49002/hbase</value>
红字部分保持一致
<value>hdfs://localhost:8020/hbase</value>
6)、重新执行./start-hbase.sh之前,先kill掉当前的hbase和zookeeper进程
PS:遇到问题时,先查看logs,很有帮助。
HBase 官方文档,全面介绍hbase安装配置:
http://www.yankay.com/wp-content/hbase/book.html#hbase_default_configurations