文档章节

hbase学习

之渊
 之渊
发布于 07/11 19:38
字数 1703
阅读 48
收藏 0

行业解决方案、产品招募中!想赚钱就来传!>>>

简介

数据存储模型及关系型数据库的区别

一般都是牺牲一致性, 最终达到最终一致性

HBase 概念

区别

 

基础架构

HBASE 原理和操作

写流程

预写入会写入HLog 里面, 通过HLog 来保证数据不丢失

读流程

模块协作

shell 命令

学会用 help , 可以获取使用说明

比如: help 'status'

# HBase shell中的帮助命令非常强大,使用help获得全部命令的列表,使用help ‘command_name’获得某一个命令的详细信息
help 'status'
# 查询服务器状态
status
# 查看所有表
list
# 创建一个表
create 'FileTable','fileInfo','saveInfo'
# 获得表的描述
describe 'FileTable'
# 添加一个列族
alter 'FileTable', 'cf'
# 删除一个列族
alter 'FileTable', {NAME => 'cf', METHOD => 'delete'}
# 插入数据
put 'FileTable', 'rowkey1','fileInfo:name','file1.txt'
put 'FileTable', 'rowkey1','fileInfo:type','txt'
put 'FileTable', 'rowkey1','fileInfo:size','1024'
put 'FileTable', 'rowkey1','saveInfo:path','/home'
put 'FileTable', 'rowkey1','saveInfo:creator','tom'
put 'FileTable', 'rowkey2','fileInfo:name','file2.jpg'
put 'FileTable', 'rowkey2','fileInfo:type','jpg'
put 'FileTable', 'rowkey2','fileInfo:size','2048'
put 'FileTable', 'rowkey2','saveInfo:path','/home/pic'
put 'FileTable', 'rowkey2','saveInfo:creator','jerry'
# 查询表中有多少行
count 'FileTable'
# 获取一个rowkey的所有数据
get 'FileTable', 'rowkey1'
# 获得一个id,一个列簇(一个列)中的所有数据
get 'FileTable', 'rowkey1', 'fileInfo'
# 查询整表数据
scan 'FileTable'
# 扫描整个列簇
scan 'FileTable', {COLUMN=>'fileInfo'}
# 指定扫描其中的某个列
scan 'FileTable', {COLUMNS=> 'fileInfo:name'}
# 除了列(COLUMNS)修饰词外,HBase还支持Limit(限制查询结果行数),STARTROW(ROWKEY起始行。会先根据这个key定位到region,再向后扫描)、STOPROW(结束行)、TIMERANGE(限定时间戳范围)、VERSIONS(版本数)、和FILTER(按条件过滤行)等。比如我们从RowKey1这个rowkey开始,找下一个行的最新版本
scan 'FileTable', { STARTROW => 'rowkey1', LIMIT=>1, VERSIONS=>1}
# Filter是一个非常强大的修饰词,可以设定一系列条件来进行过滤。比如我们要限制名称为file1.txt
scan 'FileTable', FILTER=>"ValueFilter(=,'name:file1.txt’)"
# FILTER中支持多个过滤条件通过括号、AND和OR的条件组合
scan 'FileTable', FILTER=>"ColumnPrefixFilter('typ') AND ValueFilter ValueFilter(=,'substring:10')"
# 通过delete命令,我们可以删除某个字段,接下来的get就无结果
delete 'FileTable','rowkey1','fileInfo:size'
get 'FileTable','rowkey1','fileInfo:size'
# 删除整行的值
deleteall 'FileTable','rowkey1'
get 'FileTable',’rowkey1'
# 通过enable和disable来启用/禁用这个表,相应的可以通过is_enabled和is_disabled来检查表是否被禁用
is_enabled 'FileTable'
is_disabled 'FileTable'
# 使用exists来检查表是否存在
exists 'FileTable'
# 删除表需要先将表disable
disable 'FileTable'
drop 'FileTable'

 

java api 

过滤器

 

很少会用到自定义过滤器

hbase 优化

以下要注意的,可能很耗性能

cmpact 检查

服务端优化策略

以上的参数都是对调优很有参考价值

常用优化策略

rowkey 不能过长,尽量短

根据需求,设计 宽表还是高表

高表查询性能更好,而 宽表 事务更好

读写优化策略

异步提交可能会丢失数据, 去调WAL也会可能丢失数据。虽然可以提高写效率

协处理器

协处理器还是有风险,搞不好就会影响稳定性

协处理器代码加载到HBASE 中

 

容灾与监控

备份与恢复

即将 某个表的数据复制到 另一个表里面

将CoprocessorTest 表数据 到出到 HDFS的  coprocessorTest.db 里面

 

监控

JMX监控

查看hadoop jms   比如  http://192.168.0.205:50070/jmx

然后就可以自己写一个项目, 使用 http 请求 来 定时获取 hadoop 上面的  jmx 信息了,这样就可以获取监控信息了

package com.imooc.bigdata.hbase.monitor;

import java.io.IOException;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import com.imooc.bigdata.hbase.monitor.entity.DataNodeInfo;
import com.imooc.bigdata.hbase.monitor.entity.HdfsSummary;

/**
 * Created by jixin on 18-3-24.
 */
public class HadoopUtil {

  public static long mbLength = 1048576L;
  public static long gbLength = 1073741824L;
  public static final String hadoopJmxServerUrl = "http://localhost:50070";
  public static final String jmxServerUrlFormat = "%s/jmx?qry=%s";
  public static final String nameNodeInfo = "Hadoop:service=NameNode,name=NameNodeInfo";
  public static final String fsNameSystemState = "Hadoop:service=NameNode,"
      + "name=FSNamesystemState";

  public static HdfsSummary getHdfsSummary(StatefulHttpClient client) throws IOException {
    HdfsSummary hdfsSummary = new HdfsSummary();
    String namenodeUrl = String.format(jmxServerUrlFormat, hadoopJmxServerUrl, nameNodeInfo);
    MonitorMetrics monitorMetrics = client.get(MonitorMetrics.class, namenodeUrl, null, null);
    hdfsSummary.setTotal(doubleFormat(monitorMetrics.getMetricsValue("Total"), gbLength));
    hdfsSummary.setDfsFree(doubleFormat(monitorMetrics.getMetricsValue("Free"), gbLength));
    hdfsSummary
        .setDfsUsed(doubleFormat(monitorMetrics.getMetricsValue("Used"), gbLength));
    hdfsSummary.setPercentUsed(
        doubleFormat(monitorMetrics.getMetricsValue("PercentUsed")));
    hdfsSummary.setSafeMode(monitorMetrics.getMetricsValue("Safemode").toString());
    hdfsSummary.setNonDfsUsed(
        doubleFormat(monitorMetrics.getMetricsValue("NonDfsUsedSpace"), gbLength));
    hdfsSummary.setBlockPoolUsedSpace(
        doubleFormat(monitorMetrics.getMetricsValue("BlockPoolUsedSpace"),
            gbLength));
    hdfsSummary
        .setPercentBlockPoolUsed(
            doubleFormat(monitorMetrics.getMetricsValue("PercentBlockPoolUsed")));
    hdfsSummary.setPercentRemaining(
        doubleFormat(monitorMetrics.getMetricsValue("PercentRemaining")));
    hdfsSummary.setTotalBlocks((int) monitorMetrics.getMetricsValue("TotalBlocks"));
    hdfsSummary.setTotalFiles((int) monitorMetrics.getMetricsValue("TotalFiles"));
    hdfsSummary.setMissingBlocks((int) monitorMetrics.getMetricsValue("NumberOfMissingBlocks"));
    String liveNodesJson = monitorMetrics.getMetricsValue("LiveNodes").toString();
    String deadNodesJson = monitorMetrics.getMetricsValue("DeadNodes").toString();
    List<DataNodeInfo> liveNodes = dataNodeInfoReader(liveNodesJson);
    List<DataNodeInfo> deadNodes = dataNodeInfoReader(deadNodesJson);
    hdfsSummary.setLiveDataNodeInfos(liveNodes);
    hdfsSummary.setDeadDataNodeInfos(deadNodes);

    String fsNameSystemStateUrl = String
        .format(jmxServerUrlFormat, hadoopJmxServerUrl,
            fsNameSystemState);
    MonitorMetrics hadoopMetrics = client
        .get(MonitorMetrics.class, fsNameSystemStateUrl, null, null);
    hdfsSummary.setNumLiveDataNodes((int) hadoopMetrics.getMetricsValue("NumLiveDataNodes"));
    hdfsSummary.setNumDeadDataNodes((int) hadoopMetrics.getMetricsValue("NumDeadDataNodes"));
    hdfsSummary
        .setVolumeFailuresTotal((int) hadoopMetrics.getMetricsValue("VolumeFailuresTotal"));
    return hdfsSummary;
  }

  public static List<DataNodeInfo> dataNodeInfoReader(String jsonData) throws IOException {
    List<DataNodeInfo> dataNodeInfos = new ArrayList<DataNodeInfo>();
    Map<String, Object> nodes = JsonUtil.fromJsonMap(String.class, Object.class, jsonData);
    for (Entry<String, Object> node : nodes.entrySet()) {
      Map<String, Object> info = (HashMap<String, Object>) node.getValue();
      String nodeName = node.getKey().split(":")[0];
      DataNodeInfo dataNodeInfo = new DataNodeInfo();
      dataNodeInfo.setNodeName(nodeName);
      dataNodeInfo.setNodeAddr(info.get("infoAddr").toString().split(":")[0]);
      dataNodeInfo.setLastContact((int) info.get("lastContact"));
      dataNodeInfo.setUsedSpace(doubleFormat(info.get("usedSpace"), gbLength));
      dataNodeInfo.setAdminState(info.get("adminState").toString());
      dataNodeInfo
          .setNonDfsUsedSpace(doubleFormat(info.get("nonDfsUsedSpace"), gbLength));
      dataNodeInfo.setCapacity(doubleFormat(info.get("capacity"), gbLength));
      dataNodeInfo.setNumBlocks((int) info.get("numBlocks"));
      dataNodeInfo.setRemaining(doubleFormat(info.get("remaining"), gbLength));
      dataNodeInfo
          .setBlockPoolUsed(doubleFormat(info.get("blockPoolUsed"), gbLength));
      dataNodeInfo.setBlockPoolUsedPerent(doubleFormat(info.get("blockPoolUsedPercent")));
      dataNodeInfos.add(dataNodeInfo);
    }
    return dataNodeInfos;
  }

  public static DecimalFormat df = new DecimalFormat("#.##");

  public static double doubleFormat(Object num, long unit) {
    double result = Double.parseDouble(String.valueOf(num)) / unit;
    return Double.parseDouble(df.format(result));
  }

  public static double doubleFormat(Object num) {
    double result = Double.parseDouble(String.valueOf(num));
    return Double.parseDouble(df.format(result));
  }
}








public class DataNodeInfo {
  //datanode的hostname
  private String nodeName;
  //datanode的ip地址
  private String nodeAddr;
  //datanode的上次链接数量
  private int lastContact;
  //datanode上hdfs的已用空间 GB
  private double usedSpace;
  //datanode的状态
  private String adminState;
  //datanode上非hdfs的空间大小 GB
  private double nonDfsUsedSpace;
  //datanode上的总空间大小
  private double capacity;
  //datanode的block
  private int numBlocks;
  private double remaining;
  private double blockPoolUsed;
  private double blockPoolUsedPerent;








public class HdfsSummary {

  //"name": "Hadoop:service=NameNode,name=NameNodeInfo"
  //总空间大小 GB
  private double total;
  //hdfs已使用的空间大小 GB
  private double dfsUsed;
  //hdfs已使用空间百分比
  private double percentUsed;
  //hdfs空闲空间 GB
  private double dfsFree;
  //hdfs是否处于safemode
  private String safeMode;
  //非hdfs空间大小 GB
  private double nonDfsUsed;
  //集群该namespace的hdfs使用容量大小
  private double blockPoolUsedSpace;
  //集群该namespace的hdfs使用容量所占百分比
  private double percentBlockPoolUsed;
  private double percentRemaining;
  //集群总的block数
  private int totalBlocks;
  //集群总的文件数
  private int totalFiles;
  //集群丢失的block数量
  private int missingBlocks;
  //处于可用状态的datanode汇总
  private List<DataNodeInfo> liveDataNodeInfos;
  //处于不可用状态的datanode汇总
  private List<DataNodeInfo> deadDataNodeInfos;
  //"name": "Hadoop:service=NameNode,name=FSNamesystemState"
  //处于可用状态的datanode数量
  private int numLiveDataNodes;
  //处于不可用状态的datanode数量
  private int numDeadDataNodes;
  //坏盘的数量
  private int volumeFailuresTotal;







Phoenix

 

安装 使用

http://phoenix.apache.org/

启动 在 phoenix 下 bin  ,  ./sqlline.py

 这样可以 在 shell 下使用或者 通过API去使用

比如 phonenix + mybatis 一起来使用

 

hbase 适合的业务需求: Object stroe on Habse

也可以 将hbase 作为 对象存储, l 类似 比如 阿里的 OSS   , Amazon S3

开源的对象存储服务 : MINIO 

hbse 的不足

 

上一篇: OpenTSDB学习
下一篇: sqoop1入门
之渊
粉丝 14
博文 744
码字总数 257441
作品 0
佛山
程序员
私信 提问
加载中
请先登录后再评论。
Nutch学习笔记4-Nutch 1.7 的 索引篇 ElasticSearch

上一篇讲解了爬取和分析的流程,很重要的收获就是: 解析过程中,会根据页面的ContentType获得一系列的注册解析器, 依次调用每个解析器,当其中一个解析成功后就返回,否则继续执行下一个解...

强子哥哥
2014/06/26
712
0
Hbase的Windows访问接口库--libhbase4win

libhbase4win是基于Thrift的Hbase的Windows访问接口库,开发工具使用VS2010,Hadoop版本为1.1.0,Hbase版本为0.94.0,thrift版本0.9.0,执行编译需要boost和thrift支持。...

张子良
2013/03/06
757
0
Hadoop 管理监控工具--Apache Ambari

Apache Ambari 是一个基于 Web 的 Apache Hadoop 集群的供应、管理和监控。Ambari目前已支持大多数Hadoop组件,包括HDFS、MapReduce、Hive、Pig、 Hbase、Zookeper、Sqoop和Hcatalog等。 Ap...

匿名
2012/12/25
2.9W
3
TBB学习:并行循环

http://www.cppprog.com/2009/0325/92.html

Waiting4you
2009/05/12
672
0
SmartGWT学习整理 2、理解核心中的核心DataSource

SmartGWT学习整理 2、理解核心中的核心DataSource DataSource之所以重要,是因为它负责所有的与服务器的数据交互,几乎所有的控件都离不开它。 可以这样说,理解了DataSource就掌握了SmartGW...

st97
2010/11/16
2K
2

没有更多内容

加载失败,请刷新页面

加载更多

Java中使用OpenSSL生成的RSA公私钥进行数据加解密

当前使用的是Linux系统,已经按装使用OpenSSL软件包, 一、使用OpenSSL来生成私钥和公钥 1、执行命令openssl version -a 验证机器上已经安装openssl openssl version -a 运行结果: 2、生成...

osc_1psr53ow
16分钟前
7
0
计算机毕业设计之springboot+vue.js点餐小程序 点餐系统

功能 后台: 1. 超级管理员(具有该系统所有权限)登录 查看系统所有管理员 操作:可新添加管理员并分配系统已有角色; 可对已有管理员进行信息编辑; 可对除超管外的其他管理员账号禁用/启用...

osc_x4ot1joy
17分钟前
0
0
MATLAB数学建模

链接:https://pan.baidu.com/s/1WA2ltwyMZuKeo7OC9XAIvw 提取码:tmy2 记录matlab参加建模比赛时所用的书籍,避免忘记 链接:https://pan.baidu.com/s/1WA2ltwyMZuKeo7OC9XAIvw 提取码:tmy...

osc_oa6qrgun
18分钟前
6
0
Python中可以使用静态类变量吗? - Are static class variables possible in Python?

问题: Is it possible to have static class variables or methods in Python? Python中是否可以有静态类变量或方法? What syntax is required to do this? 为此需要什么语法? 解决方案:...

技术盛宴
49分钟前
17
0
如何在Android中以像素为单位获取屏幕尺寸 - How to get screen dimensions as pixels in Android

问题: I created some custom elements, and I want to programmatically place them to the upper right corner ( n pixels from the top edge and m pixels from the right edge). 我创建......

javail
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部