系统环境
Linux Ubuntu 16.04
jdk-7u75-linux-x64
hbase-1.0.0-cdh5.4.5
hadoop-2.6.0-cdh5.4.5
hadoop-2.6.0-eclipse-cdh5.4.5.jar
eclipse-java-juno-SR2-linux-gtk-x86_64
任务内容
1.创建一个自定义过滤器,过滤出特定列族,特定列,特定值。
2.创建一个前缀过滤器,使其可以过滤出带有特定前缀的数据。
任务步骤
1.在Linux本地新建/data/hbase3目录。
view plain copy
mkdir -p /data/hbase3
切换到/data/hbase3目录下,使用wget命令,下载http://192.168.1.100:60000/allfiles/hbase3中的文件。
view plain copy
cd /data/hbase3
wget http://192.168.1.100:60000/allfiles/hbase3/hbaselib.tar.gz
wget http://192.168.1.100:60000/allfiles/hbase3/order_items
将hbaselib.tar.gz解压到当前目录下。
view plain copy
tar -xzvf hbaselib.tar.gz
2.检查Hadoop相关进程,是否已经启动。若未启动,切换到/apps/hadoop/sbin目录下,启动Hadoop。
view plain copy
jps
cd /apps/hadoop/sbin
./start-all.sh
当Hadoop相关进程启动后,进入/apps/hbase/bin目录下,启动HBase服务。
view plain copy
cd /apps/hbase/bin/
./start-hbase.sh
最后,启动hbase shell,进入命令行模式。
view plain copy
hbase shell
3.在HBase中为某电商创建一个订单明细表,名为order_items,包含两个列族,名为ID和price,ID列族内包含‘item’和‘order’两个列,price列族内包含‘shop’和‘goods’两个列。
view plain copy
create ‘order_items’,‘ID’,‘price’
4.向order_items表中插入数据, 10001~10007为行键(rowkey)。
view plain copy
put ‘order_items’,‘10001’,‘ID:item’,‘252604’
put ‘order_items’,‘10002’,‘ID:order’,‘252607’
put ‘order_items’,‘10003’,‘ID:order’,‘252610’
put ‘order_items’,‘10004’,‘price:shop’,‘8.8’
put ‘order_items’,‘10005’,‘price:goods’,‘11’
put ‘order_items’,‘10006’,‘price:shop’,‘13’
put ‘order_items’,‘row-10007’,‘price:goods’,‘3’
插入完成后,用scan命令查看order_items内数据。
view plain copy
scan ‘order_items’
5.编写Java代码,用于创建HBase的过滤器。
新建project项目,项目名为hbase3。
在hbase3项目下新建包,包名为my.hbase。
在my.hbase包下新建类,类名为HBase。
加载项目所需的依赖包,右键项目名,新建一个目录hbase3lib,用于存放项目所需的jar包。
将linux上/data/hbase3目录下,hbaselib目录中的jar包,全部拷贝到Eclipse中hbase3项目的hbase3lib目录里。
选中hbase3项目中hbase3lib目录下所有的jar包,在jar包上单击右键,并依次点击Build Path=>Add to Build Path。
这样就将依赖包加载到项目里了。
编写程序代码如下,应用于order_items表,过滤出’price’列族,过滤出‘shop’列,过滤出值为’13‘的数据。
view plain copy
package my.hbase;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.KeyValue;
import org.apache.hadoop.hbase.client.HTable;
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.BinaryComparator;
import org.apache.hadoop.hbase.filter.CompareFilter;
import org.apache.hadoop.hbase.filter.Filter;
import org.apache.hadoop.hbase.filter.QualifierFilter;
import org.apache.hadoop.hbase.filter.FamilyFilter;
import org.apache.hadoop.hbase.filter.FilterList;
import org.apache.hadoop.hbase.filter.ValueFilter;
import org.apache.hadoop.hbase.util.Bytes;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class HBase {
public static void main(String[] args) throws IOException {
Configuration conf = HBaseConfiguration.create();
HTable table = new HTable(conf, “order_items”);
List filters = new ArrayList();
Filter famFilter = new FamilyFilter(CompareFilter.CompareOp.EQUAL,
new BinaryComparator(Bytes.toBytes(“price”)));
filters.add(famFilter);
Filter colFilter = new QualifierFilter(CompareFilter.CompareOp.EQUAL,
new BinaryComparator(Bytes.toBytes(“shop”)));
filters.add(colFilter);
Filter valFilter = new ValueFilter(CompareFilter.CompareOp.EQUAL,
new BinaryComparator(Bytes.toBytes(“13”)));
filters.add(valFilter);
FilterList fl = new FilterList( FilterList.Operator.MUST_PASS_ALL, filters);
Scan scan = new Scan();
scan.setFilter(fl);
ResultScanner scanner = table.getScanner(scan);
System.out.println("Scanning table… ");
for (Result result : scanner) {
//System.out.println(“getRow:”+Bytes.toString(result.getRow()));
for (KeyValue kv : result.raw()) {
//System.out.println("Family - "+Bytes.toString(kv.getFamily()));
//System.out.println("Qualifier - “+Bytes.toString(kv.getQualifier() ));
System.out.println(“kv:”+kv +”, Key: " + Bytes.toString(kv.getRow()) +
", Value: " +Bytes.toString(kv.getValue()));
}
}
scanner.close();
System.out.println("Completed ");
}
}
6.在HBase类文件中,右键并点击=>Run As=>Run on Hadoop选项,将任务提交到Hadoop中。
待执行完毕后,在Console界面查看实验结果如下:
结果正确,此过滤器应用于order_items表,famFilter为列族过滤器,此处过滤出’price’列族,colFilter为列过滤器,此处过滤出‘shop’列,valFilter为值过滤器,此处过滤出值为’13‘的数据。
前缀过滤器(PrefixFilter)
7.编写Java代码,创建前缀过滤器(PrefixFilter),用于筛选出前缀为row的数据。
在my.hbase包下新建类,类名为Prffilter。
程序代码:
view plain copy
package my.hbase;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.KeyValue;
import org.apache.hadoop.hbase.client.HTable;
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.PrefixFilter;
import org.apache.hadoop.hbase.filter.Filter;
import org.apache.hadoop.hbase.util.Bytes;
import java.io.IOException;
public class Prffilter {
public static void main(String[] args) throws IOException {
Configuration conf = HBaseConfiguration.create();
HTable table = new HTable(conf, “order_items”);
Filter filter = new PrefixFilter(Bytes.toBytes(“row”));
Scan scan = new Scan();
scan.setFilter(filter);
ResultScanner scanner = table.getScanner(scan);
System.out.println("Scanning table… ");
for (Result result : scanner) {
//System.out.println(“getRow:”+Bytes.toString(result.getRow()));
for (KeyValue kv : result.raw()) {
//System.out.println("Family - "+Bytes.toString(kv.getFamily()));
//System.out.println("Qualifier - “+Bytes.toString(kv.getQualifier() ));
System.out.println(“kv:”+kv +”, Key: " + Bytes.toString(kv.getRow()) +
", Value: " +Bytes.toString(kv.getValue()));
}
}
scanner.close();
System.out.println("Completed ");
}
}
8.在Prffilter类文件中,右键并点击=>Run As=>Run on Hadoop选项,将任务提交到Hadoop中。
待执行完毕后,在Console界面查看实验结果如下: