昨天和今天我主要学习了下HBase,在此记录下自己的学习心得。
初次接触HBase,发现它有自带的zookeeper;我原先是完全分布式安装了hadoop的,三台机器,不过我运行的时候暂时只开了两台,所以下面出现的例子都是只起了两台的哈。
按理是要分开另外安装zookeeper比较好,而不是使用HBase自带的内部的zookeeper,原因大概就是如下所述(摘自百度知道一用户的回答,个人觉得他回答的不错):
因为我们是好多hbase集群共用一个zookeeper的,其中一个集群需要从hbase 0.90.2 升级到hbase 0.92上,自然,包也要更新。但是其中一台regionserver上面同时也有跑zookeeper,而zookeeper还是用hbase 0.90.2 自带的zookeeper在跑。 ? 现在好了,升级一个regionserver,连着zookeeper也要受到牵连,看来必须要重启,不然,jar包替换掉,可能会影响到zk正在跑的经常。但是重启zk毕竟对正在连接这个zk的client端会有短暂的影响。 ? 真是蛋疼。本来只是升级hbase,zk却强耦合了。 ? 虽然后来证明zookeeper只要启动了,哪怕jar包删除也不会影响到正在跑的zk进程,但是这样的不规范带来的风险,实在是没有必要。 ? 所以作为运维,我强烈建议zk 和hbase分开部署,就直接部署官方的zk 好了,因为zk本身就是一个独立的服务,没有必要和hbase 耦合在一起。 ? 在分布式的系统部署上面,一个角色就用一个专门的文件夹管理,不要用同一个目录下,这样子真的容易出问题。
目前我也是偷懒,所以直接使用了HBase自带的zookeeper。
我的运行环境hadoop2.8.0, hbase1.2.6 (hadoop的配置在此就不说了,大家可以照官网自己搭建。我的三台机器名分别为bigdata1,bigdata2,bigdata3;这里只运行后两台)
-
HBase配置
以bigdata3上的配置为例
hbase-site.xml
<configuration> <property> <name>hbase.rootdir</name> <value>hdfs://bigdata3:9000/hbase</value> </property> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <property> <name>hbase.zookeeper.quorum</name> <value>bigdata1,bigdata2,bigdata3</value> </property> <property> <name>hbase.zookeeper.sission.timeout</name> <value>60000</value> </property> <property> <name>hbase.zookeeper.property.clientPort</name> <value>2181</value> </property> <property> <name>hbase.regionserver.lease.period</name> <value>60000</value> </property> <property> <name>hbase.rpc.timeout</name> <value>60000</value> </property> <property> <name>hbase.master.info.port</name> <value>60010</value> </property> <property> <name>hbase.master</name> <value>hdfs://bigdata3:60000</value> </property> </configuration>
hbase-env.sh
export HBASE_CLASSPATH=/home/hadoop/hbase-1.2.6/conf export HBASE_OPTS="-XX:+UseConcMarkSweepGC" export HBASE_MASTER_OPTS="$HBASE_MASTER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m" export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m" export HBASE_LOG_DIR=${HBASE_HOME}/logs # The directory where pid files are stored. /tmp by default. export HBASE_PID_DIR=/home/hadoop/hbase-1.2.6/pids # Tell HBase whether it should manage it's own instance of Zookeeper or not. export HBASE_MANAGES_ZK=true export JAVA_HOME=/home/hadoop/jdk1.8.0_121/ export HBASE_HOME=/home/hadoop/hbase-1.2.6 export PATH=$PATH:$HBASE_HOME/bin export HADOOP_HOME=/home/hadoop/hadoop2.8.0regionservers
bigdata1 bigdata2 bigdata3
启动hadoop后启动hbase,使用命令start-hbase.sh start
然后hbase shell即可进行数据库操作;具体的shell操作命令我就不列举啦!同时可以进行浏览器访问
现在新版本的hbase这个端口已经改成了16010了,大家注意下。
昨天上午到这都是正常的,但是下午饭后回来就发现hbase出错啦。
后来看日志觉得就是zookeeper没有起来,
但是我不知道Hbase自带的zookeeper在哪,要怎么手动重启呢?百度很久都没有找到解决办法,网上的方法都试啦,还没有解决;
这等我后面解决啦再记录吧,如果大家有遇到同样问题并解决啦,麻烦告诉伟下!先谢啦~
因为使用自带的hbase时其默认文件保存在tmp下,所以暂时我就先删掉啦tmp下内容然后重新启动的hbase。
下面我用eclipse java新建了一种表,代码如下:
mport java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.HColumnDescriptor; import org.apache.hadoop.hbase.HTableDescriptor; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.HBaseAdmin; public class CreateTable { public static void main(String[] args) throws IOException { Configuration con = HBaseConfiguration.create(); con.set("hbase.zookeeper.quorum", "master");//使用eclipse时必须添加这个,否则无法定位;如果填matser还是没有用,你可以填ip地址 HBaseAdmin admin= new HBaseAdmin(con); HTableDescriptor tableDescriptor = new HTableDescriptor(TableName.valueOf("emp")); tableDescriptor.addFamily(new HColumnDescriptor("personal")); tableDescriptor.addFamily(new HColumnDescriptor("professional")); admin.createTable(tableDescriptor); admin.close(); System.out.println("Table created"); } }
在eclipse中记得add external jars,把hbase lib下的jar包都添加进去!