Node.js 如何将数据从SQL Server迁移到Cassandra

Node.js 如何将数据从SQL Server迁移到Cassandra,node.js,cassandra,nosql,database-migration,Node.js,Cassandra,Nosql,Database Migration,我有大量数据要从SQL Server传输到Cassandra。我已经开发了一些代码,使从SQL Server接收到的数据与cassandra兼容,但插入时遇到了问题。由于数据量很大,过了一段时间我发现了这个错误: 我使用nodejs来做这件事。这是我的密码: request.on('row', async function (columns) { columns.forEach(async function (column) { if (column.metadata.

我有大量数据要从SQL Server传输到Cassandra。我已经开发了一些代码,使从SQL Server接收到的数据与cassandra兼容,但插入时遇到了问题。由于数据量很大,过了一段时间我发现了这个错误:

我使用nodejs来做这件事。这是我的密码:

request.on('row', async function (columns) {
    columns.forEach(async function (column) {
        if (column.metadata.colName.toLowerCase() == sqlTimestampCol.toLowerCase()) {
            data.timestamp = column.value;
            data.partitionName = partition_utils.getPartitionNameByDate(column.value);
        } else {
            dataMap[column.metadata.colName] = column.value;
        }
        if (column.value === null) {
            console.log('NULL');
        } else {
            result += column.value + " ";
        }
    });
    data.dataMap = dataMap;

    // INSERT CASSANDRA
    var insertString =
        `INSERT INTO ${cassandraKeyspace}.${cassandraTableName}(${cassandraDateColumn}, month_year_index, dataMap) VALUES (?,?,?)`;

    await cassandraConnection.client.execute(insertString, insertParams, { prepare: true })
        .then(async function () {
            console.log(`Inserted data for ${cassandraTableName} successfully`);
        })
        .catch(async function (error) {
            cassandraConnection.client.shutdown();
            logger.error(error);
        });

    result = "";
    data = {}
});

request.on('doneInProc', function (rowCount, more) {
    console.log(rowCount + ' rows returned');
    cassandraConnection.client.shutdown();
});
connection.execSql(request);
我使用的是npm枯燥乏味的cassandra驱动程序。我做了一个简单的
select*fromtable
,并对表中的每一行运行上面的代码(在request.on('row')),但它对我不起作用。有没有合适的方法


据我所知,我收到的错误是因为我插入数据的速度比cassandra处理数据的速度快。此外,只有当SQL查询结束时,新数据才会实际插入cassandra。

代码的问题在于,您的一个客户端在同一个连接上发送数千个查询。并不是说Cassandra不能处理请求,而是客户机和集群之间的单一连接是一个瓶颈

在您的设置中,每个连接只能处理2048个并发请求。一旦达到此限制,您的应用程序将无法再发送任何请求

为了获得最大吞吐量,您需要水平扩展,以便有多个应用程序实例来发送所有查询。例如,如果您有6个应用程序实例,那么您可以向您的Cassandra集群发送6 x 2048个并发请求

作为补充说明,如果这是将数据一次性迁移到Cassandra,那么我建议将数据导出为CSV格式并使用(DSBulk)。这是一个完全开源的免费实用程序,允许您向ApacheCassandra集群、DSE集群或数据库加载/卸载数据

有关DSBulk的更多信息,请参阅以下内容:


代码的问题在于,一个客户端在同一个连接上发送数千个查询。并不是说Cassandra不能处理请求,而是客户机和集群之间的单一连接是一个瓶颈

在您的设置中,每个连接只能处理2048个并发请求。一旦达到此限制,您的应用程序将无法再发送任何请求

为了获得最大吞吐量,您需要水平扩展,以便有多个应用程序实例来发送所有查询。例如,如果您有6个应用程序实例,那么您可以向您的Cassandra集群发送6 x 2048个并发请求

作为补充说明,如果这是将数据一次性迁移到Cassandra,那么我建议将数据导出为CSV格式并使用(DSBulk)。这是一个完全开源的免费实用程序,允许您向ApacheCassandra集群、DSE集群或数据库加载/卸载数据

有关DSBulk的更多信息,请参阅以下内容:


限制飞行中请求的数量需要手动处理气流背压

Node.js驱动程序提供了以下实用方法:

例如:

const stream=myRowStream.pipe(将RowToArrayofParameters转换为ArrayofParameters);
const result=await executeConcurrent(客户端、插入字符串、流);

限制飞行中请求的数量需要手动处理气流背压

Node.js驱动程序提供了以下实用方法:

例如:

const stream=myRowStream.pipe(将RowToArrayofParameters转换为ArrayofParameters);
const result=await executeConcurrent(客户端、插入字符串、流);