HBase第三天

启动集群:

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是比较合理的。

《HBase第三天》 日志文件级别设置

从内存中刷出来的文件合并

内存: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(远程权限)

《HBase第三天》 get和put命令的使用

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’}

压缩文件格式对比

《HBase第三天》 调优方式

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第三天》 Hadoop:象群
《HBase第三天》 hbase:面向列的数据库
《HBase第三天》 hive:象群头上的蜂群
《HBase第三天》 zookeeper:动物园管理员

HBase是分布式、面向列开源数据库,HBase存储在Hadoop的hdfs上。

    原文作者:夙夜M
    原文地址: https://www.jianshu.com/p/5d3226b48cf9
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞