当前位置: 首页 > 编程日记 > 正文

Linux环境HBase安装配置及使用

Linux环境HBase安装配置及使用

1. 认识HBase

(1) HBase介绍

  • HBase = Hadoop database,Hadoop数据库
  • 开源数据库
  • 官网:hbase.apache.org/
  • HBase源于Google的BigTable
  • Apache HBase™是Hadoop数据库,是一个分布式,可扩展的大数据存储。
  • 当需要对大数据进行随机、实时读/写访问时,请使用Apache HBase™。该项目的目标是托管非常大的表 - 数十亿行X百万列 - 在商品硬件集群上。Apache HBase是一个开源的,分布式的,版本化的非关系数据库nosql,模仿Google的Bigtable: Chang等人的结构化数据分布式存储系统。正如Bigtable利用Google文件系统提供的分布式数据存储一样,Apache HBase在Hadoop和HDFS之上提供类似Bigtable的功能。
  • HBase可执行基于Yarn平台的计算任务,但不擅长。

(2) HBase集群角色

  • HDFS:
    • NameNode——主节点
    • DataNode——数据存储节点
  • Yarn:
    • ResourceManager——全局的资源管理器
    • NodeManager——分节点资源和任务管理器
  • HBase:
    • HMaster
      • 负责Table表和RegionServer的监控管理工作
      • 处理元数据的变更
      • 对HRegionServer进行故障转移
      • 空闲时对数据进行负载均衡处理
      • 管理Region
      • 借助ZooKeeper发布位置到客户端
    • HRegionServer
      • 负责Table数据的实际读写
      • 刷新缓存数据到HDFS
      • 处理Region
      • 可以进行数据压缩
      • 维护Hlog
      • Region分片

(3) Hbase架构

  • HRegionServer结构:
    • HLog:存储HBase的修改记录
    • HRegion:根据rowkey(行键,类似id)分割的表的分片
    • Store:对应HBase表中的一个列族,可存储多个字段
    • HFile:真正的存储文件
    • MemStore:保存当前的操作
    • ZooKeeper:存放数据的元数据信息,负责维护RegionServer中保存的元数据信息
    • DFS Client:存储数据信息到HDFS集群中

2. HBase-1.3.0安装配置流程

(1) HBase准备

  • Hadoop集群环境
  • ZooKeeper集群环境

(2) 解压HBase-1.3.0相关安装包到目标目录下:

  • tar -zxvf .tar.gz -C 目标目录

(3) 修改配置文件:

  • 进入hbase/conf路径:
    • vi hbase-env.sh
    •  # The java implementation to use.  Java 1.7+ required.export JAVA_HOME=jdk安装路径# 注释掉以下语句(jdk1.8中不需要这个配置)# export HBASE_MASTER_OPTS="$HBASE_MASTER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m"# export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m"# Tell HBase whether it should manage it's own instance of Zookeeper or not.# 关闭HBase自带的ZooKeeperexport HBASE_MANAGES_ZK=false
      复制代码

  • vi hbase-site.xml
  •  <!-- 设置namenode所在位置(HDFS中存放的路径) --><property><name>hbase.rootdir</name><value>hdfs://bigdata01:9000/hbase</value>    </property><!-- 是否开启集群 --><property><name>hbase.cluster.distributed</name><value>true</value></property><!-- HBase-0.9.8之前默认端口为60000 --><property><name>hbase.master.port</name><value>16000</value></property><!-- zookeeper集群的位置 --><property><name>hbase.zookeeper.quorum</name><!-- 注意不要有空格 -->   <value>bigdata01:2181,bigdata02:2181,bigdata03:2181</value></property><!-- hbase的元数据信息存储在zookeeper的位置 --><property><name>hbase.zookeeper.property.dataDir</name><value>/XXX/zookeeper-3.4.10/zkData</value></property>
    复制代码

  • vi regionservers
  • 加入从节点主机名

(4) 解决依赖问题

  • 进入hbase/lib路径:
    • rm -rf hadoop-*
    • rm -rf zookeeper-*
    • 把相关版本的zookeeper和hadoop的依赖包导入到hbase/lib

(5) 软连接hadoop配置

  • ln -s /XXX/hadoop/core-site.xml
  • ln -s /XXX/hadoop/hdfs-site.xml

(6) 拷贝配置好的HBase到其他机器上

  • scp -r hbase-1.3.0/ bigdata02:$PWD
  • scp -r hbase-1.3.0/ bigdata03:$PWD

(7) 配置环境变量:

  • 修改配置文件:
    • vi /etc/profile
  • 增加以下内容:
    • export HBASE_HOME=/opt/module/hbase-1.3.0
    • export PATH=$PATH:$HBASE_HOME/bin
  • 声明环境变量:
    • source /etc/profile

(8) 启动集群

  • 启动主节点
    • hbase-daemon.sh start master
  • 启动从节点
    • hbase-daemon.sh start regionserver

(9) 关闭集群

  • 关闭主节点
    • hbase-daemon.sh stop master
  • 关闭从节点
    • hbase-daemon.sh stop regionserver

(10) UI界面

  • http://bigdata01:16010/master-status

3. HBase Shell操作

(1) 启动终端

  • hbase shell
  • 回退:ctrl + <-

(2) 操作命令:

  • 注意:
    • 若报错:ERROR: Can't get master address from ZooKeeper; znode data == null
    • 解决方案:虚拟机挂起,会使zookeeper不稳定,进而造成hbase不稳定,若遇到报错,重启HBase集群即可。
  • 查询表:
    • list
  • 显示HBase服务器状态:
    • status '主机名'
    • 1 active master:存活的主节点
    • 0 backup masters:备份的主节点
    • 3 servers:从节点
    • 0 dead:宕机
    • 0.6667 average load:平均加载时间
  • 显示当前用户:
    • whoami
  • 创建表:
    • create '表名', '列族1', '列族2'
  • 查看表:
    • 全表扫描:
      • scan '表名'
    • 指定Rowkey扫描:
      • scan '表名', {STARTROW => 'Rowkey值', STOPROW => 'Rowkey值'}
      • STOPROW为可选指令,值为实际查看Rowkey+1
    • 查看表结构:
      • describe '表名'
      • 修改表结构信息:
        • alter '表名', {NAME => '列族名', 变更字段名 => ' '}
    • 查询指定数据信息:
      • 指定具体的rowkey:
        • get '表名', 'rowkey'
      • 指定具体的列:
        • get '表名', 'rowkey', '列族:列名'
      • 统计表行数:
        • count '表名'
        • 根据Rowkey进行统计
  • 表中添加数据信息:
    • put '表名', 'rowkey', '列族:列名', '值'
    • HBase只有覆盖没有修改
    • 覆盖时对应表名、rowkey、列族、列名字段,输入新的值信息
  • 清空表:
    • truncate '表名'
  • 删除表:
    • 指定表不可用:
      • disable '表名'
    • 删除:
      • drop '表名'

(3) 退出终端

  • exit或者quit

4. HBase读写数据

(1) HBase读数据流程

  • 概述:

    • 客户端Client访问ZooKeeper,返回-ROOT-表元数据位置,根据元数据位置去查找对应的RegionServer,同时根据-ROOT-查找到.META表,再根据.META表的元数据查找到Region,返回Region的业务元数据给客户端。

  • 具体流程:

    • 客户端Client从Region中的Store中读取数据,若在写数据缓存memstore(存放用户最近写入的数据)中读到对应数据,则直接返回数据信息到客户端,若memstore中不存在对应数据,则去读数据缓存blockcache中查找,若blockcache中仍未找到,则去对应的HFile查找数据信息并存入blockcache,进而通过blockcache返回数据信息到客户端。HBase读写分离

(2) HBase写数据流程

  • 客户端Client发送写数据请求,通过ZooKeeper获取到表的元数据信息,客户端通过RPC通信查找到对应的RegionServer,进而找到Region,同时在HLog中记录写操作,通过HLog把数据信息写入到memstore(16KB),memstore存满后溢写到storeFile中,最后HDFS客户端统一存储到HFile。

5. HBase API操作

(1) 准备工作

  • 新建Maven工程,pom.xml中添加依赖:
    • <dependencies><dependency><groupId>org.apache.hbase</groupId><artifactId>hbase-server</artifactId><version>1.3.0</version></dependency><dependency><groupId>org.apache.hbase</groupId><artifactId>hbase-client</artifactId><version>1.3.0</version></dependency>
      </dependencies>
      复制代码
  • 从HBase下的conf/目录中导出core-site.xml,hbase-site.xml,hdfs-site.xml,导入Maven工程的resources目录下。
    • 注意:不进行该操作会导致与HBase连接失败

(2) 具体操作

  • package ybcarry.hbase;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.hbase.*;import org.apache.hadoop.hbase.client.*;import org.apache.hadoop.hbase.util.Bytes;import java.io.IOException;import java.util.ArrayList;import java.util.List;/*** @ClassName: HbaseTest* @Description* @Author: YBCarry* @Date2019-03-30 21:10* @Version: V1.0**/public class HbaseTest {public static Configuration conf ;//配置信息static {conf = HBaseConfiguration.create() ;}/**1. 判断HBase中表是否存在*/public static boolean isExist(String tableNane) throws IOException {//旧版本操作表//HBaseAdmin admin = new HBaseAdmin(conf);//加载配置Connection connection = ConnectionFactory.createConnection(conf) ;//管理器HBaseAdmin admin = (HBaseAdmin)connection.getAdmin() ;return admin.tableExists(TableName.valueOf(tableNane)) ;}/**2. 在HBase中创建表*/public static void createTable(String tableName, String... columnFamilly) throws IOException {//加载配置Connection connection = ConnectionFactory.createConnection(conf) ;//a. 如果对表的操作需要使用管理器HBaseAdmin admin = (HBaseAdmin)connection.getAdmin() ;//b. 创建描述器HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(tableName)) ;//c. 指定多个列族for (String cf : columnFamilly) {htd.addFamily(new HColumnDescriptor(cf)) ;}//d. 创建表admin.createTable(htd) ;System.out.println("createTable----successful") ;}/**3. 向表中添加数据*/public static void addData(String tableName, String rowkey, String cf, String column, String value) throws IOException {//加载配置Connection connection = ConnectionFactory.createConnection(conf) ;//a. 指定表Table table = connection.getTable(TableName.valueOf(tableName)) ;//b. 添加数据 put方式Put put = new Put(Bytes.toBytes(rowkey)) ;//c. 指定添加的列族 列 值put.addColumn(Bytes.toBytes(cf), Bytes.toBytes(column), Bytes.toBytes(value)) ;//d. 写入表中table.put(put) ;System.out.println("addData----successful") ;}/**4. 删除一个rowkey*/public static void deleteRow(String tableName, String rowkey) throws IOException {//加载配置Connection connection = ConnectionFactory.createConnection(conf) ;//a. 指定表Table table = connection.getTable(TableName.valueOf(tableName)) ;//b. 删除rowkey delete方式Delete delete = new Delete(Bytes.toBytes(rowkey)) ;//d. 执行操作table.delete(delete) ;System.out.println("deleteRow----successful") ;}/**5. 删除多个rowkey*/public static void deleteRows(String tableName, String... rowkey) throws IOException {//加载配置Connection connection = ConnectionFactory.createConnection(conf) ;//a. 指定表Table table = connection.getTable(TableName.valueOf(tableName)) ;//b. 封装delete操作List<Delete> ds = new ArrayList<Delete>() ;//c. 遍历rowkeyfor (String rk : rowkey) {Delete deletes = new Delete(Bytes.toBytes(rk)) ;ds.add(deletes) ;}//d. 执行操作table.delete(ds) ;System.out.println("deleteRows----successful") ;}/**6. 全表扫描*/public static void scanAll(String tableName) throws IOException {//加载配置Connection connection = ConnectionFactory.createConnection(conf) ;//a. 指定表Table table = connection.getTable(TableName.valueOf(tableName)) ;//b. 扫描操作Scan scan = new Scan() ;//c. 获取返回值ResultScanner rs = table.getScanner(scan) ;//d. 打印扫描信息for (Result r : rs) {//单元格Cell[] cells = r.rawCells() ;for (Cell cs : cells) {System.out.println("RowKey:" + Bytes.toString(CellUtil.cloneRow(cs))) ;System.out.println("ColumnFamilly:" + Bytes.toString(CellUtil.cloneFamily(cs))) ;System.out.println("Column:" + Bytes.toString((CellUtil.cloneQualifier(cs)))) ;System.out.println("Value:" + Bytes.toString((CellUtil.cloneValue(cs)))) ;}}//成功标志System.out.println("scanAll----successful") ;}/**7. 删除表*/public static void deleteTable(String tableName) throws IOException {//加载配置Connection connection = ConnectionFactory.createConnection(conf) ;//a. 如果对表的操作需要使用管理器HBaseAdmin admin = (HBaseAdmin)connection.getAdmin() ;//b. 弃用表admin.disableTable(tableName) ;//c. 删除表admin.deleteTable(TableName.valueOf(tableName)) ;//成功标志System.out.println("deleteTable----successful") ;}/**主函数*/public static void main(String[] args) throws IOException {/**1. 判断HBase中表是否存在*///        System.out.println(isExist("user")) ;/**2. 在HBase中创建表*///        createTable("create1", "info1", "info2", "info3") ;/**3. 向表中添加数据:列族 列 值*///        addData("create1", "xiaoming", "info1", "age", "18") ;//        addData("create1", "xiaoming", "info1", "sex", "man") ;//        addData("create1", "xiaoming", "info2", "professional", "student") ;//        addData("create1", "xiaohong", "info2", "professional", "teacher") ;/**4. 删除一个rowkey*///        deleteRow("create", "xiaoming") ;/**5. 删除多个rowkey*///        deleteRows("create", "xiaoming", "xiaohong") ;/**6. 全表扫描*///        scanAll("create1") ;/**7. 删除表*/deleteTable("create2") ;}}
    复制代码

6. HBase MR操作

(1) 说明

  • HBase主要擅长的领域是存储数据,不擅长分析数据
  • HBase如果想计算的话需要结合Hadoop的mapreduce
  • hbase-mr所需的jar包查看:
    • bin/hbase mapredcp

(2) 准备工作

  • 方式1:配置临时环境变量
    • export HBASE_HOME=/XXXX/hbase-1.3.0
    • export HADOOP_HOME=/XXXX/hadoop2.8.4
    • export HADOOP_CLASSPATH_2=`$HADOOP_CLASSPATH_2:$HBASE_HOME/bin/hbase mapredcp` 
      复制代码
  • 方式2:配置系统环境变量
    • 修改配置文件:
      • vi /etc/profile
    • 增加以下内容:
      • export HBASE_HOME=/opt/module/hbase-1.3.0
      • export HADOOP_CLASSPATH=`${HBASE_HOME}/bin/hbase mapredcp`
        复制代码
  • 声明环境变量:
    • source /etc/profile

(3) 运行HBase-MR程序

  • bin/yarn jar /XXXX/hbase-1.3.0/lib/hbase-server-1.3.0.jar row counter 表名

(4)实例1:HBase过滤列族和列

  • ReadMapper.java:

  • package ybcarry.mr;import org.apache.hadoop.hbase.Cell;import org.apache.hadoop.hbase.CellUtil;import org.apache.hadoop.hbase.client.Put;import org.apache.hadoop.hbase.client.Result;import org.apache.hadoop.hbase.io.ImmutableBytesWritable;import org.apache.hadoop.hbase.mapreduce.TableMapper;import org.apache.hadoop.hbase.util.Bytes;import java.io.IOException;/*** @ClassName: ReadMapper* @Description* @Author: YBCarry* @Date2019-04-26 01:36* @Version: V1.0** mapper类进行对数据* K:ImmutableBytesWritable HBase中的rowkey* V:Put 封装的数据**/public class ReadMapper extends TableMapper<ImmutableBytesWritable, Put> {@Overrideprotected void map(ImmutableBytesWritable key, Result value, Context context) throws IOException, InterruptedException {//1. 读取数据  根据rowkey拿到数据Put put = new Put(key.get()) ;//2. 过滤列for (Cell c : value.rawCells()) {//得到info列族数据——是info列族-取出;不是info列族-过滤if ("info".equals(Bytes.toString(CellUtil.cloneFamily(c)))) {//过滤列if ("name".equals(Bytes.toString(CellUtil.cloneQualifier(c)))) {put.add(c) ;}}}//3. 输出到reducer端:key -> rowkey  put -> 具体数据context.write(key, put) ;}}
    复制代码



  • WriteReducer.java:

  • package ybcarry.mr;import org.apache.hadoop.hbase.client.Put;import org.apache.hadoop.hbase.io.ImmutableBytesWritable;import org.apache.hadoop.hbase.mapreduce.TableReducer;import org.apache.hadoop.io.NullWritable;import java.io.IOException;/*** @ClassName: WriteReducer* @Description* @Author: YBCarry* @Date2019-04-26 02:55* @Version: V1.0**/public class WriteReducer extends TableReducer<ImmutableBytesWritable, Put, NullWritable> {@Overrideprotected void reduce(ImmutableBytesWritable key, Iterable<Put> values, Context context) throws IOException, InterruptedException {for (Put p : values) {context.write(NullWritable.get(), p) ;}}}
    复制代码



  • Driver.java:

  • package ybcarry.mr;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.hbase.HBaseConfiguration;import org.apache.hadoop.hbase.client.Put;import org.apache.hadoop.hbase.client.Scan;import org.apache.hadoop.hbase.io.ImmutableBytesWritable;import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;import org.apache.hadoop.mapreduce.Job;import org.apache.hadoop.util.Tool;import org.apache.hadoop.util.ToolRunner;/*** @ClassName: Driver* @Description* @Author: YBCarry* @Date2019-04-26 03:03* @Version: V1.0**/public class Driver implements Tool {private Configuration conf ;public void setConf(Configuration configuration) {this.conf = HBaseConfiguration.create(configuration) ;}public Configuration getConf() {return this.conf ;}public int run(String[] strings) throws Exception {//1. 创建任务Job job = Job.getInstance(conf) ;//2. 指定运行的主类job.setJarByClass(Driver.class) ;//3. 配置jobScan scan = new Scan() ;//4. 设置具体运行mapper类(table1为HBase中要处理的表的表名)TableMapReduceUtil.initTableMapperJob("table1",scan,ReadMapper.class,ImmutableBytesWritable.class,Put.class,job) ;//5. 设置具体运行reducer类(table2为HBase中处理后生成表的表名,需要在HBase中提前创建好)TableMapReduceUtil.initTableReducerJob("table2",WriteReducer.class,job);//6. 设置reduceTaskjob.setNumReduceTasks(1) ;boolean rs = job.waitForCompletion(true) ;return rs ? 0 : 1 ;}public static void main(String[] args) throws Exception {//状态码int sts = ToolRunner.run(new Driver(), args) ;//退出System.exit(sts) ;}}
    复制代码

  • 生成jar包,导入HBase环境中即可

(5)实例2:HBase过滤列族和列

  • ReadHDFSMapper.java:

  •   package ybcarry.mr2;import org.apache.hadoop.hbase.client.Put;import org.apache.hadoop.hbase.io.ImmutableBytesWritable;import org.apache.hadoop.hbase.util.Bytes;import org.apache.hadoop.io.LongWritable;import org.apache.hadoop.io.Text;import org.apache.hadoop.mapreduce.Mapper;import java.io.IOException;/*** @ClassName: ReadHDFSMapper* @Description* @Author: YBCarry* @Date2019-04-27 00:31* @Version: V1.0** 读取HDFS中的数据:* 输入通过Hadoop MR* 输出通过HBase MR**/public class ReadHDFSMapper extends Mapper<LongWritable, Text, ImmutableBytesWritable, Put> {@Overrideprotected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {//1. 读取数据String line = value.toString() ;//2. 切分数据String[] fields = line.split("\t") ;//3. 封装数据//数据示例:001	YBCarry	21byte[] rowkey = Bytes.toBytes(fields[0]) ;byte[] name = Bytes.toBytes(fields[1]) ;byte[] age = Bytes.toBytes(fields[2]) ;//4. 封装成putPut put = new Put(rowkey) ;put.addColumn(Bytes.toBytes("info"), Bytes.toBytes("name"), name) ;put.addColumn(Bytes.toBytes("info"), Bytes.toBytes("age"), age) ;//5. 输出到reducer端context.write(new ImmutableBytesWritable(rowkey), put) ;}}
    复制代码



  • WriteHBaseReducer.java:

  •   package ybcarry.mr2;import org.apache.hadoop.hbase.client.Put;import org.apache.hadoop.hbase.io.ImmutableBytesWritable;import org.apache.hadoop.hbase.mapreduce.TableReducer;import org.apache.hadoop.io.NullWritable;import java.io.IOException;/*** @ClassName: WriteHBaseReducer* @Description* @Author: YBCarry* @Date2019-04-27 02:29* @Version: V1.0** hbase**/public class WriteHBaseReducer extends TableReducer<ImmutableBytesWritable, Put, NullWritable> {@Overrideprotected void reduce(ImmutableBytesWritable key, Iterable<Put> values, Context context) throws IOException, InterruptedException {for (Put p : values) {//rowkey不需要,所以NullWritablecontext.write(NullWritable.get(), p) ;}}}
    复制代码



  • Driver.java:

  •   package ybcarry.mr2;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.Path;import org.apache.hadoop.hbase.HBaseConfiguration;import org.apache.hadoop.hbase.client.Put;import org.apache.hadoop.hbase.io.ImmutableBytesWritable;import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;import org.apache.hadoop.mapreduce.Job;import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;import org.apache.hadoop.util.Tool;import org.apache.hadoop.util.ToolRunner;/*** @ClassName: Driver* @Description* @Author: YBCarry* @Date2019-04-27 03:00* @Version: V1.0**/public class Driver implements Tool {//配置初始化private Configuration conf ;public void setConf(Configuration configuration) {this.conf = HBaseConfiguration.create(configuration) ;}public Configuration getConf() {return this.conf ;}public int run(String[] strings) throws Exception {//1. 创建任务Job job = Job.getInstance(conf) ;//2. 指定运行的主类job.setJarByClass(Driver.class) ;//3. 配置Mapperjob.setMapperClass(ReadHDFSMapper.class) ;job.setMapOutputKeyClass(ImmutableBytesWritable.class) ;job.setMapOutputValueClass(Put.class) ;//4. 配置Reducer (表名table2为输出表的表名)TableMapReduceUtil.initTableReducerJob("table2", WriteHBaseReducer.class, job) ;//5. 输入配置 inputFormat (able1为初始表的路径)FileInputFormat.addInputPath(job, new Path("/table1")) ;//6. 设置reduceTaskjob.setNumReduceTasks(1) ;boolean rs = job.waitForCompletion(true) ;return rs ? 0 : 1 ;}public static void main(String[] args) throws Exception {//状态码int sts = ToolRunner.run(new Driver(), args) ;//退出System.exit(sts) ;}}
    复制代码

  • 生成jar包,导入HBase环境中即可

7. HBase 优化

(1) 预分区

  • 表很大、数据量大 —— region分片+分布式
  • region:
    • 每一个region维护着startRow与endRowKey,如果加入的数据符合某个region维护的rowKey范围,则该数据交给这个region维护。那么依照这个原则,我们可以将数据所要投放的分区提前大致的规划好,以提高HBase性能。rowkey{startrowkey,endrowkey}
  • 预分区设置:
    • 方法1:create 'table1','info','partition',SPLITS => ['101','102','103','104']
    • 显示效果:
    • 方法2:create 'table2','partition',SPLITS_FILE => '/XXXX/partitions.txt'(文件放在hbase-shell路径下或者使用绝对路径)
    • partitions.txt内容:
      • aa
        bb
        cc
        dd
        ee
        复制代码
    • 显示效果:

(2) rowkey设计

  • 一条数据的唯一标识就是rowkey,那么这条数据存储于哪个分区,取决于rowkey处于哪个一个预分区的区间内,设计rowkey的主要目的 ,就是让数据均匀的分布于所有的region中,在一定程度上防止数据倾斜。
  • 解决方案:
    • 目标:打散数据,平均分配到每个region中
    • 方案1——生成随机数、hash、散列值
      • 一般会选择从数据集中抽取样本,来决定什么样的rowKey来Hash后作为每个分区的临界值。
    • 方案2——字符串拼接:
      • 20190427_a3d4
      • 20190427_jl4f
    • 方案3——反转字符串:
      • 201904271 -> 172409102
      • 201904272 -> 272409102

(3) HBase内存优化

  • HBase操作过程中需要大量的内存开销,毕竟Table是可以缓存在内存中的,一般会分配整个可用内存的70%给HBase的Java堆。但是不建议分配非常大的堆内存,因为GC过程持续太久会导致RegionServer处于长期不可用状态,一般最多分配75%内存就可以了,如果因为框架占用内存过高导致系统内存不足,框架一样会被系统服务拖死。
  • vi hadoop-env.sh 设置内存的堆大小
    • export HADOOP_PORTMAP_OPTS='-XmxAAAAm $HADOOP_PORTMAP_OPTS'(AAAA为内存值)

(4) HBase基础优化

  • HBase基于HDFS存储:
    • 调大datanode允许最大文件打开数(默认4096):
      • HBase一般都会同一时间操作大量的文件,根据集群的数量和规模以及数据动作
      • vi hdfs-site.xml
      • <property><name>dfs.datanode.max.transfer.threads</name><value>XXXX</value>
        </property>
        复制代码
    • 调大等待时间(默认60000毫秒):
      • 如果对于某一次数据操作来讲,延迟非常高,socket需要等待更长的时间,建议把该值设置为更大的值,以确保socket不会被timeout掉
      • vi hdfs-site.xml
      • <property><name>dfs.image.transfer.timeout</name><value>XXXX</value>
        </property>
        复制代码
  • 高级优化:
    • 1.允许在HDFS的文件中追加内容(hdfs-site.xml、hbase-site.xml)
      • 属性:dfs.support.append
      • 解释:开启HDFS追加同步,可以优秀的配合HBase的数据同步和持久化。默认值为true。
    • 2.优化数据的写入效率(mapred-site.xml)
      • 属性:mapreduce.map.output.compress、mapreduce.map.output.compress.codec
      • 解释:开启这两个数据可以大大提高文件的写入效率,减少写入时间。第一个属性值修改为true,第二个属性值修改为:org.apache.hadoop.io.compress.GzipCodec或者其他压缩方式。
    • 3.设置RPC监听数量(hbase-site.xml)
      • 属性:hbase.regionserver.handler.count
      • 解释:默认值为30,用于指定RPC监听的数量,可以根据客户端的请求数进行调整,读写请求较多时,增加此值。
    • 4.优化HStore文件大小(hbase-site.xml)
      • 属性:hbase.hregion.max.filesize
      • 解释:默认值10737418240(10GB),如果需要运行HBase的MR任务,可以减小此值,因为一个region对应一个map任务,如果单个region过大,会导致map任务执行时间过长。该值的意思就是,如果HFile的大小达到这个数值,则这个region会被切分为两个Hfile。
    • 5.优化hbase客户端缓存(hbase-site.xml)
      • 属性:hbase.client.write.buffer
      • 解释:用于指定HBase客户端缓存,增大该值可以减少RPC调用次数,但是会消耗更多内存,反之则反之。一般我们需要设定一定的缓存大小,以达到减少RPC次数的目的。
    • 6.指定scan.next扫描HBase所获取的行数(hbase-site.xml)
      • 属性:hbase.client.scanner.caching
      • 解释:用于指定scan.next方法获取的默认行数,值越大,消耗内存越大。
    • 7.flush、compact、split机制
      • 当MemStore达到阈值,将Memstore中的数据Flush进Storefile;compact机制则是把flush出来的小文件合并成大的Storefile文件。split则是当Region达到阈值,会把过大的Region一分为二。
      • 涉及属性:
        • 128M就是Memstore的默认阈值
        • hbase.hregion.memstore.flush.size:134217728
          • 这个参数的作用是当单个HRegion内所有的Memstore大小总和超过指定值时,flush该HRegion的所有memstore。RegionServer的flush是通过将请求添加一个队列,模拟生产消费模型来异步处理的。那这里就有一个问题,当队列来不及消费,产生大量积压请求时,可能会导致内存陡增,最坏的情况是触发OOM。
        • hbase.regionserver.global.memstore.upperLimit:0.4
          hbase.regionserver.global.memstore.lowerLimit:0.38
          复制代码
          • 当MemStore使用内存总量达到hbase.regionserver.global.memstore.upperLimit指定值时,将会有多个MemStores flush到文件中,MemStore flush 顺序是按照大小降序执行的,直到刷新到MemStore使用内存略小于lowerLimit

转载于:https://juejin.im/post/5c8b7d585188257e937de505

相关文章:

适合小团队作战,奖金+招聘绿色通道,这一届算法大赛关注下?

大赛背景伴随着5G、物联网与大数据形成的后互联网格局的逐步形成&#xff0c;日益多样化的用户触点、庞杂的行为数据和沉重的业务体量也给我们的数据资产管理带来了不容忽视的挑战。为了建立更加精准的数据挖掘形式和更加智能的机器学习算法&#xff0c;对不断生成的用户行为事…

Linq 集合处理(Union)

关于Union的两种情况 一、简单值类型或者string类型处理方式(集合需要实现IEnumerable接口) #region int类型List<int> ints1 new List<int> { 1, 2, 3, 4, 5, 6 };List<int> ints2 new List<int> { 5, 6, 7, 8, 9, 0 };IEnumerable<int> ints…

卷积神经网络中十大拍案叫绝的操作

作者 | Justin ho来源 | 知乎CNN从2012年的AlexNet发展至今&#xff0c;科学家们发明出各种各样的CNN模型&#xff0c;一个比一个深&#xff0c;一个比一个准确&#xff0c;一个比一个轻量。下面会对近几年一些具有变革性的工作进行简单盘点&#xff0c;从这些充满革新性的工作…

windows7下解决caffe check failed registry.count(type) == 1(0 vs. 1) unknown layer type问题

在Windows7下调用vs2013生成的Caffe静态库时经常会提示Check failed: registry.count(type) 1 (0 vs. 1) Unknown layer type的错误&#xff0c;如下图&#xff1a;这里参考网上资料汇总了几种解决方法&#xff1a;1. 不使用Caffe的静态库&#xff0c;直接将Caffe的sourc…

js 变量提升 和函数提升

2019独角兽企业重金招聘Python工程师标准>>> 创建函数有两种形式&#xff0c;一种是函数声明&#xff0c;另外一种是函数字面量&#xff0c;只有函数声明才有变量提升 console.log(a) // f a() { console.log(a) } console.log(b) //undefinedfunction a() {consol…

.net_ckeditor+ckfinder的图片上传配置

CKEditor和CKFinder的最新版可以到官方网站&#xff08;http://cksource.com&#xff09;上下载获得。 把以上两个资源放到网站的根目录&#xff1a; /CKEditor 和 /CKFinder (不区分大小写) 在页面使用 CKEditor&#xff1a; <textarea cols"80" id"prcont…

VS2013在Windows7 64位上变慢的解决方法

重装了windows7系统&#xff0c;又重装了vs2013&#xff0c;发现在打开vs2013、编译工程及调试的时候&#xff0c;vs2013都会变的比较慢&#xff0c;参考网上资料&#xff0c;这里列出几种可能的解决方法&#xff1a; 1. 打开工具--> 选项 --> 源代码管理 --> 插件选…

Key-Value数据库:Redis与Memcached之间如何选择?

华为云分布式缓存Redis5.0和Memcached都是华为云DCS的核心产品。 那么在不同的使用场景之下&#xff0c;如何选择Redis5.0和Memcached呢&#xff1f; 就由小编为大家进行详细的数据对比分析吧Redis和Memcached都是非常受欢迎的开源内存数据库&#xff0c;相对关系型数据库&…

裴健等9名华人当选加拿大皇家学会院士

【导读】近日&#xff0c;加拿大皇家学会&#xff08;RSC&#xff0c;The Royal Society of Canada&#xff09;官网宣布已评选出今年的新增院士。其中&#xff0c;京东副总裁、加拿大西蒙弗雷泽大学计算科学学院教授裴健和其他 8 名华人学者均在这份名单之中&#xff0c;而裴健…

Linux中shell命令的用法和技巧

使用Linux shell是我每天的基本工作&#xff0c;但我经常会忘记一些有用的shell命令和l技巧。当然&#xff0c;命令我能记住&#xff0c;但我不敢说能记得如何用它执行某个特定任务。于是&#xff0c;我开始在一个文本文件里记录这些用法&#xff0c;并放在我的Dropbox里&#…

Caffe中Layer注册机制

Caffe内部维护一个注册表用于查找特定Layer对应的工厂函数(Layer Factory的设计用到了设计模式里的工厂模式)。Caffe的Layer注册表是一组键值对(key, value)( LayerRegistry里用map数据结构维护一个CreatorRegistry list, 保存各个Layer的creator的函数句柄)&#xff0c;key为L…

自动驾驶行业观察 | 停车不再难,L2到L4的泊车辅助系统技术剖析

作者 | 陈光来源 | 自动驾驶干货铺&#xff08;ID:IntelligentDrive&#xff09;【导读】在汽车智能化的浪潮中&#xff0c;车载传感器发展迅速&#xff0c;越来越多搭载了先进传感器的汽车进入了我们的视野。比如能够在高速公路上实现单车道巡航的凯迪拉克CT6&#xff0c;以及…

Unity Log重新定向

Unity Log重新定向 使用Unity的Log的时候有时候需要封装一下Debug.Log(message)&#xff0c;可以屏蔽Log或者把log内容写到文本中。通过把文本内容传送到服务器中&#xff0c;查找bug出现的原因。但是封装之后的日志系统如果双击跳转的时候&#xff0c;会跳转到自定义的日志系统…

Javascript 检查一组 radio 中的哪一个被勾选

2019独角兽企业重金招聘Python工程师标准>>> 以前检查单选按钮是否被选择时&#xff0c;我使用的是 if else 一个一个的检查其 checked 属性。 这样虽然可以&#xff0c;但是当一组 radio 有很多个时&#xff0c;就很麻烦了。 可以通过 getElementsByName 得到所有…

二维码Aztec简介及其解码实现(zxing-cpp)

Aztec Code是1995年&#xff0c;由Hand HeldProducts公司的Dr. Andrew Longacre设计。它是一种高容量的二维条形码格式。它可以对ASCII和扩展ASCII码进行编码。当使用最高容量和25%的纠错级别的時候&#xff0c;Aztec可以对3000个字符或者3750个数字进行编码。Aztec的矩阵大小在…

顶配12699 元、没有5G,“浴霸三摄”的iPhone你会买吗?

作者 | 屠敏出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;北京时间 9 月 11 日凌晨 1 点&#xff0c;以「Apple 特别活动」为主题的苹果秋季发布会正式于史蒂夫乔布斯剧院拉开帷幕。按照惯例&#xff0c;在发布会之前&#xff0c;业界“毫不留情”地对新品进行了…

阿里P7架构师告诉你Java架构师必须知道的 6 大设计原则

在软件开发中&#xff0c;前人对软件系统的设计和开发总结了一些原则和模式&#xff0c; 不管用什么语言做开发&#xff0c;都将对我们系统设计和开发提供指导意义。本文主要将总结这些常见的原则&#xff0c;和具体阐述意义。 开发原则 面向对象的基本原则(solid)是五个&#…

rhel6用centos163 yum源

cd /etc/yum.repos.d/wget wget http://mirrors.163.com/.help/CentOS6-Base-163.reposed -i "s/\$releasever/6/" CentOS6-Base-163.repo

打破深度学习局限,强化学习、深度森林或是企业AI决策技术的“良药”

算法、算力和数据是人工智能时代的三驾马车&#xff0c;成为企业赋能人工智能的动力&#xff0c;但它们自身的特性也为企业和高校在研究和落地应用过程带来了重重挑战。比如&#xff0c;训练算法的成本高昂&#xff0c;数据从采集、处理到存储已面临瓶颈&#xff0c;目前针对算…

JAVA springboot微服务b2b2c电子商务系统(十三)断路器聚合监控(Hystrix Turbine)

讲述了如何利用Hystrix Dashboard去监控断路器的Hystrix command。当我们有很多个服务的时候&#xff0c;这就需要聚合所以服务的Hystrix Dashboard的数据了。这就需要用到Spring Cloud的另一个组件了&#xff0c;即Hystrix Turbine。一、Hystrix Turbine简介看单个的Hystrix D…

二维码Data Matrix的解码实现(zxing-cpp)

二维码Data Matrix的介绍可以参考http://blog.csdn.net/fengbingchun/article/details/44279967 ,以下是通过zxing-cpp开源库实现的对Data Matrix进行解码的测试代码&#xff1a;#include "funset.hpp" #include <string> #include <fstream> #include &…

PHP mongodb 的使用

mongodb 不用过多的介绍了&#xff0c;NOSQL的一种&#xff0c;是一个面向文档的数据库&#xff0c;以其方便灵活的数据结构&#xff0c;对于开发者来说是比较友好的&#xff0c;同时查询的速度也是比较快的&#xff0c;现在好多网站 开始使用mongodb ,具体的介绍可以网上查找。…

必看,61篇NeurIPS深度强化学习论文解读都这里了

作者 | DeepRL来源 | 深度强化学习实验室&#xff08;ID: Deep-RL&#xff09;NeurIPS可谓人工智能年度最大盛会。每年全球的人工智能爱好者和科学家都会在这里聚集&#xff0c;发布最新研究&#xff0c;并进行热烈探讨&#xff0c;大会的技术往往这未来几年就会演变成真正的研…

07-09-Exchange Server 2019-配置-Outlook 2019

[在此处输入文章标题] 《系统工程师实战培训》 -07-部署邮件系统 -09-Exchange Server 2019-配置-Outlook 2019 作者&#xff1a;学 无 止 境 QQ交流群&#xff1a;454544014 MSUCDemo01 MSUCDemo02 MSUCDemo03 MSUCDemo04 MSUCDemo05 启用邮箱 MSUCDemo01i-x-Cloud.com MSUCDe…

二维码QR Code简介及其解码实现(zxing-cpp)

二维码QR Code(Quick Response Code)是由Denso公司于1994年9月研制的一种矩阵二维码符号&#xff0c;它具有一维条码及其它二维条码所具有的信息容量大、可靠性高、可表示汉字及图象多种文字信息、保密防伪性强等优点。二维码QR Code呈正方形&#xff0c;常见的是黑白两色。在3…

jQuery学习(一)

因为项目需要&#xff0c;同时也因为兴趣&#xff0c;在近一段时间研究和使用了jQuery&#xff0c;它真的是太强大了&#xff0c;代码非常的优雅和简洁&#xff0c;好后悔现在才开始了解它&#xff0c;虽然目前网络上关于jQuery的资料、学习心得&#xff0c;教程多得你看不完&a…

知乎算法团队负责人孙付伟:Graph Embedding在知乎的应用实践

演讲嘉宾 | 孙付伟出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;9月6-7日&#xff0c;在由CSDN主办的2019中国AI开发者大会&#xff08;AI ProCon 2019&#xff09;的 机器学习专场中&#xff0c;知乎算法团队负责人孙付伟在机器学习专场中分享了《Graph Embedding…

一维码Codabar简介及其解码实现(zxing-cpp)

一维码Codabar&#xff1a;由4条黑色线条&#xff0c;3条白色线条&#xff0c;合计7条线条所组成&#xff0c;每一个字元与字元之间有一间隙Gap做区隔。条形码Codabar包含21个字元&#xff1a;(1)、10个数字0~9;(2)、””, ”-”,”*”, ”/”, ”$”, .”, ”:”等7个特殊符号…

node 压缩模块速成

1. 压缩与解压缩处理可以使用zlib模块进行压缩及解压缩处理,压缩文件以后可以减少体积&#xff0c;加快传输速度和节约带宽 代码2. 压缩对象压缩和解压缩对象都是一个可读可写流方法说明zlib.createGzip返回Gzip流对象&#xff0c;使用Gzip算法对数据进行压缩处理zlib.createGu…

hadoop作业初始化过程详解(源码分析第三篇)

&#xff08;一&#xff09;概述我们在上一篇blog已经详细的分析了一个作业从用户输入提交命令到到达JobTracker之前的各个过程。在作业到达JobTracker之后初始化之前&#xff0c;JobTracker会通过submitJob方法&#xff0c;为每个作业都创建一个JobInProgress对象(本文以后简称…