Hbase Batch 方式批量查询结果

Hbase多种方式查询结果

采用不同的方式查询Hbase里的内容

命令方式

scan方式

scan 't1', {COLUMNS=>'cf',VERSIONS=>20,TIMESTAMP=>1566300936}
scan 't1' ,FILTER=>"ValueFilter(=,'binary:2014-01-30')" //过滤出等于此的值

get方式

get 't1', 'rowkey_name', {COLUMNS=>'cf',VERSIONS=>2147483647}
get 't1','rowkey_name',{COLUMN=>'cf',VERSIONS=>20,TIMERANGE=>[1566300936,1566300988],FORMATTER => 'toString'} //时间戳范围及输出类型

scan方式是遍历全表的,所以会相对get方式慢

调用API get方式


import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
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.TableName;
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.Result;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.util.Bytes;


public class Query {
	public static Configuration conf = null;
	public static Connection connection = null;
	public static Admin admin = null;
	static Table table = null;
	static {
		conf = new Configuration();
		try {
			conf.addResource(new File("hbase-site.xml").toURI().toURL());
		} catch (MalformedURLException e1) {
			e1.printStackTrace();
		}
		try {
			connection = ConnectionFactory.createConnection(conf);
			admin = connection.getAdmin();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	 public static void queryTable(List<String> rowkeyList) throws IOException {
	        String tableName = "table_name";
	        table = connection.getTable(TableName.valueOf(tableName));// 获取表

	        for (String rowkey : rowkeyList){
	        	Get get = new Get(Bytes.toBytes(rowkey));
				get.setMaxVersions(20);
	            Result result = table.get(get);
	            for (Cell kv : result.rawCells()) {
					String[] s = new String[] {Bytes.toString(kv.getRow()),String.valueOf(kv.getTimestamp()),Bytes.toString(kv.getFamily()),Bytes.toString(kv.getQualifier()),Bytes.toString(kv.getValue())};
	            	System.out.println(s);
	            }
	        }
	    }
	public static void main(String[] args) throws IOException {
		List<String> rowkeyList = new ArrayList<>();
		rowkeyList.add("0000001");
		rowkeyList.add("0000002");
		rowkeyList.add("0000003");
		queryTable(rowkeyList);
	}

}

Batch 方式查询

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.net.MalformedURLException;
import java.nio.charset.Charset;
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.TableName;
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.Result;
import org.apache.hadoop.hbase.client.Row;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.util.Bytes;

public class BatchTest {
	static List<String> uids;
	public static Configuration conf = null;
	public static Connection connection = null;
	public static Admin admin = null;
	static {
		conf = new Configuration();
		try {
			conf.addResource(new File("hbase-site.xml").toURI().toURL());
		} catch (MalformedURLException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		try {
			connection = ConnectionFactory.createConnection(conf);
			admin = connection.getAdmin();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	static Table table = null;
	public static void queryBatchTable(List<String> rowkeyList) throws IOException {
        String tableName = "table_name";
		int num0=0;
		int num1=0;
		int num2=0;
		long start = System.currentTimeMillis();
		int len = rowkeyList.size(); 
		//声明一个数组来保存所有的操作
        List<Row> batch = new ArrayList<Row>();
        table = connection.getTable(TableName.valueOf(tableName));// 获取表
        for(String uid:rowkeyList) {
	       	Get get = new Get(Bytes.toBytes(uid));
			get.setMaxVersions(20);
	        batch.add(get);
        }
        Object[] results = new Object[batch.size()];
        try {
            table.batch(batch, results);
        } catch (Exception e) {
            System.err.println("Error: " + e);
        }
        for (int i = 0; i < results.length; i++) {
        	Result result = (Result) results[i];
        	 for (Cell kv : result.rawCells()) {
					String[] s = new String[] {Bytes.toString(kv.getRow()),String.valueOf(kv.getTimestamp()),Bytes.toString(kv.getFamily()),Bytes.toString(kv.getQualifier()),Bytes.toString(kv.getValue())};
	            	System.out.println(s);
	            }   
        }
        table.close();
        connection.close();
    }
	public static void main(String[] args) throws IOException {
		List<String> rowkeyList = new ArrayList<>();
		rowkeyList.add("0000001");
		rowkeyList.add("0000002");
		rowkeyList.add("0000003");
		queryBatchTable(rowkeyList);
	}
}

这两种方式为单条查询和批量查询,总体上batch方式查询较快,查询100条记录时,我的数据差了3s。虽然这是batch方式肉眼可见的优势,但是当我查询1w条记录时,batch的程序在运行中把RegionServers搞死掉嘞,get方式效率虽低,但不会出现这种情况。还在解决batch所造成的问题。

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于HBase批量写入性能优化,可以考虑以下几点: 1. 批量写入操作:使用HBase批量写入操作可以显著提高性能。可以使用HBase提供的`Table#batch()`方法,将多个写入操作放在一个批次中一起提交。这样可以减少网络通信开销和减少多次写入操作的开销。 2. 数据缓冲:在进行批量写入时,可以使用缓冲区来存储数据。将多个写入操作先存储在缓冲区中,然后一次性提交到HBase。这样可以减少磁盘IO和网络开销。可以使用HBase提供的`BufferedMutator`来实现数据缓冲。 3. 批量操作参数调优:在进行批量写入时,可以调整一些参数来优化性能。例如,可以调整批次大小、写入缓冲区大小和最大重试次数等。通过合理调整这些参数,可以提高写入性能。 4. 预分区和预分配Region:在设计HBase表时,可以进行预分区和预分配Region。将数据均匀分布在多个Region中,可以提高写入性能和负载均衡。 5. 数据模型优化:合理设计数据模型也可以提高写入性能。例如,避免频繁更新同一行数据、按照时间戳递增的方式将数据写入等。 6. 硬件优化:合理规划硬件资源也是提高写入性能的重要因素。例如,使用高性能的硬盘、增加HBase集群的节点数、调整网络带宽等。 以上是一些常见的HBase批量写入性能优化的方法,根据具体的场景和需求,可以选择适合的方法进行优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值