HBase第三天

作者: 夙夜M | 来源:发表于2017-08-25 20:22 被阅读0次

    启动集群:

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

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


    压缩文件格式对比

    调优方式

    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的设计原则

    Hadoop:象群 hbase:面向列的数据库 hive:象群头上的蜂群 zookeeper:动物园管理员

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

    相关文章

      网友评论

        本文标题:HBase第三天

        本文链接:https://www.haomeiwen.com/subject/hkzydxtx.html