大量插入cassandra数据

时间:2013-04-04 01:34:33

标签: java cassandra hector

我想在cassandra中插入大约5000万行(每行约30列),目前只有1个节点。

我从另一个数据源查询数据并存储在表对象中。我遍历解析每一行,然后将其添加到mutator。目前我一次插入100行,100万行需要40分钟!我如何加快这个过程? (我也试过了client.batch_mutate()但是在几千次块大小的插入之后似乎已经重置了连接错误2)。

通过搜索我看到多线程可以提供帮助。但我找不到任何例子,有人可以链接我吗?谢谢!!

我目前的代码:

        List<String> colNames = new ArrayList<String>();
        List<String> colValues = new ArrayList<String>();
        SomeTable result = Query(...); // this contains my result set of 1M rows initially

        for (Iterator itr = result.getRecordIterator(); itr.hasNext();) {
                String colName =.....
                String colValue = .....

            int colCount = colNames.size(); // 100 * 30

            for (int i = 0; i < colCount; i++) {
                //add row keys and columns to mutator 
                mutator.addInsertion(String.valueOf(rowCounter), "data", HFactory.createStringColumn(colNames.get(i), colValues.get(i)));
            }
            rowCounter++;

            //insert rows of block size 100
            if (rowCounter % 100==0) { 

                mutator.execute();
                //clear data
                colNames = new ArrayList<String>();
                colValues = new ArrayList<String>();
                mutator = HFactory.createMutator(keyspace, stringSerializer);
            }

        }

1 个答案:

答案 0 :(得分:2)

多线程会有很多帮助,是的。目前,您在Cassandra中使用一个连接,这意味着您只在Cassandra中使用单个线程。您需要使用多个连接,这需要客户端中有多个线程。

一种方法是使用Java ThreadPoolExecutor并将mutator.execute()包装在runnable中并在线程池上执行它。注意处理异常。如果您以比Cassandra可以插入的更快的速度读取源,您还应该使用BlockingQueue来限制排队的突变数量。

这样,将Hector中的连接池大小设置为10,并且插入速度应该快得多。

如果您不知道,Cassandra不是为单节点操作而设计的。我假设您打算扩展和添加复制。如果没有,那么您可能会找到一种更高效,更简单的替代解决方案。使用多个节点时,多个连接和线程变得尤为重要,因此插入速率可以缩放。