hadoop原生版安装部署---5.hbase

本文详细介绍HBase集群的规划、安装部署步骤及关键配置参数调整。从虚拟机环境准备到具体配置文件详解,帮助读者快速搭建并优化HBase集群。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

按照之前的规划,一共4台虚拟机c9tet91 c89test92 c9test93 c9test94
如未加特殊说明,以下操作均在hadoop用户下进行
1.规划
91 HMaster
92 backupmaster
93 HRegionServer
94 HregionServer
2.安装部署
2.1 找到与hadoop版本对应的hbase
http://hbase.apache.org/book.html#basic.prerequisites
查看jdk-hadoop-hbase之间的关系,目前的hadoop2.2只能最多到0.98.X

su - hadoop
tar xzvf hbase-0.98.24-hadoop2-bin.tar.gz 
mv hbase-0.98.24-hadoop2/ hbase/

2.2 替换hbase的jar包

cd hbase/lib
find -name 'hadoop*jar' 

惊喜发现对应的hadoop版本就是2.2.0,如果不是需要在hadoop目录的share/hadoop对应的common、yarn、mapreduce目录下知道对应的版本替换
hbase/lib 目录下还有个 slf4j-log4j12-XXX.jar,在机器有装hadoop时,由于classpath中会有hadoop中的这个jar包,会有冲突,直接删除掉(测试2.2版本不删也可以)

2.3profile

   vi ~/.bash_profile
   export HBASE_HOME="/home/hadoop/hbase"

2.4 hbase-env.sh

vi conf/hbase-env.sh 

   export JAVA_HOME=/usr/local/jdk1.6.0_45
   export HADOOP_HOME=/home/hadoop/hadoop
   export HBASE_CLASSPATH=/home/hadoop/hadoop/etc/hadoop   #指定了 hadoop 的配置文件路径

   export JAVA_LIBRARY_PATH="/usr/lib:/usr/local/lib:$LD_LIBRARY_PATH:$HADOOP_HOME/lib/native"
   export HBASE_LIBRARY_PATH=$LD_LIBRARY_PATH:$HBASE_LIBRARY_PATH

   export HBASE_OPTS="-server -XX:+UseParNewGC -XX:+UseConcMarkSweepGC "
   export HBASE_MASTER_OPTS=" -Xmx2G -Xms2G "                                    #master内存设置
   export HBASE_REGIONSERVER_OPTS=" -Xmx2G -Xms2G -XX:+CMSIncrementalMode "      #regionserver内存设置

   export HBASE_PID_DIR=${HBASE_HOME}/pids

   export HBASE_MANAGES_ZK=false

2.5.hbase-site.xml 默认为空
创建tmp目录 mkdir -p /hoe/hadoop/hbase/tmp
创建pid目录 mkdir -p /hoe/hadoop/hbase/pids

vi conf/hbase-site.xml
  <property>
    <name>hbase.rootdir</name>
    <value>hdfs://bvdata/hbase</value>
    </property>

  <property>
      <name>hbase.tmp.dir</name>
      <value>/home/hadoop/hbase/tmp</value>
      </property>  

  <property>
      <name>hbase.cluster.distributed</name>
      <value>true</value>
      </property>

  <property>  
      <name>hbase.master</name>  
      <value>c9test91:60000</value>
      </property>

  <property>  
      <name>hbase.zookeeper.quorum</name>  
      <value>c9test91,c9test92,c9test93</value>
      </property> 

  <property>
      <name>hbase.regionserver.codecs</name>
      <value>snappy</value>
      <description>本配置项确保:如果没有正确安装Snappy,那么RegionServer就无法启动</description>
  </property> 

  <property>
      <name>hbase.zookeeper.property.clientPort</name>
      <value>2181</value>
  </property>

  <property>
      <name>zookeeper.session.timeout</name>
      <value>180000</value>
      <description>ZooKeeper Session的超时时间,调低该值可以让ZooKeeper更快的发现RegionServer的掉线。 默认为180000.</description>
  </property>

  <property>
      <name>hbase.master.maxclockskew</name>
      <value>180000</value>
      <description>节点机的时间和master的时间差距大于30000ms,就是30秒时无法启动服务。修改各结点时间,使其误差在30s内</description>
  </property>

  <property>
      <name>hbase.master.meta.thread.rescanfrequency</name>
      <value>10000</value>
      <description>How long the HMaster sleeps (in milliseconds) between scans of the root and meta tables.</description>
  </property>

  <property>
      <name>hbase.server.thread.wakefrequency</name>
      <value>10000</value>
      <description>Time to sleep in between searches for work (in milliseconds).Used as sleep interval by service threads such as META scanner and log roller.
      </description>
  </property>

  <!--
             下面的是一些优化的配置 
               -->
  <property>
      <name>hbase.regionserver.handler.count</name>
      <value>10</value>
      <description>RegionServer控制RPC程序的线程数。如果RegionServer内存较大,可适量调高该值。 默认为10.</description>
  </property>

  <property>
      <name>hbase.hregion.majorcompaction</name>
      <value>86400000</value>
      <description>一个区域中所有主合并之间的间隔。当设置为0时禁用自动的主合并。主合并会消耗大量IO,重负载的HBase应该禁止自动合并。默认为86400000毫秒, 即一天时间一次.
      </description>
  </property>

  <property>
      <name>hbase.hregion.memstore.flush.size</name>
      <value>134217728</value>
      <description>写入数据时,内存到达该值后一次性写入磁盘。 默认为128M.</description>
  </property>

  <property>
      <name>hbase.hregion.max.filesize</name>
      <value>1258291200</value>
      <description>HRegion上每个分区的大小。如果无线的增大该值,会导致Region停止分割。这个也是关闭自动分割的办法。 默认为1G.</description>
  </property>

  <property>
      <name>hbase.hregion.memstore.block.multiplier</name>
          <value>2</value>
          <description>某区域的MemStore的大小到达一定阈值时, HBase会对更新阻塞。该值为hbase.hregion.memstore.flush.size × hbase.hregion.memstore.block.multiplier,也就是默认在256M会发生阻塞,在写
密集情况下可以提高该值。默认为2.
          </description>
  </property>

  <property>
      <name>ipc.server.tcpnodelay</name>
      <value>false</value>
      <description>true时禁止延迟, 即关闭使用缓冲区。 默认为false.</description>
  </property>

  <property>
      <name>ipc.client.tcpnodelay</name>
      <value>false</value>
      <description>true时禁止延迟, 即关闭使用缓冲区。 默认为false.</description>
 </property>

 <property>
      <name>ipc.ping.interval</name>
      <value>60000</value>
      <description>ipc ping 频率. 默一分钟。</description>
 </property>

 <property>
      <name>hfile.block.cache.size</name>
      <value>0.25</value>
      <description>RegionServer堆空间最大值的多少百分比分配给块缓存,默认25%</description>
 </property>

 <property>
      <name>hbase.client.scanner.caching</name>
      <value>100</value>
      <description>HBase对Scanner扫描缓存的数据行,在调用扫描类的next()方法时能读取到更多的行。默认为1</description>
 </property>

 <property>
      <name>hbase.regionserver.global.memstore.upperLimit</name>
      <value>0.4</value>
      <description>RegionServer中所有MemStore的总大小,使用超过该百分比后写操作会阻塞,并且强制写磁盘,直到占用率低于hbase.regionserver.global.memstore.lowerLimit。默认为0.4
      </description>
 </property>

 <property>
      <name>hbase.regionserver.global.memstore.lowerLimit</name>
      <value>0.35</value>
      <description>强制写磁盘后直到MemStore占用低于该百分比后停止。默认为0.35</description>
 </property>

  <property>
      <name>hbase.hstore.blockingStoreFiles</name>
      <value>7</value>
      <description>这个storefile就是每次memstore flush造成的,flush一次就多一个storefile,所以一个HStore里面会有多个storefile(其实就是hfile)。当StoreFile超过hbase.hstore.blockingStoreFiles的定义
就会发生阻塞并且写磁盘。默认为7
      </description>
  </property>

2.6.regionservers

  vi conf/regionservers
  c9test93
  c9test94

2.7 backup-masters
作用:当master挂掉后,backup master可以自动接管整个hbase的集群,在启动的时候在backup的log可看到waiting to become the next active master

  vi conf/backup-masters
  c9test92

2.8 将文件复制到其他机器

  scp -r hbase/ c9test92:/home/hadoop/
  scp -r hbase/ c9test93:/home/hadoop/
  scp -r hbase/ c9test94:/home/hadoop/
  scp ~/.bash_profile c9test92:~/
  scp ~/.bash_profile c9test93:~/
  scp ~/.bash_profile c9test94:~/

3.启动
3.1方式一:

bin/start-hbase.sh

3.2 方式二:

#91 
./bin/hbase-daemon.sh start master
#92 
./bin/hbase-daemon.sh start master --backup
#93 
bin/hbase-daemon.sh start regionserver
#94 
bin/hbase-daemon.sh start regionserver

4.web管理

http://192.168.209.91:60010/

5.shell操作

bin/hbase shell

  #可以将hbase命令用shell命令封装,即非交互模式的hbase shell可以参加hbase官方文档
  echo "describe 'test1'" | ./hbase shell -n


  #!/bin/bash

echo "describe 'test'" | ./hbase shell -n > /dev/null 2>&1
status=$?
echo "The status was " $status
if ($status == 0); then
    echo "The command succeeded"
else
    echo "The command may have failed."
fi
return $status

  #如果shell中不能使用删除和回退键,将securecrt的options--session---emulation 中的terminal修改为linux后,用ctrl+对应键即可。

附录: 常见shell命令

hadoop fs -ls / (hdfs dfs -ls /)查看文件路径,hbase在hadoop下根目录的hbase下
 例子:

 (1)创建表
 create 'usertable','info'   创建表名叫usertable,列族1个叫info

 (2)查看定义
 describe 'usertable'        查看表定义或者用desc 'usertable'

 (3)插入数据
 put 'domob',1,'info:age','20'  插入usertable rowkey为1 列为age 值20
 put 'usertable',1,'info:name','tom'  rowkey为1 列为name 值tom,注意此时有2个列了

 (4)读取数据
 scan 'usertable'  查看数据,全表查看

 (5)更新数据:hbase更新数据机制是增加一行,通过时间戳可以看到
  put 'usertable',1,'info:age','21'  更新rowkey=1的列age为21
  scan 'usertable'   

 (6)不同行可以有不同列
   put 'usertable',2,'info:age','20' 
   put 'usertable',2,'info:name','jerry' 
   put 'usertable',2,'info:city','beijing' 

 (7)动态增加列族:尽量不要建多个列族,性能很差
  alter 'usertable','newcf'

 (8)删除列
  delete 'usertable',1,'info:age'   必须指定rowkey

 (9)删除列族
 alter 'usertable','delete'=>'info'

  (10)统计行数,实际使用是MR,interval是统计间隔 cache是缓存行数
   count ‘t1′, INTERVAL => 10, CACHE => 1000 
   但是对大表性能很低
   bin/hbase org.apache.hadoop.hbase.mapreduce.RowCounter 'tablename' 执行MR执行
   看org.apache.hadoop.hbase.mapreduce.RowCounter$RowCounterMapper$Counters
                ROWS=1rows数目为最终结果)

   或者通过hive关联表查询

 (11)查看表占用空间
   hdfs dfs -ls /hbase/data/default 看下面对应目录就是表名,如bvuser
   hdfs dfs -du /hbase/data/default/bvuser 可以看到大小用-du是看到里面每个文件大小 -du -s是汇总大小



  (12)数据导出
   1 HBase本身提供的接口
其调用形式为:
1)导入
./hbase org.apache.hadoop.hbase.mapreduce.Driver import 表名    数据文件位置
其中数据文件位置可为本地文件目录,也可以分布式文件系统hdfs的路径。
当其为前者时,直接指定即可,也可以加前缀file:///
而当其伟后者时,必须明确指明hdfs的路径,例如hdfs://mymaster:9000/path
2)导出
./hbase org.apache.hadoop.hbase.mapreduce.Driver export 表名    数据文件位置
同上,其中数据文件位置可为本地文件目录,也可以分布式文件系统hdfs的路径。
另外,该接口类还提供了一些其它的方法,例如表与表之间的数据拷贝,导入tsv文件等,可回车键查看

例子:
 1)创建表和增加数据
   create 'mytable', {NAME => 'myfam', VERSIONS => 10}
   for i in '0'..'9' do
for j in '0'..'9' do
put 'mytable', "#{j}", "myfam:mycol", "#{i}#{j}"
end
end
#注意在一行执行

 2)导出数据
hbase org.apache.hadoop.hbase.mapreduce.Export "mytable" "/export/mytable"
hdfs dfs -ls /export/mytable
hdfs dfs -cat /export/mytable/part-m-00000 | more

 3)导出限定行数据
hbase org.apache.hadoop.hbase.mapreduce.Export -Dhbase.mapreduce.scan.row.start=0 -Dhbase.mapreduce.scan.row.stop=6 "mytable" "/export/mytable"

 4)采用压缩导出
hbase org.apache.hadoop.hbase.mapreduce.Export -Dmapreduce.output.fileoutputformat.compress=true -Dmapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.GzipCodec "mytable" "/export/mytable/compressed" 

5)导入,需要表先存在
 hbase org.apache.hadoop.hbase.mapreduce.Import 'mytable_import' '/export/mytable'
[manager1@hadoop102 hadoop]$ start-hbase.sh Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/thirdparty/com/google/common/collect/Interners at org.apache.hadoop.util.StringInterner.<clinit>(StringInterner.java:40) at org.apache.hadoop.conf.Configuration$Parser.handleEndElement(Configuration.java:3335) at org.apache.hadoop.conf.Configuration$Parser.parseNext(Configuration.java:3417) at org.apache.hadoop.conf.Configuration$Parser.parse(Configuration.java:3191) at org.apache.hadoop.conf.Configuration.loadResource(Configuration.java:3084) at org.apache.hadoop.conf.Configuration.loadResources(Configuration.java:3045) at org.apache.hadoop.conf.Configuration.loadProps(Configuration.java:2923) at org.apache.hadoop.conf.Configuration.getProps(Configuration.java:2905) at org.apache.hadoop.conf.Configuration.get(Configuration.java:1247) at org.apache.hadoop.conf.Configuration.getTrimmed(Configuration.java:1301) at org.apache.hadoop.conf.Configuration.getBoolean(Configuration.java:1708) at org.apache.hadoop.hbase.HBaseConfiguration.checkDefaultsVersion(HBaseConfiguration.java:69) at org.apache.hadoop.hbase.HBaseConfiguration.addHbaseResources(HBaseConfiguration.java:83) at org.apache.hadoop.hbase.HBaseConfiguration.create(HBaseConfiguration.java:97) at org.apache.hadoop.hbase.util.HBaseConfTool.main(HBaseConfTool.java:36) Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.thirdparty.com.google.common.collect.Interners at java.net.URLClassLoader.findClass(URLClassLoader.java:387) at java.lang.ClassLoader.loadClass(ClassLoader.java:418) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352) at java.lang.ClassLoader.loadClass(ClassLoader.java:351) ... 15 more Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/thirdparty/com/google/common/collect/Interners at org.apache.hadoop.util.StringInterner.<clinit>(StringInterner.java:40) at org.apache.hadoop.conf.Configuration$Parser.handleEndElement(Configuration.java:3335) at org.apache.hadoop.conf.Configuration$Parser.parseNext(Configuration.java:3417) at org.apache.hadoop.conf.Configuration$Parser.parse(Configuration.java:3191) at org.apache.hadoop.conf.Configuration.loadResource(Configuration.java:3084) at org.apache.hadoop.conf.Configuration.loadResources(Configuration.java:3045) at org.apache.hadoop.conf.Configuration.loadProps(Configuration.java:2923) at org.apache.hadoop.conf.Configuration.getProps(Configuration.java:2905) at org.apache.hadoop.conf.Configuration.get(Configuration.java:1247) at org.apache.hadoop.conf.Configuration.getTrimmed(Configuration.java:1301) at org.apache.hadoop.conf.Configuration.getBoolean(Configuration.java:1708) at org.apache.hadoop.hbase.HBaseConfiguration.checkDefaultsVersion(HBaseConfiguration.java:69) at org.apache.hadoop.hbase.HBaseConfiguration.addHbaseResources(HBaseConfiguration.java:83) at org.apache.hadoop.hbase.HBaseConfiguration.create(HBaseConfiguration.java:97) at org.apache.hadoop.hbase.zookeeper.ZKServerTool.main(ZKServerTool.java:60) Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.thirdparty.com.google.common.collect.Interners at java.net.URLClassLoader.findClass(URLClassLoader.java:387) at java.lang.ClassLoader.loadClass(ClassLoader.java:418) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352) at java.lang.ClassLoader.loadClass(ClassLoader.java:351) ... 15 more running master, logging to /opt/module/hbase-2.4.18/logs/hbase-manager1-master-hadoop102.out hadoop102: running regionserver, logging to /opt/module/hbase-2.4.18/logs/hbase-manager1-regionserver-hadoop102.out hadoop104: running regionserver, logging to /opt/module/hbase-2.4.18/logs/hbase-manager1-regionserver-hadoop104.out hadoop103: regionserver running a
最新发布
06-25
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值