A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

配置
  • 准备目录树,环境变量配置

  • 修改/opt/hbase/hbase1.x/conf/hbase-env.sh,根据自己的版本设置


export JAVA_HOME=/opt/java/jdk1.8export HADOOP_HOME=/opt/hadoop/hadoop2.8export HBASE_HOME=/opt/hbase/hbase1.2export HBASE_CLASSPATH=/opt/hadoop/hadoop2.8/etc/hadoopexport HBASE_PID_DIR=/root/hbase/pidsexport HBASE_MANAGES_ZK=false
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 修改hbase-site.xml
<property> <name>hbase.rootdir</name> <value>hdfs://master:9000/hbase</value> <description>The directory shared byregion servers.</description></property> <!-- hbase端口 --><property> <name>hbase.zookeeper.property.clientPort</name> <value>2181</value></property><!-- 超时时间 --><property> <name>zookeeper.session.timeout</name> <value>120000</value></property><!--防止服务器时间不同步出错 --><property><name>hbase.master.maxclockskew</name><value>150000</value></property><!-- 集群主机配置 --><property> <name>hbase.zookeeper.quorum</name> <value>master,slave1,slave2</value></property><!--   路径存放 --><property> <name>hbase.tmp.dir</name> <value>/root/hbase/tmp</value></property><!-- true表示分布式 --><property> <name>hbase.cluster.distributed</name> <value>true</value></property>  <!-- 指定master -->  <property>    <name>hbase.master</name>    <value>master:60000</value>  </property>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 修改regionservers
    指定hbase的主从关系,类似hadoop的主从关系配置
    添加slave1和slave2即可
主从配置同步

scp -r /opt/hbase root@slave1:/opt
scp -r /opt/hbase root@slave2:/opt

启动

starthbase(别名),在各个主机上使用jps查看进程
master上是HMaster,slave1上是HRegionServer
查看web端口http://134.175.xxx.xxx:16010,有两个slave表示配置成功

使用HBase

hbase不提供表的关联,处理表之间关系的能力弱。如果需要处理很复杂的逻辑关系,不适合hbase

HIVE和HBASE区别点这里
HBASE的运行必须依赖zookeeper

HBase表结构常规表结构


表的字段是事先定义好的,如果想临时添加字段,就必须改变整个表结构,既麻烦,也浪费了存储空间。

HBASE表结构


定义表的时候,没有列,而是列族。插入数据时,列族中可以存储任意多个列(KV,列名&列值)
要查询某一个字段的值,需要指定的坐标:表名->行键->列族(ColumnFamily):列名(Qualifier)->版本。如果不指定版本,那么默认最新版本的值。
巨大的表被切分为很多个region,region放在服务器上,这些服务器被称为region server。

上图有两个table1的region,一个table2的region。每个region被存放在hdfs上,称为一个HFile。
事实上,为了数据存取方便,往往region server和datanode运行在同一台机器上。
为了管理很多region server,Hbase提供了HMaster机制,它不负责存储表数据,而是管理region server的状态,并负责负载均衡。

表寻址机制


root表由zookeeper(zookeeper 必须 使用三台及以上节点组成集群才能真正发挥作用)来管理,因此HBase的使用必须依赖集群

HBase系统架构

MenStore是HBase支持高速随机访问的关键,它把当前最热(频次最高的)数据放在MenStore里。

HBase Shell操作
  • 建表
create 'table_name',{NAME=>'name',VERSIONS=>1},{NAME=>'name'}
  • 1

  • 查看表信息
describe 'table_name'
  • 1

shell 脚本不是很方便,建议使用java api

HBase+Eclipse

配置eclipse的时候注意必要的xml属性文件,建议使用maven。
如果没有使用maven,而是使用自己添加依赖的形式的话,项目配置完了之后的目录树长这样:

值得注意的是,项目文件里要添加一些配置文件,例如hbase-site.xml,这些文件是从集群配置上复制的
样例代码(代码的注释还没有写)
更多关于JUnit使用的介绍点这里

package cn.colony.cloudhadoop.hbase;import java.io.IOException;import java.util.ArrayList;import java.util.List;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.hbase.Cell;import org.apache.hadoop.hbase.HBaseConfiguration;import org.apache.hadoop.hbase.HColumnDescriptor;import org.apache.hadoop.hbase.HTableDescriptor;import org.apache.hadoop.hbase.MasterNotRunningException;import org.apache.hadoop.hbase.ZooKeeperConnectionException;import org.apache.hadoop.hbase.client.Admin;import org.apache.hadoop.hbase.client.Connection;import org.apache.hadoop.hbase.client.ConnectionFactory;import org.apache.hadoop.hbase.client.Get;import org.apache.hadoop.hbase.client.Put;import org.apache.hadoop.hbase.client.Result;import org.apache.hadoop.hbase.client.ResultScanner;import org.apache.hadoop.hbase.client.Scan;import org.apache.hadoop.hbase.client.Table;import org.apache.hadoop.hbase.filter.BinaryComparator;import org.apache.hadoop.hbase.filter.BinaryPrefixComparator;import org.apache.hadoop.hbase.filter.ByteArrayComparable;import org.apache.hadoop.hbase.filter.ColumnPrefixFilter;import org.apache.hadoop.hbase.filter.CompareFilter.CompareOp;import org.apache.hadoop.hbase.filter.FamilyFilter;import org.apache.hadoop.hbase.filter.Filter;import org.apache.hadoop.hbase.filter.MultipleColumnPrefixFilter;import org.apache.hadoop.hbase.filter.PrefixFilter;import org.apache.hadoop.hbase.filter.QualifierFilter;import org.apache.hadoop.hbase.filter.RegexStringComparator;import org.apache.hadoop.hbase.filter.RowFilter;import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;import org.apache.hadoop.hbase.filter.SubstringComparator;import org.apache.hadoop.hbase.util.Bytes;import org.junit.Before;import org.junit.Test;import org.apache.hadoop.hbase.TableName;public class HbaseDemo {    private Configuration testConf = null;    @Before    public void init(){        testConf = HBaseConfiguration.create();    }    @Test    public void testCreate() throws MasterNotRunningException, ZooKeeperConnectionException, IOException{        Connection connection = ConnectionFactory.createConnection();        Admin admin = connection.getAdmin();        TableName name = TableName.valueOf("testTable");        HTableDescriptor desc = new HTableDescriptor(name);        HColumnDescriptor cd = new HColumnDescriptor("baseInfo");        desc.addFamily(cd);        admin.createTable(desc);        admin.close();    }    @Test    public void testDrop() throws MasterNotRunningException, ZooKeeperConnectionException, IOException{        Connection connection = ConnectionFactory.createConnection();        Admin admin = connection.getAdmin();        TableName tablename = TableName.valueOf("testTable");        admin.disableTable(tablename);        admin.deleteTable(tablename);        admin.close();    }    @Test    public void testPut() throws IOException, Exception{        Connection connection = ConnectionFactory.createConnection();        Table table = connection.getTable(TableName.valueOf("testTable"));        Put p = new Put(Bytes.toBytes("rk001"));//行键        p.addColumn(Bytes.toBytes("baseInfo"), Bytes.toBytes("name"), Bytes.toBytes("dingqimin"));        table.put(p);        table.close();    }    @Test    public void testInsert() throws IOException{        Connection connection = ConnectionFactory.createConnection();        Table table = connection.getTable(TableName.valueOf("testTable"));        //不要使用String.getBytes(),可能会出现编码错误        Put name = new Put(Bytes.toBytes("rk001"));//行键        name.addColumn(Bytes.toBytes("baseInfo"), Bytes.toBytes("name"), Bytes.toBytes("one"));        Put age = new Put(Bytes.toBytes("rk001"));//行键        age.addColumn(Bytes.toBytes("baseInfo"), Bytes.toBytes("age"), Bytes.toBytes("6"));        ArrayList<Put> puts = new ArrayList<>();        puts.add(name);        puts.add(age);        table.put(puts);        table.close();    }    @Test    public void testGet() throws IOException{        Connection connection = ConnectionFactory.createConnection();        Table table = connection.getTable(TableName.valueOf("testTable"));        Get get = new Get(Bytes.toBytes("rk001"));//      get.setMaxVersions(3);        Result result = table.get(get);        List<Cell> cells = result.listCells();        //使用 CellUtil.getRowByte(Cell, int)会有乱码        for (Cell cell:cells){            System.out.println(Bytes.toString(cell.getRow()));            System.out.println(Bytes.toString(cell.getFamily()));            System.out.println(Bytes.toString(cell.getQualifier()));            System.out.println(Bytes.toString(cell.getValue()));        }        table.close();    }    @Test    public void testScan() throws IOException{        Connection connection = ConnectionFactory.createConnection();        Table table = connection.getTable(TableName.valueOf("testTable"));        Scan scan = new Scan(Bytes.toBytes("person_rk_bj_zhang_000001"), Bytes.toBytes("person_rk_bj_zhang_000002"));        //前缀过滤器----针对行键        Filter filter = new PrefixFilter(Bytes.toBytes("rk"));        //行过滤器        ByteArrayComparable rowComparator = new BinaryComparator(Bytes.toBytes("person_rk_bj_zhang_000001"));        RowFilter rf = new RowFilter(CompareOp.LESS_OR_EQUAL, rowComparator);        /**         * 假设RowKey格式为:创建日期_发布日期_ID_TITLE         * 目标:查找  发布日期  为  2014-12-21  的数据         */        rf = new RowFilter(CompareOp.EQUAL , new SubstringComparator("_2014-12-21_"));        //单值过滤器 1 完整匹配字节数组        new SingleColumnValueFilter("base_info".getBytes(), "name".getBytes(), CompareOp.EQUAL, "zhangsan".getBytes());        //单值过滤器2 匹配正则表达式        ByteArrayComparable comparator = new RegexStringComparator("zhang.");        new SingleColumnValueFilter("info".getBytes(), "NAME".getBytes(), CompareOp.EQUAL, comparator);        //单值过滤器2 匹配是否包含子串,大小写不敏感        comparator = new SubstringComparator("wu");        new SingleColumnValueFilter("info".getBytes(), "NAME".getBytes(), CompareOp.EQUAL, comparator);        //键值对元数据过滤-----family过滤----字节数组完整匹配        FamilyFilter ff = new FamilyFilter(                CompareOp.EQUAL ,                 new BinaryComparator(Bytes.toBytes("base_info"))   //表中不存在inf列族,过滤结果为空                );        //键值对元数据过滤-----family过滤----字节数组前缀匹配        ff = new FamilyFilter(                CompareOp.EQUAL ,                 new BinaryPrefixComparator(Bytes.toBytes("inf"))   //表中存在以inf打头的列族info,过滤结果为该列族所有行                );       //键值对元数据过滤-----qualifier过滤----字节数组完整匹配        filter = new QualifierFilter(                CompareOp.EQUAL ,                 new BinaryComparator(Bytes.toBytes("na"))   //表中不存在na列,过滤结果为空                );        filter = new QualifierFilter(                CompareOp.EQUAL ,                 new BinaryPrefixComparator(Bytes.toBytes("na"))   //表中存在以na打头的列name,过滤结果为所有行的该列数据                );        //基于列名(即Qualifier)前缀过滤数据的ColumnPrefixFilter        filter = new ColumnPrefixFilter("na".getBytes());        //基于列名(即Qualifier)多个前缀过滤数据的MultipleColumnPrefixFilter        byte[][] prefixes = new byte[][] {Bytes.toBytes("na"), Bytes.toBytes("me")};        filter = new MultipleColumnPrefixFilter(prefixes);        //为查询设置过滤条件        scan.setFilter(filter);        scan.addFamily(Bytes.toBytes("base_info"));        ResultScanner scanner = table.getScanner(scan);        for(Result r : scanner){            /**            for(KeyValue kv : r.list()){                String family = new String(kv.getFamily());                System.out.println(family);                String qualifier = new String(kv.getQualifier());                System.out.println(qualifier);                System.out.println(new String(kv.getValue()));            }            */            //直接从result中取到某个特定的value            byte[] value = r.getValue(Bytes.toBytes("base_info"), Bytes.toBytes("name"));            System.out.println(new String(value));        }        table.close();    }    public static void createTable(String tableName, String[] familyNames, int[] maxVersions, Configuration conf) throws MasterNotRunningException, ZooKeeperConnectionException, IOException{        Connection connection = ConnectionFactory.createConnection();        Admin admin = connection.getAdmin();        TableName tablename = TableName.valueOf(tableName);        HTableDescriptor desc = new HTableDescriptor(tablename);        for (int index = 0; index<familyNames.length; index++){            HColumnDescriptor cd = new HColumnDescriptor(familyNames[index]);            cd.setMaxVersions(maxVersions[index]);            desc.addFamily(cd);        }        admin.createTable(desc);        admin.close();    }    public static void dropTable(String tableName, Configuration conf) throws MasterNotRunningException, ZooKeeperConnectionException, IOException{        Connection connection = ConnectionFactory.createConnection();        Admin admin = connection.getAdmin();        TableName tablename = TableName.valueOf(tableName);        admin.disableTable(tablename);        admin.deleteTable(tablename);        admin.close();    }    public static void putData(String tableName, String rowKey, String columnFamily, String qualifier, String value, Configuration conf) throws IOException{        Connection connection = ConnectionFactory.createConnection();        Table table = connection.getTable(TableName.valueOf("testTable"));        Put p = new Put(Bytes.toBytes(rowKey));        p.addColumn(columnFamily.getBytes(), qualifier.getBytes(), value.getBytes());        table.put(p);        table.close();    }    public static void main(String[] args) throws MasterNotRunningException, ZooKeeperConnectionException, IOException{        Configuration myConf = HBaseConfiguration.create();//      String tableName = "testTable";//      String[] familyNames = {"baseInfo","extraInfo"};//      int[] maxVersions = {2, 2};//      createTable(tableName, familyNames, maxVersions, myConf);        dropTable("testTable", myConf);    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226
  • 227
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • 241
  • 242
  • 243
  • 244
  • 245
  • 246
  • 247
  • 248
  • 249


【转载】        https://blog.csdn.net/moquancsdn/article/details/81700320


2 个回复

倒序浏览
奈斯
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马