卡桑德拉大表迁移瓶颈

时间:2015-12-02 10:42:33

标签: scala apache-spark cassandra data-migration datastax-enterprise

我正在尝试将cassandra中的大表迁移到新的空表(使用不同的主键),在相同的键空间和集群中,使用spark 1.2.1:

val rdd_table_a = sc.cassandraTable("keyspace", "table_a").filter(row => row.getLong("a") >= start_a && row.getLong("a") <= end_a)

    rdd_table_a.map(row => { 
        val a = row.getLong("a")
        val b = row.getLong("b")
        val c = row.getString("c")
        val d = row.getString("d")
        val new_a = generateSomeNewValue(a)
        connector.withSessionDo(session => {
            val statement = session.prepare(s"INSERT INTO keyspace.table_b (new_a, c, b, a, d) " + "values (?, ?, ?, ?, ?)")
            val bound = statement.bind(new_a, c, b, a, d)
            session.executeAsync(bound)
        })
    }).foreach(x => x.getUninterruptibly())

该表有超过1B行,即使我尝试处理它的一小部分 - 它需要超过7小时。 我在文档中搜索并没有找到 - 在每个循环迭代中打开connector.withSessionDo的另一个会话吗?

上面的代码段中有什么瓶颈

1 个答案:

答案 0 :(得分:1)

$options = [ // ... 'foreignKey' => 'source_table_id', 'targetForeignKey' => 'target_table_id', // ... ]; 使用当前与Cassandra的共享连接执行自定义CQL查询:

  

允许以安全的方式使用Cassandra conn.withSessionDo,而不会忘记关闭它。通过此方法获取的Session对象是与群集关联的共享单Session的代理。

     

在内部,共享底层Session将在所有代理关闭后不久关闭。

您可以使用Session方法重写代码,这是更典型的方法。

至于我使用Spark + Cassandra的个人经验,此类查询的最慢点是Cassandra本身:大型表的数据扫描速度非常慢(与Parquet相比)。