hbase_1
常见的RDBMS:(数据库排行) ** mysql --开源[社区版] 、收费[企业版] --市场占有率高、web领域被广泛使用 ** 2008年被oracle收购 ** mysql主从架构[集群的一种] ** 端口:3306 ** oracle ** oracle集群性能比较强 ** mysql集群性能相对比较差一下 ** 端口:1521 ** sqlserver ** 微软公司[windows 2008\2012\2012R2] ** windows项目、微软平台下面的项目用得比较多 ** 端口:1433 数据量增加,RMDBS的应对: 1 读写分离,主数据库用于写,其他用于读 2 增加缓存 3 垂直扩容和横向扩展 4 采用逆范式化结构 5 停用存储过程和放弃辅助索引 非关系型数据库 NoSQL(Not Only SQL): ** HBase、mongoDB、redis ** 没有sql语句 ** 性能和效率较高 ** 尤其是当单表数据量过大,又必需进行全表扫描,且不能分库分表时,可以考虑使用非关系型数据库 ** 注意:非关系型数据库并非万能的,需要根据业务来选择使用何种数据库 ====HBase部署================================= 1、安装Apache Hadoop,并启动 2、启动zookeeper(未安装的需要安装) $ bin/zkServer.sh start ----------------依赖zookeeper的原因是存储元数据,通过他找到对应的regionserver 3、解压HBase 4、配置hbase-env.sh: export JAVA_HOME=/opt/modules/jdk1.7.0_67 # 关闭掉HBase自带的zookeeper export HBASE_MANAGES_ZK=false //不使用自带的zookeeper 5、配置hbase-site.xml: <!--用来存放HBase数据--> <property> <name>hbase.rootdir</name> <value>hdfs://blue01.mydomain:8020/hbase</value> </property> <!--启用集群模式,当前为伪分布式--> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <property> <name>hbase.zookeeper.quorum</name> <value>blue01.mydomain</value> </property> 6、regionservers文件:(替换localhost) blue01.mydomain 7、替换lib目录中低版本的hadoop和zookeeper的jar包 $ rm -rf lib/hadoop-* $ rm -rf lib/zookeeper-3.4.6.jar 拷贝对应的jar包到lib目录 8、启动服务 $ bin/hbase-daemon.sh start master $ bin/hbase-daemon.sh start regionserver ** $ bin/start-hbase.sh ** $ bin/stop-hbase.sh 访问:http://192.168.122.128:60010/ PS: HBase默认配置文件hbase-default.xml 在 hbase-common-0.98.6-hadoop2.jar ================================================================= 结构化与非结构化数据: 结构化(表) name cardid age sex addr job1 job2 job3 edu1 edu2 张三 1 23 男 上海 谷歌 电信 北大 同济 李四 2 女 北京 清华 非结构化 rowkey:身份证cardid(相当于primary key) cardid: 1 name:张三 age: 23 sex:男 addr: 上海 job1:谷歌 job2:电信 edu1:同济 cardid: 2 name:李四 sex:女 addr: 北京 使用"键值对"进行查询(key-value): rowkey + Column family + column + timestamp----> value 如:cardid(2)+CF+name: 李四 cardid(2)+CF+sex : 女 HBase数据类型 ** HBase不区分数据类型 ** 数据存储读取时:字节数组 HBase中数据存储的重要术语 ** rowkey:行键 用来唯一标识每一行数据,类似RDBMS中的主键 ** Column Family[CF] : 列族 用来组织列, 一个列族里包含多个列 在实际环境中,从性能上考虑,列族个数<=2,最好是一个 ** Column : 列 字段名,列名 ** timestamp: 数据插入到表中的时间 ** Cell : 单元格 最小或最基本的存储单元,列的实际值存储 ** 版本 HBase中每个列的值可以有多个版本[副本] 默认情况下,有3个版本,通常显示最新版本 ** 基于Key-Value对形式存取数据 rowkey + CF + Column + timestamp : value ====================================================================== PS: hbase默认不支持退格键,解决方案: a) 使用Ctrl+Backspace b) Xshell: 文件--属性--终端--键盘--两个都选择ASCII 127 c) secureCRT:(百度) 选项--会话选项--仿真--终端--选择Linux 选项--会话选项--映射键--勾上:backspace发送delete和delete发送backspace ----shell命令------------------- $ bin/hbase shell hbase(main):001:0> > help > list --显示所有数据表 > create 'emp','info' --表名,列族 > desc 'emp' --查看表信息 > describe 'emp' --同上 > create 't1',{NAME => 'f1'},{NAME => 'f2'},{NAME => 'f3'} --多个列族 > put 'emp','1001','info:name','zhangsan' --插入 > put 'emp','1001','info:name','aaa' --更新 > put 'emp','1001','info:age','25' ...... > scan 'emp' --查看数据 > get 'emp','1001' > get 'emp','1001','info' > get 'emp','1001','info:name' > get 'emp','1001', {COLUMN => ['info:name']} --同上 > get 'emp','1001','info:name','info:age' > get 'emp','1001', {COLUMN => ['info:name', 'info:age']} > get 'emp','1001', 'info:name', 'info:age', 'info:sex' --有不存在的列 > get 'emp','1001', {COLUMN => ['info:name', 'info:age', 'info:sex']} --scan(范围) > put 'emp','1003','info:name','wangwu' > scan 'emp' > scan 'emp',{COLUMNS=>'info:name'} > scan 'emp',{COLUMNS=>['info:name','info:age']} --多列,结果和列序无关 > scan 'emp',{STARTROW => '1002'} > scan 'emp',{STOPROW => '1003'} > scan 'emp',{COLUMNS=>['info:name','info:age'],STARTROW => '1002',STOPROW => '1003'} --[1002,1003) > scan 'emp',{LIMIT => 3} --rowkey的上限,而非记录条数的上限 --删除数据 > delete 'emp','1001','info:age' --至少3个参数 > deleteall 'emp','1001' --至少2个参数,可以删除整行 > deleteall 'emp','1001','info:age' --也可以用来删除列 > truncate 'emp' --清空表数据 --删除表 > disable 'emp' --禁用 > scan 'emp' > enable 'emp' --启用 > scan 'emp' > drop 'emp' --需要先禁用 统计一张表有多少行数据 > count 'emp' --rowkey数 =================================================== HBase的几个角色: master:是HBase的主节点,用来调度管理客户端应用程序和RegionServer, 管理分配region给regionserver服务器。---负责region的存储regionserver位置,保证负载均衡 regionserver: 是从节点,管理当前自己这台服务器上的region。region是HBase表 的基础单元组件,它存储了分布式表。所以HBase表和HBase集群 利用Master和RegionServer来协同工作。 ZooKeeper: 监控master和regionserver的状态--------管理元数据 HBase有内置zookeeper,但实际环境中我们通常会使用其他ZK集群 通常情况下: 1、Master和Hadoop的NameNode进程运行在同一台主机上,与DataNode通信以读写HDFS的数据 2、RegionServer跟Hadoop的DataNode运行在同一台主机上 HBase特点: ** 存储数据和检索数据 ** 非严格的列式存储数据库,但它利用了磁盘上的列存储格式 ** 分布式、非关系型数据库 ** HBase源自于bigtable ** HBase通常是和Hadoop结合使用-------------上层一来于hadoop,将数据存储在hadoop上面 ** 适合于【非结构化数据】存储的数据库 ** 非结构化的字段数量可以根据用户的需求而定 ** 以key-value的形式来存储数据 ** 高可靠性、高性能、面向列、可伸缩的分布式存储系统 ** 利用HBase技术可以在商用机上搭建出大规模的数据库系统 HBase数据存储目录 ** /hbase/data/default 存储默认命名空间表文件,如果创建表时不指定命令空间,就属于默认命名空间 ** /hbase/data/hbase 存储HBase元数据 默认情况下,有这两个命名空间,命名空间可以理解为数据库 =================================================== 面试题: ***** 理解、记住 ***** Hive和HBase的区别? Hive ** 是一个数据仓库,不是数据库 ** 一般用来做业务分析,不会直接接入业务 ** hive实际上是把hql语句转换成MapReduce运行在yarn平台上 HBase ** 是一个分布式面向列的非关系型数据库 ** 核心功能是用来存储和检索数据、可以直接接入业务系统 ** 不依赖yarn和MapReduce ***** 理解、记住 ***** RDBMS和HBase的区别: ** HBase是分布式架构,支持服务器节点在线添加和移除 ** RDBMS可以使用sql语句,HBase通常使用API来访问 ** RDBMS是基于行存储,HBase是基于列存储,能更好地支持存储和压缩 ** RDBMS适合存储结构化的数据,HBase适合结构化和非结构化的数据存储 ** RDBMS支持比较好的事务,HBase不支持事务 ** RDBMS支持多表Join,HBase不支持Join ** 通常HBase表的应用场景比较简单,不适合业务逻辑很复杂的查询环境 ** HBase索引简单,RDBMS的索引强大而且完善 ** HBase通常应用于单表数据量巨大,用关系型数据库无法满足,不适合分库分表的场景