十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
本篇内容介绍了“ HBase的环境配置及应用方法 ”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
成都创新互联公司主营青白江网站建设的网络公司,主营网站建设方案,重庆APP开发公司,青白江h5微信小程序开发搭建,青白江网站营销推广欢迎青白江等地区企业咨询
hbase是bigtable的开源山寨版本。是建立的hdfs之上,提供高可靠性、高性能、列存储、可伸缩、实时读写的数据库系统。
它介于NOSQL和RDBMS之间,仅能通过主键(row key)和主键的range来检索数据,仅支持单行事务(可通过hive支持来实现多表join等复杂操作)。主要用来存储非结构化和半结构化的松散数据。与hadoop一样,Hbase目标主要依靠横向扩展,通过不断增加廉价的商用服务器,来增加计算和存储能力。
HBase以表的形式存储数据。表有行和列组成。列划分为若干个列族(row family)。
我们可以先来看一下传统的关系型数据库中的表:
然后与HBase的表进行对比,hbase的表结构,与传统的关系型数据库有较大的差别
1、一个表会按照行划分为若干个region,每一个region分配给一台特定的regionserver管理
2、每一个region内部还要一句列族划分为若干个HStore
3、每个HStore中的数据会落地到若干个HFILE文件中
4、region体积会随着数据插入而不断增长,到一定阈值后悔分裂
5、随着region的分裂,一台regionserver上管理的region会越来越多
6、HMASTER会根据regionserver上管理的region数做负载均衡
7、region中的数据拥有一个内存缓存:memstore,数据的访问优先在memstore中进行
8、memstore中的数据因为空间有限,所以需要定期flush到文件storefile中,每次flush都是生成新的storefile
9、storefile的数量随着时间也会不断增加,regionserver会定期将大量storefile进行合并(merge)
行键的设计对数据查询效率的影响非常大。
HBase具有很好的可伸缩性:如果存储容量不够的时候,直接加datanode或者regionservers
hbase可以作为一个线上系统的底层系统的功能。
Hmaster可以做负载均衡,监控到各个节点之间的数据存储情况。
每一个store(列族)会有一个内存缓存,存放的是一些最热的数据(最近访问的),这样的话读取数据的速度会快很多。
文件都是有索引的,所以查起来会比较快的。
region会在storefile定期进行合并操作。
1、首先要去下载一个HBase的安装文件: http://hbase.apache.org/,然后解压到你需要安装的目录,如果你已经学到hbase了,我相信这些基本的安装肯定全部都会了的。
2、在habse目录下的conf目录下找到hbase-env.sh和hbase-site.xml,以及regionservers,然后分别按照下面的进行配置,整个配置过程非常简单。
在hbase-env.sh中,主要是配置java的环境变量,还有就是要开启zookeeper功能,这里要把默认的true改成的false,意思就是启用zookeeper,但是启用的不是hbase自带的zookeeper,而是使用我自己安装的zookeeper。
export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-amd64 export HBASE_MANAGES_ZK=false
在hbase-site.xml中,主要就是配置hdfs的主机地址,还有下面的ubuntu1,2,3就是zookeeper的主机名个端口2181,不同的机器可以酌情配置。
configuration>hbase.rootdir hdfs://ubuntu2:9000/hbase hbase.cluster.distributed true hbase.zookeeper.quorum ubuntu1:2181,ubuntu2:2181,ubuntu3:2181
3、最后修改regionservers,将默认的localhost修改为主机的地址,这个配置文件的意思就是设置从节点,和我们之前配置的hadoop集群都是差不多的,就相当于那个salver。
ubuntu1 ubuntu2 ubuntu3
4、最后将hadoop中的core-site.xml和hdfs-site.xml拷贝到hbase的conf目录下。
5、然后通过scp将这个配置好的文件发往其他的两个节点。
最后我只想说一句不要在这配置文件里面多打了字母,否则会报错的。
1、启动所有的hbase进程
首先启动zk集群
./zkServer.sh start
启动hbase集群
start-dfs.sh
启动hbase,在主节点上运行:
start-hbase.sh
2、 通过浏览器访问hbase管理页面
192.168.44.131:60010
3、 为保证集群的可靠性,要启动多个HMaster
hbase-daemon.sh start master
jps在主节点上面的效果是:会启动HRegionServer和HMaster
我们可以通过web页面查看启动的情况:192.168.44.131:60010,也就是你的主节点的ip或主机名+端口号60010就可以了。
官方给的例子是:
Examples: hbase> create 'ns1:t1', 'f1', SPLITS => ['10', '20', '30', '40'] hbase> create 't1', 'f1', SPLITS => ['10', '20', '30', '40'] hbase> create 't1', 'f1', SPLITS_FILE => 'splits.txt', OWNER => 'johndoe' hbase> create 't1', {NAME => 'f1', VERSIONS => 5}, METADATA => { 'mykey' => 'myvalue' } hbase> # Optionally pre-split the table into NUMREGIONS, using hbase> # SPLITALGO ("HexStringSplit", "UniformSplit">
那么我们就以例子为准,来新建一个用户信息表。表名为user-info,包含两个列族(base_info和extra_info),保留3个版本。
create 'user-info',{NAME=>'base_info',VERSIONS=>3},{NAME=>'extra_info'}
官方给的语句是:
hbase> put 'ns1:t1', 'r1', 'c1', 'value', ts1
那么我们就按照它的语法来写:
put 'user-info','rk-100001','base_info:name','张s' put 'user-info','rk-100001','base_info:age','20' put 'user-info','rk-100001','base_info:address','湖南长沙'
在hbase只能一条条的插入,就比如一次只能插入name,那么如果我们想插入age,address就需要一个个的put。
1、我们可以通过scan来查询:
scan 'user-info'
我们可以从图中看到它是按key来排序的(字段的名称会根据字典排序)k-value
如果我再插入一行,
put 'user-info','rk100003','base_info:name','angelabby'
一行中的所有字段名+字段值,在存储的时候,hbase会排序,排序的依据是按照K的字典顺序,所有的行也会有序存储,排序的依据是rowkey的字典顺序。
这个特性会影响连续存放。
2、get取数据,一次只能取一行数据
get 'user-info','rk100003'
三个版本:
put 'user-info','rk100003','base_info:name',’yangying' put 'user-info','rk100003','base_info:name','baobao'
查看以前版本的值:
scan 'user-info',{VERSIONS=>10}
需要先禁用这个表,然后才可以drop掉。
需要先禁用这个表,然后才可以drop掉。 disable 'user-info' drop 'user-info'
打开eclipse,导入hbase/lib中的所有包。然后就可以愉快的开始写了,这里以在eclipse中庸hbase建表和插入数据为例:
//建表,DDL操作 public static void main(String[] args) throws MasterNotRunningException, ZooKeeperConnectionException, IOException { // Configuration conf=new Configuration(); //会加载hbase-site.xml配置文件 Configuration conf=HBaseConfiguration.create(); conf.set("hbase.zookeeper.quorum","ubuntu1:2181,ubuntu2:2181,ubuntu3:2181"); HBaseAdmin admin=new HBaseAdmin(conf); TableName name = TableName.valueOf("user-info"); HTableDescriptor tableDescriptor=new HTableDescriptor(name); //创建列名 HColumnDescriptor base_info = new HColumnDescriptor("base_info"); //给列族增加版本约束 base_info.setMaxVersions(3); //将列族添加到表描述对象中 tableDescriptor.addFamily(base_info); //用createTable方法创建一个tabelDescriptor所描述的对象 admin.createTable(tableDescriptor); //关闭连接 admin.close(); }
最后我们可以在hbase的shell窗口来查看表是否已建好表。输入list就可以查询了
然后来插入数据:
@Test //插入数据,属于DML操作 public void Put() throws IOException{ Configuration conf=HBaseConfiguration.create(); conf.set("hbase.zookeeper.quorum","ubuntu1:2181,ubuntu2:2181,ubuntu3:2181"); HTable hTable = new HTable(conf,"user-info"); Put put=new Put(Bytes.toBytes("rk-10001")); put.add("base_info".getBytes(),"name".getBytes(),"wangming".getBytes()); put.add("base_info".getBytes(),"age".getBytes(),"20".getBytes()); hTable.put(put); hTable.close(); }
最后我们可以在hbase的shell窗口来查看表是否已插入好数据。
“ HBase的环境配置及应用方法 ”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注创新互联网站,小编将为大家输出更多高质量的实用文章!