Node.js 如何将数据从SQL Server迁移到Cassandra
我有大量数据要从SQL Server传输到Cassandra。我已经开发了一些代码,使从SQL Server接收到的数据与cassandra兼容,但插入时遇到了问题。由于数据量很大,过了一段时间我发现了这个错误: 我使用nodejs来做这件事。这是我的密码: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.
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的更多信息,请参阅以下内容:
const stream=myRowStream.pipe(将RowToArrayofParameters转换为ArrayofParameters);
const result=await executeConcurrent(客户端、插入字符串、流);
限制飞行中请求的数量需要手动处理气流背压
Node.js驱动程序提供了以下实用方法:
例如:
const stream=myRowStream.pipe(将RowToArrayofParameters转换为ArrayofParameters);
const result=await executeConcurrent(客户端、插入字符串、流);