启动集群:
1)启动所有的zookeeper,start-all-zookeeper.sh
2)主节点最好一个进程一个进程启动
hadoop-daemon.sh start namenode
hadoop-daemon.sh start datanode
3)启动master
4)启动regionserver
停止集群:
1)hbase
hbase-daemons.sh stop regionserver
stop-master.sh
2)hdfs
hdfs和hbase尽量不要使用kill命令
尽量使用yarn和Hadoop的标准命令去停集群。
问题:
1、如果是一百个节点的集群如何规划
2、如果是一千个节点的集群如何规划
尽量控制一套NameNode控制的节点数在1000以内。
zookeeper和journalnode不怎么占内存,并且不怎么容易出问题,同一台服务器上部署。
两台服务器部署NameNode和zkfc
两台节点部署resourceManager
五台节点部署zookeeper和journalnode
其他节点作为DataNode
3、如果是一万个节点呢? 联邦机制:一套NameNode管理一千个节点
-----------------------------------------------------------------------------------------------------------
三、HBase与MapReduce整合
命令:hbase mapredcp 加载MapReduce运行所需依赖包到classpath
export HADOOP_CLASSPATH=`${HBASE_HOME}/bin/hbase mapredcp`将依赖包添加到环境变量里面
加载数据到hbase目录中
第一步:准备数据文件
第二步:准备一张表
第三步:导入数据
hadoop jar ${HBASE_HOME}/lib/hbase-server-VERSION.jar
importtsv -Dimporttsv.columns=rowkey,列族:列名 目标表 数据
---------------------------------------------------------------------------------------------------
HBase真正存数据的文件HFile
以HFile文件形式存储数据
-Dimporttsv.bulk.output=输出目录
-Dimporttsv.columns=rowkey,columnFamily:column tableName /数据文件
清空表truncate '表名'
加载HFile的数据到表中
-completebulkload HFile文件目录 表名
-------------------------------------------------------------------------------------------------------
四、HBase与Hive整合
用SQL语句操作HBase
第一步:加载hive/lib/hive-hbase-handler*.jar到hbase的lib目录
第二步:hbase/lib目录所有jar包都发到hive的lib目录
第三步:安装mysql并加载驱动包mysql-connector-java*.jar 到hive的lib目录并修改hive-site.xml文件 配置关于mysql的连接信息 Driver,url,username,password
第四步:进入hive客户端命令
第五步:在hive表中创建一张外部表关联hbase
CREATE EXTERNAL TABLE hbase_table_1(key int, value string)---这里要与hbase表字段的行健和列名对应
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf1:val")--这里指定hbase表的字段
TBLPROPERTIES ("hbase.table.name" = "xyz", "hbase.mapred.output.outputtable" = "xyz");---这里指定hbase表名
--------------------------------------------------------------------------------------------------------------------
不需要跑MapReduce的SQL:
DDL不需要
DML中
select * from tb_name;
查询分区也不需要
-----------------------------------------------------------------------------------------------------------------
value存放位置:
1、列名后
2、列族后
3、rowkey
查询性能从前到后依次下降
尽可能将value存在rowkey,rowkey支持左匹配
需求:根据电话号码和日期查询流量记录
设计一张表,把所有需要的数据设计成rowkey:电话号码+日期
需求2:查询每天有多少条上网记录
设计一张索引表,rowkey:时间+电话号码,引用:电话号码+时间
hbase适合简单的查询
1、数据量大,每天1000W条数据,亿级别以上
2、场景简单需求固定
调优
一、如何设计表
1)如何设计rowkey(满足业务)
2)设计表的时候进行预分区(预分region)
第一种方式:从0开始
SPLIT=>['10','20','30','40'];
实现负载均衡
balancer balance_switch
第二种方式:用文件中的范围进行分割
SPLIT_FILE=>
第三种方式:NUMREGIONS=>100,SPLITALGO=>
3)设计原则:
rowkey长度原则:本质上越短越好,(如果是64位操作系统 ,设计为8字节的整数倍,最长不要超过16个字节,提高读写性能)。
散列原则:尽可能将数据分散到不同的region(提高命中率)
唯一性:hash值+电话号码+时间戳
一台服务器管理300-500个region是比较合理的。
从内存中刷出来的文件合并
内存:MemStore
小合并
大合并时:清除版本过期的数据
持久化成文件
大合并是非常耗费资源的,可以手动关闭,然后在集群不忙的时候手动启动大合并开关。
status可以查看节点当前运行状态以及平均负载状况,HBase什么样的负载算低负载?什么样的负载算高负载?
DDL命令:alter,create,desc,disable,disable_all,drop,enable.exists,get_table,is_distabled,list,show_filters
dml命令:append,count,get,incr,put,scan,truncate,
tools:major_compace,balance_switch,balancer,flush(数据从内存刷到磁盘),move,split(预分区)
security(权限): grant(远程权限)
COMPRESSION=>'NONE'没有使用压缩
压缩格式
snappy,gzip
text文件格式
WARN util.NativeCodeLoader:native库一般是用c语言和C++写的,不能下载本地Hadoop库到我们的集群平台
Hadoop checknative查看Hadoop支持的压缩格式。
CDH:Cloudera's Distribution Including Apache Hadoop
cloudera公司的Hadoop版本,商业化的Hadoop。
压缩在shuffle过程中。
如果瓶颈在于带宽,那么就使用压缩。
snappy压缩
有两个地方可以考虑是否启用压缩:shuffle map输出到分区,reduce输出
各种压缩格式搭配使用
hadoop启用压缩在core-site.xml中配置,在mapred-site.xml中配置
hbase中启用压缩
1)在hbase的lib目录下创建native目录
2)Linux-amd64-64
3)cp -r $HADOOP_HOME/lib/native/* $HBASE_HOME/lib/native/Linux-amd64-64
create 'test1',{NAME=>'cf2',COMPRESSION=>'snappy'}
压缩文件格式对比
CAP理论:一致性、可用性、分区容错性
hive支持的文件格式:
TextFile:缺陷是什么?
RCfile 这三种文件格式为列式文件格式,特点:行式存储旋转90度
ORC 对于select rowid from user这种查询一列的语句,列式存储读取
Parquet 效率高,压缩效率高。
列式存储与行式存储的对比
关系型数据库是行式存储,面向对象的编程。
启用列式文件格式存储的语法:
在创建表的时候指定存储格式为orc(如果不指定默认为text格式)
stored as 'orc'----------存储为orc格式
如果向这张表中加载数据?
1)首先加载到text格式的表中
2)通过insert的方式加载text表数据到orc表
AVRO
为什么HFile中要设置DataBlock?
想想地铁和火车的车厢,如果整列火车就只有一个车厢,那么就只有一个门,那么所有的乘客都从一个门进出,并且只有两个检票员,管理混乱,列车等待时间也会变长。同理,HFile中Data的设计可以表示一个Block,这样就可以单独管理数据的进出,不会造成混乱。
table属性:
BlockSIZE=>'66536' 一个DataBlock 64K
TTL=>'FOREVER' table的生命周期
BLOCKCACHE='true' 这个参数代表什么?
首先hbase非常依赖于内存,yarn调用资源占用的内存,CPU---8G
假设主机128G,它愿意拿出来多少内存给hbase使用,配置HBASE_HEAPSIZE
export HBASE_HEAPSIZE=100G
MemStore 50G BlockCache 30G RegionServer 20G
hbase读数据:MEMStore:快 BLockCache(内存):快,提升缓存命中率 LRU策略
LRU策略:Least Recently unused,最近最久未使用
jvm内存模型
blockcache的分配
25% 只访问过一次的数据
50% 被访问超过两次以上
25% in_memory 一直在内存里
言归正传:blockcache=>'true' 表示所有的数据都在内存里面,什么样的情况下使用?数据量不太大,并发量高(内存中查询速度快)。
这只是理论,真正实践时还要具体情况具体分析。
hbase主要调的是内存。
读数据的过程:先MemStore,再BlockCache,最后storeFile
这个参数在哪里看?desc 命令的打印内容中。
hbase权限控制
配置三个参数
重启hbase
hbck : Run the hbase 'fsck' tool
删除表:首先disable tb_name ,再drop table
底层:
1)首先移动hfile到tmp目录,再到tmp目录下rmr进行删除
在删除过程中集群挂了 ,机房停电了 ,交互机出问题了
2)hbase:meta 对应的元数据消失
这种情况下,元数据还存在,再次开机之后start-hbase.sh启动不了集群。
执行命令hbck 会自动清除之前的元数据。
最主要掌握的内容:
1)java API 读写数据
2)集群搭建
3)hbase数据的读写流程
4)rowkey的设计原则
HBase是分布式、面向列开源数据库,HBase存储在Hadoop的hdfs上。