❶ HBase使用get命令可以获取服务器标识码,他的返回值是由下面那些内容组成的()
朔所取得的服务器标识的这个返回值肯定是不是下面的这些内容,所以应该是其他的一些内容取得到服务器
❷ hbase协处理器,怎么判断是否是更新
插入之后,在通过setMaxVersions()方法就可以把所有的版本都取出来了Get get = new Get(startRow);get.setMaxVersions();Result result = table.get(get);List<KeyValue> list = result.list();for(final KeyValue v:list){logger.info("value: "+ v+ " str: "+Bytes.toString(v.getValue()));}这样就明了了
❸ 描述hbase的scan和get功能以及实现的异同
HBase的查询实现只提供两种方式: 1、按指定RowKey获取唯一一条记录,get方法(org.apache.hadoop.hbase.client.Get) 2、按指定的条件获取一批记录,scan方法(org.apache.hadoop.hbase.client.Scan) 实现条件查询功能使用的就是scan方式
❹ HBase的get操作,如何像scan一样分批次返回列
可以。 在get时,设置你要返回的指定列的列名。 API里有类似 addColumn之类的方法。
❺ hbase构建二级索引的实现方式有哪些
写了个Hbase新的api的增删改查的工具类,以供参考,直接拷贝代码就能用,散仙觉得基础的功能,都有了,代码如下:package com.dhgate.hbase.test;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.CellUtil;import org.apache.hadoop.hbase.HBaseConfiguration;import org.apache.hadoop.hbase.HColumnDescriptor;import org.apache.hadoop.hbase.HTableDescriptor;import org.apache.hadoop.hbase.TableName;import org.apache.hadoop.hbase.client.Delete;import org.apache.hadoop.hbase.client.Get;import org.apache.hadoop.hbase.client.HBaseAdmin;import org.apache.hadoop.hbase.client.HTable;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.filter.PageFilter;import org.apache.hadoop.hbase.filter.PrefixFilter;import org.apache.hadoop.hbase.util.Bytes;/** * 基于新的API * Hbase0.96版本 * 写的工具类 * * @author qindongliang * 大数据技术交流群: 376932160 * * **/public class HbaseCommons {static Configuration conf=HBaseConfiguration.create();static String tableName="";public static void main(String[] args)throws Exception {//String tableName="test";//createTable(tableName, null);}/*** 批量添加数据* @param tableName 标名字* @param rows rowkey行健的集合* 本方法仅作示例,其他的内容需要看自己义务改变* * **/public static void insertList(String tableName,String rows[])throws Exception{HTable table=new HTable(conf, tableName);List<Put> list=new ArrayList<Put>();for(String r:rows){Put p=new Put(Bytes.toBytes(r)); //此处示例添加其他信息//p.add(Bytes.toBytes("family"),Bytes.toBytes("column"), 1000, Bytes.toBytes("value"));list.add(p);}table.put(list);//批量添加table.close();//释放资源}/*** 创建一个表* @param tableName 表名字* @param columnFamilys 列簇* * **/public static void createTable(String tableName,String[] columnFamilys)throws Exception{//admin 对象HBaseAdmin admin=new HBaseAdmin(conf);if(admin.tableExists(tableName)){System.out.println("此表,已存在!");}else{//旧的写法//HTableDescriptor tableDesc=new HTableDescriptor(tableName);//新的apiHTableDescriptor tableDesc=new HTableDescriptor(TableName.valueOf(tableName));for(String columnFamily:columnFamilys){tableDesc.addFamily(new HColumnDescriptor(columnFamily));}admin.createTable(tableDesc);System.out.println("建表成功!");}admin.close();//关闭释放资源}/*** 删除一个表* @param tableName 删除的表名* */public static void deleteTable(String tableName)throws Exception{HBaseAdmin admin=new HBaseAdmin(conf);if(admin.tableExists(tableName)){admin.disableTable(tableName);//禁用表admin.deleteTable(tableName);//删除表System.out.println("删除表成功!");}else{System.out.println("删除的表不存在!");}admin.close();}/*** 插入一条数据* @param tableName 表明* @param columnFamily 列簇* @param column 列* @param value 值* * ***/public static void insertOneRow(String tableName,String rowkey,String columnFamily,String column,String value)throws Exception{HTable table=new HTable(conf, tableName);Put put=new Put(Bytes.toBytes(rowkey));put.add(Bytes.toBytes(columnFamily), Bytes.toBytes(column), Bytes.toBytes(value));table.put(put);//放入表table.close();//释放资源}/*** 删除一条数据* @param tableName 表名* @param row rowkey行键* * */public static void deleteOneRow(String tableName,String row)throws Exception{HTable table=new HTable(conf, tableName);Delete delete=new Delete(Bytes.toBytes(row));table.delete(delete);table.close();}/*** 删除多条数据* @param tableName 表名* @param rows 行健集合* * **/public static void deleteList(String tableName,String rows[])throws Exception{HTable table=new HTable(conf, tableName);List<Delete> list=new ArrayList<Delete>();for(String row:rows){Delete del=new Delete(Bytes.toBytes(row));list.add(del);}table.delete(list);table.close();//释放资源}/*** 获取一条数据,根据rowkey* @param tableName 表名* @param row 行健* * **/public static void getOneRow(String tableName,String row)throws Exception{HTable table=new HTable(conf, tableName);Get get=new Get(Bytes.toBytes(row));Result result=table.get(get);printRecoder(result);//打印记录table.close();//释放资源}/*** 查看某个表下的所有数据* * @param tableName 表名* */public static void showAll(String tableName)throws Exception{HTable table=new HTable(conf, tableName);Scan scan=new Scan();ResultScanner rs=table.getScanner(scan);for(Result r:rs){printRecoder(r);//打印记录}table.close();//释放资源}/*** 查看某个表下的所有数据* * @param tableName 表名* @param rowKey 行健* */public static void ScanPrefixByRowKey(String tableName,String rowKey)throws Exception{HTable table=new HTable(conf, tableName);Scan scan=new Scan();scan.setFilter(new PrefixFilter(Bytes.toBytes(rowKey)));ResultScanner rs=table.getScanner(scan);for(Result r:rs){printRecoder(r);//打印记录}table.close();//释放资源}/*** 查看某个表下的所有数据* * @param tableName 表名* @param rowKey 行健扫描* @param limit 限制返回数据量* */public static void ScanPrefixByRowKeyAndLimit(String tableName,String rowKey,long limit)throws Exception{HTable table=new HTable(conf, tableName);Scan scan=new Scan();scan.setFilter(new PrefixFilter(Bytes.toBytes(rowKey)));scan.setFilter(new PageFilter(limit));ResultScanner rs=table.getScanner(scan);for(Result r:rs){printRecoder(r);//打印记录}table.close();//释放资源}/*** 根据rowkey扫描一段范围* @param tableName 表名* @param startRow 开始的行健* @param stopRow 结束的行健* **/public void scanByStartAndStopRow(String tableName,String startRow,String stopRow)throws Exception{HTable table=new HTable(conf, tableName);Scan scan=new Scan();scan.setStartRow(Bytes.toBytes(startRow));scan.setStopRow(Bytes.toBytes(stopRow));ResultScanner rs=table.getScanner(scan);for(Result r:rs){printRecoder(r);}table.close();//释放资源}/*** 扫描整个表里面具体的某个字段的值* @param tableName 表名* @param columnFalimy 列簇* @param column 列* **/public static void getValueDetail(String tableName,String columnFalimy,String column)throws Exception{HTable table=new HTable(conf, tableName);Scan scan=new Scan();ResultScanner rs=table.getScanner(scan);for(Result r:rs){System.out.println("值: " +new String(r.getValue(Bytes.toBytes(columnFalimy), Bytes.toBytes(column))));}table.close();//释放资源}/*** 打印一条记录的详情* * */public static void printRecoder(Result result)throws Exception{for(Cell cell:result.rawCells()){System.out.print("行健: "+new String(CellUtil.cloneRow(cell)));System.out.print("列簇: "+new String(CellUtil.cloneFamily(cell)));System.out.print(" 列: "+new String(CellUtil.cloneQualifier(cell)));System.out.print(" 值: "+new String(CellUtil.cloneValue(cell)));System.out.println("时间戳: "+cell.getTimestamp());}}}
❻ 如何使用eclipse maven构建hbase开发环境
步骤如下:1:从HBase集群中复制一份Hbase部署文件,放置在开发端某一目录下(如在/app/hadoop/hbase096目录下)。2:在eclipse里新建一个java项目HBase,然后选择项目属性,在Libraries->Add External JARs…,然后选择/app/hadoop/hbase096/lib下相关的JAR包,如果只是测试用的话,就简单一点,将所有的JAR选上。3:在项目HBase下增加一个文件夹conf,将Hbase集群的配置文件hbase-site.xml复制到该目录,然后选择项目属性在Libraries->Add Class Folder,将刚刚增加的conf目录选上。4:在HBase项目中增加一个chapter12的package,然后增加一个HBaseTestCase的class,然后将《Hadoop实战第2版》12章的代码复制进去,做适当的修改,代码如下:package chapter12;import java.io.IOException;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.hbase.HBaseConfiguration;import org.apache.hadoop.hbase.HColumnDescriptor;import org.apache.hadoop.hbase.HTableDescriptor;import org.apache.hadoop.hbase.client.Get;import org.apache.hadoop.hbase.client.HBaseAdmin;import org.apache.hadoop.hbase.client.HTable;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.util.Bytes;public class HBaseTestCase {//声明静态配置 HBaseConfigurationstatic Configuration cfg=HBaseConfiguration.create();//创建一张表,通过HBaseAdmin HTableDescriptor来创建public static void creat(String tablename,String columnFamily) throws Exception {HBaseAdmin admin = new HBaseAdmin(cfg);if (admin.tableExists(tablename)) {System.out.println("table Exists!");System.exit(0);}else{HTableDescriptor tableDesc = new HTableDescriptor(tablename);tableDesc.addFamily(new HColumnDescriptor(columnFamily));admin.createTable(tableDesc);System.out.println("create table success!");}}//添加一条数据,通过HTable Put为已经存在的表来添加数据public static void put(String tablename,String row, String columnFamily,String column,String data) throws Exception {HTable table = new HTable(cfg, tablename);Put p1=new Put(Bytes.toBytes(row));p1.add(Bytes.toBytes(columnFamily), Bytes.toBytes(column), Bytes.toBytes(data));table.put(p1);System.out.println("put '"+row+"','"+columnFamily+":"+column+"','"+data+"'");}public static void get(String tablename,String row) throws IOException{HTable table=new HTable(cfg,tablename);Get g=new Get(Bytes.toBytes(row));Result result=table.get(g);System.out.println("Get: "+result);}//显示所有数据,通过HTable Scan来获取已有表的信息public static void scan(String tablename) throws Exception{HTable table = new HTable(cfg, tablename);Scan s = new Scan();ResultScanner rs = table.getScanner(s);for(Result r:rs){System.out.println("Scan: "+r);}}public static boolean delete(String tablename) throws IOException{HBaseAdmin admin=new HBaseAdmin(cfg);if(admin.tableExists(tablename)){try{admin.disableTable(tablename);admin.deleteTable(tablename);}catch(Exception ex){ex.printStackTrace();return false;}}return true;}public static void main (String [] agrs) {String tablename="hbase_tb";String columnFamily="cf";try {HBaseTestCase.creat(tablename, columnFamily);HBaseTestCase.put(tablename, "row1", columnFamily, "cl1", "data");HBaseTestCase.get(tablename, "row1");HBaseTestCase.scan(tablename);/* if(true==HBaseTestCase.delete(tablename))System.out.println("Delete table:"+tablename+"success!");*/}catch (Exception e) {e.printStackTrace();}}}5:设置运行配置,然后运行。运行前将Hbase集群先启动。6:检验,使用hbase shell查看hbase,发现已经建立表hbase_tb。
❼ hbase问题求解答。
问题补充:我自己来回答,是因为hadoop与hbase版本不兼容的问题,后来使用看提示好像是访问HDFS出现了问题。不知道你的hdfs是否工作正常?
❽ hbase shell的get
输入jar包好像没见过
❾ 怎样实现用MapRece读取HBase中历史版本的数据并传到HDFS
wordCountHbaseReaderMapper类继承了TableMapper< Text,Text>抽象类,TableMapper类专门用于完成MapRece中Map过程与Hbase表之间的操作。此时的map(ImmutableBytesWritable key,Result value,Context context)方法,第一个参数key为Hbase表的rowkey主键,第二个参数value为key主键对应的记录集合,此处的map核心实现是遍历key主键对应的记录集合value,将其组合成一条记录通过contentx.write(key,value)填充到< key,value>键值对中。 详细源码请参考:WordCountHbaseReader\src\com\zonesion\hbase\WordCountHbaseReader.javapublic static class WordCountHbaseReaderMapper extends TableMapper<Text,Text>{ @Override protected void map(ImmutableBytesWritable key,Result value,Context context) throws IOException, InterruptedException { StringBuffer sb = new StringBuffer(""); for(Entry<byte[],byte[]> entry:value.getFamilyMap("content".getBytes()).entrySet()){ String str = new String(entry.getValue()); //将字节数组转换为String类型 if(str != null){ sb.append(new String(entry.getKey())); sb.append(":"); sb.append(str); } context.write(new Text(key.get()), new Text(new String(sb))); } }}3、 Recer函数实现此处的WordCountHbaseReaderRece实现了直接输出Map输出的< key,value>键值对,没有对其做任何处理。详细源码请参考:WordCountHbaseReader\src\com\zonesion\hbase\WordCountHbaseReader.javapublic static class WordCountHbaseReaderRece extends Recer<Text,Text,Text,Text>{ private Text result = new Text(); @Override protected void rece(Text key, Iterable<Text> values,Context context) throws IOException, InterruptedException { for(Text val:values){ result.set(val); context.write(key, result); } }}4、 驱动函数实现与WordCount的驱动类不同,在Job配置的时候没有配置job.setMapperClass(),而是用以下方法执行Mapper类: TableMapReceUtil.initTableMapperJob(tablename,scan,WordCountHbaseReaderMapper.class, Text.class, Text.class, job); 该方法指明了在执行job的Map过程时,数据输入源是hbase的tablename表,通过扫描读入对象scan对表进行全表扫描,为Map过程提供数据源输入,通过WordCountHbaseReaderMapper.class执行Map过程,Map过程的输出key/value类型是 Text.class与Text.class,最后一个参数是作业对象。特别注意:这里声明的是一个最简单的扫描读入对象scan,进行表扫描读取数据,其中scan可以配置参数,这里为了例子简单不再详述,用户可自行尝试。 详细源码请参考:WordCountHbaseReader\src\com\zonesion\hbase\WordCountHbaseReader.javapublic static void main(String[] args) throws Exception { String tablename = "wordcount"; Configuration conf = HBaseConfiguration.create(); conf.set("hbase.zookeeper.quorum", "Master"); String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs(); if (otherArgs.length != 1) { System.err.println("Usage: WordCountHbaseReader <out>"); System.exit(2); } Job job = new Job(conf, "WordCountHbaseReader"); job.setJarByClass(WordCountHbaseReader.class); //设置任务数据的输出路径; FileOutputFormat.setOutputPath(job, new Path(otherArgs[0])); job.setRecerClass(WordCountHbaseReaderRece.class); Scan scan = new Scan(); TableMapReceUtil.initTableMapperJob(tablename,scan,WordCountHbaseReaderMapper.class, Text.class, Text.class, job); //调用job.waitForCompletion(true) 执行任务,执行成功后退出; System.exit(job.waitForCompletion(true) ? 0 : 1);}5、部署运行1)启动Hadoop集群和Hbase服务[[email protected] ~]$ start-dfs.sh #启动hadoop HDFS文件管理系统[[email protected] ~]$ start-mapred.sh #启动hadoop MapRece分布式计算服务[[email protected] ~]$ start-hbase.sh #启动Hbase[[email protected] ~]$ jps #查看进程22003 HMaster10611 SecondaryNameNode22226 Jps21938 HQuorumPeer10709 JobTracker22154 HRegionServer20277 Main10432 NameNode
❿ HBase数据结构是什么
RowKey
与nosql数据库们一样,RowKey是用来检索记录的主键。访问HBASE table中的行,只有三种方式:
通过单个RowKey访问(get)
通过RowKey的range(正则)(like)
全表扫描(scan)RowKey行键 (RowKey)可以是任意字符串(最大长度是64KB,实际应用中长度一般为 10-100bytes),在HBASE内部,RowKey保存为字节数组。存储时,数据按照RowKey的字典序(byte order)排序存储。设计RowKey时,要充分排序存储这个特性,将经常一起读取的行存储放到一起。(位置相关性)
Column Family
列族:HBASE表中的每个列,都归属于某个列族。列族是表的schema的一部 分(而列不是),必须在使用表之前定义。列名都以列族作为前缀。例如 courses:history,courses:math都属于courses 这个列族。
Cell
由{rowkey, column Family:columu, version} 唯一确定的单元。cell中的数据是没有类型的,全部是字节码形式存贮。关键字:无类型、字节码
Time Stamp
HBASE 中通过rowkey和columns确定的为一个存贮单元称为cell。每个 cell都保存 着同一份数据的多个版本。版本通过时间戳来索引。时间戳的类型是 64位整型。时间戳可以由HBASE(在数据写入时自动 )赋值,此时时间戳是精确到毫秒 的当前系统时间。时间戳也可以由客户显式赋值。如果应用程序要避免数据版 本冲突,就必须自己生成具有唯一性的时间戳。每个 cell中,不同版本的数据按照时间倒序排序,即最新的数据排在最前面。为了避免数据存在过多版本造成的的管理 (包括存贮和索引)负担,HBASE提供 了两种数据版本回收方式。一是保存数据的最后n个版本,二是保存最近一段 时间内的版本(比如最近七天)。用户可以针对每个列族进行设置。
命名空间
命名空间的结构:
Table:表,所有的表都是命名空间的成员,即表必属于某个命名空间,如果没有指定,则在default默认的命名空间中。
RegionServer group:一个命名空间包含了默认的RegionServer Group。
Permission:权限,命名空间能够让我们来定义访问控制列表ACL(Access Control List)。例如,创建表,读取表,删除,更新等等操作。
Quota:限额,可以强制一个命名空间可包含的region的数量。