分享

从hbase中读取大量数据的问题

k9009147217 发表于 2016-10-27 11:15:36 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 4 9135
使用java api随机读取数据,单线程读取1000个rowkey的值需要10秒,如果多线程读取也需要好长时间,假设有10个线程每个线程get1000个rowkey就会出现hbase卡死的现象,这个应该怎么优化啊,

已有(4)人评论

跳转到指定楼层
k9009147217 发表于 2016-10-27 11:18:39
本帖最后由 k9009147217 于 2016-10-27 11:27 编辑

这个是多线程创建部分:
final int maxRowKeySize = 100;
            System.out.println(i+"i"+"="+thread.getId());
            int loopSize = rsList.size() % maxRowKeySize == 0 ? rsList.size()
                / maxRowKeySize : rsList.size() / maxRowKeySize + 1;
            System.out.println(i+"i2"+"="+thread.getId()+"="+loopSize);
            ExecutorService executors = Executors.newFixedThreadPool(loopSize);
            CountDownLatch countDownLatch = new CountDownLatch(loopSize);
            for (int loop = 0; loop < loopSize; loop++) {
                    int end = (loop + 1) * maxRowKeySize > rsList.size() ? rsList
                        .size() : (loop + 1) * maxRowKeySize;
                executors.execute(new GetHbaseData(rsList.subList(loop * maxRowKeySize,end),
                                countDownLatch,col));
            }
            
            System.out.println("loopSize="+loopSize);
            countDownLatch.await();
            executors.shutdown();
        }

这个是每个线程获取对应的value:
static class GetHbaseData implements Runnable {
        private CountDownLatch countDownLatch;
        private List<String> list;
        private String name;

        public GetHbaseData(List<String> strList,
                        CountDownLatch countDownLatch,String Name) {
            this.list = strList;
            this.countDownLatch = countDownLatch;
            this.name = Name;
        }

        @Override
        public void run() {
            try {
                     ArrayList<Get> gets = new ArrayList<Get>();
                for(int i=0;i<list.size();i++)
                {
                        if(!list.get(i).isEmpty())
                        {
                                Get get = new Get(Bytes.toBytes(list.get(i)));
                                get.addFamily(Bytes.toBytes("cf1"));
                                get.addColumn(Bytes.toBytes("cf1"),
                                                Bytes.toBytes(name));
                                gets.add(get);
                        }
                }
                String rs = " ";
                Result[] results = connection.getTable(TableName.valueOf("HData"))
                                .get(gets);
                System.out.println(i+"i2");
                for(int i=0;i<results.length;i++)
                {
                    String str ="NULL";
                    String str1 ="NULL";
                        Result res = results;
                        Cell[] cells = res.rawCells();
                    if(cells.length > 0)
                            str = new String(CellUtil.cloneValue(cells[0]));
                    str1 = new String(str.getBytes("gbk"), "utf-8");
                    //System.out.println(str1);
                    rs += list.get(i)+":"+str1+"&";
                  //  rsList.add(str1);
                }
使用打印定位到实在get(gets)这个地方读取数据很慢
回复

使用道具 举报

einhep 发表于 2016-10-27 13:54:15
k9009147217 发表于 2016-10-27 11:18
这个是多线程创建部分:
final int maxRowKeySize = 100;
            System.out.println(i+"i"+"="+thr ...

      Result[] results = connection.getTable(TableName.valueOf("HData"))
                                .get(gets);

这是得到表所有数据?还是什么?

回复

使用道具 举报

k9009147217 发表于 2016-10-27 14:32:08
本帖最后由 k9009147217 于 2016-10-27 14:33 编辑
einhep 发表于 2016-10-27 13:54
Result[] results = connection.getTable(TableName.valueOf("HData"))
                         ...

是的 是从hbase中获得的数据,根据rowkey读取的数据,这个rowkey是随机的
回复

使用道具 举报

einhep 发表于 2016-10-27 15:21:58
k9009147217 发表于 2016-10-27 14:32
是的 是从hbase中获得的数据,根据rowkey读取的数据,这个rowkey是随机的

程序来看,没有什么好优化的【个人观点】
可以调优下jvm或则增大下内存
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条