sstableloader工具使用及原理解析

sstableloader是cassandra提供的bulkload工具,可以将sstable文件导入到集群中。本文详细介绍其用法和实现原理。

用法

sstableloader工具在cassandra的bin目录下面,用法如下:

bin/sstableloader <options> <dir_path>

具体的选项可以参考官方文档的介绍,常见的选项有:
-d, –nodes 目标集群的nodes
-u, –username 用户名
-pw, –password 密码
-t, –throttle 限速,单位Mbits/s (默认不限制)
-cph, –connections-per-host 和每个节点建立多少连接

<dir_path>参数指定要导入的sstable文件所在的目录。需要注意的是sstableloader会把目录名作为表名,上一级目录名作为keyspace名称。例如sstableloader /whatever/path/test/t ...这个命令会把数据导入到test.t这个表里面。

sstableloader常见的使用场景包括:

  • bulkload批量写入数据
  • 跨集群数据迁移
  • 从备份的snapshot文件恢复数据

bulkload批量写入

cassandra中提供了SSTableWriter这个类来实现对sstable的写入,使用这个类用户可以不需要关心sstable的具体文件格式。需要注意的是使用这个类需要依赖cassandra-all而不是cassandra的java driver。如下代码示意了如何使用SSTableWriter在本地生成sstable文件:

        final String KS = "cql_keyspace7";final String TABLE = "table7";final String schema = "CREATE TABLE " + KS + "." + TABLE + " ("+ "  k int,"+ "  c1 int,"+ "  c2 int,"+ "  v blob,"+ "  PRIMARY KEY (k, c1, c2)"+ ")";File tempdir = Files.createTempDir();File dataDir = new File(tempdir.getAbsolutePath() + File.separator + KS + File.separator + TABLE);assert dataDir.mkdirs();CQLSSTableWriter writer = CQLSSTableWriter.builder().inDirectory(dataDir).forTable(schema).using("INSERT INTO " + KS + "." + TABLE + " (k, c1, c2, v) VALUES (?, ?, ?, textAsBlob(?))").build();writer.addRow(1, 2, 3, "abc");writer.addRow(4, 5, 6, "efg");writer.close();

生成文件之后,可以使用sstableloader将生成的文件导入到cassandra中。使用这种方式写入数据,减少了对服务器的请求量,而且写入本地文件会比向服务器写入数据要快,很适合大批量数据的离线导入。

集群间数据迁移

sstableloader也可以用来做集群间的数据迁移。具体步骤如下:
1 在目标集群创建要同步的表的schema。
2 停止源集群写入(针对停机迁移),或是开启增量数据的迁移(针对不停机迁移)。
3 在源集群的每个节点执行flush:bin/nodetool flush
4 在源集群节点上执行sstableloader将数据文件导入到目标集群中。

原理

sstableloader会首先通过java客户端与服务器建立连接,并读取meta信息。之后在storage_port通过streaming协议将sstable文件发送到各个节点上。在这个过程中,sstableloader并不是简单的把数据文件拷贝到每个节点,而是根据meta中的相关信息,给每个节点发送他所管理的那一段数据。
下面简单介绍一下cassandra中的streaming协议协议。

streaming协议

在Cassandra中,streaming协议用来在两个节点之间同步sstable中的一段数据的过程,通常用于数据修复或移动的过程。除了sstableloader以外,如下场景中也可能会有streaming的过程:

  • repair
  • bootstrap过程
  • gossip收到和本节点有关的REMOVED_TOKEN状态变化
  • nodetool里面会触发数据移动或修复的命令,例如repair,rebuild,removenode,move
    Streaming过程中两个节点的网络交互如下图所示:

这个过程大致可以分为如下四个阶段:
1 建立连接
2 streaming准备阶段
3 streaming阶段
4 完成

1 建立连接

这个阶段主要是建立连接并把连接和StreamSession关联起来。
stream的发起节点创建一个StreamSession对象,并建立两个到远端节点的连接,一个用于后续的发送消息, 一个用于接收消息。之后会通过这两个连接向远端发送StreamInit消息,通知远端节点开启一次streaming,并标明每个连接的用途。
远端收到StreamInit消息后,也会创建自己的StreamSession对象,并将收到StreamInit消息的两个连接和StreamSession关联起来。
连接建立完成后,进入准备阶段。

2 准备阶段

这个阶段主要用于协商节点之间需要传输的文件片段。
发起节点首先发送一个PrepareMessage,其中包含当前节点会向远端节点发送哪些文件或片段,以及需要对方提供哪些表的哪些range的数据。
远端节点收到请求后,会根据请求的range查找对应的sstable,然后向发起节点返回一个PrepareMessage,其中包含要发送哪些sstable的哪些片段,之后远端节点进入streaming阶段。
发起节点收到PrepareMessage后,记录要接收的sstable片段,然后进入streaming阶段。

3 streaming阶段

这个阶段就开始进行文件传输了。发送端和接收端会分别建立相应的任务。
发送端会针对要进行streaming的文件,按顺序发送FileMessage。FileMessage由消息头FileMessageHeader和文件内容的流组成。当所有文件发送完成后,StreamTransferTask标记为完成。
接收端将收到的文件内容写入sstable。当一个StreamReceiveTask中的所有文件都接收完成后,将sstable加入到ColumnFamilyStore中。
如果接收过程中发生错误,接收端会发送一个SessionFailedMessage给发送端,并关闭StreamSession。
当所有发送和接收任务都完成后,进入完成阶段。

4 完成阶段

当一个节点完成所有的发送和接收任务后,如果该节点已经收到了CompleteMessage,则会向对方发送CompleteMessage并关闭session;如果还没有收到CompleteMessage,则会向对方发送CompleteMessage并等待对方返回。


原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/517895.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是工程师文化?

作者 | 王尊&#xff0c;帷幄 Whale CTO责编 | 唐小引头图 | CSDN 下载自东方 IC出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;什么是工程师文化&#xff1f;这篇文章的契机&#xff0c;是在 Whale All Hands 上团队成员提出的问题基础上展开的。All Hands 后我在…

Linux7/Redhat7/Centos7 安装Oracle 12C_安装Oracle软件_04

文章目录一、安装准备1. 下载oracle12c2. 上传oracle12c3. 赋予权限4. vnc远程连接主机5. 解压5. 安装二、安装流程2.1. 邮箱设置2.2. 只安装数据库软件2.2. 单实例数据库安装2.3. 企业级数据库2.4. 校验依赖2.5. 依赖安装2.6. root执行脚本2.7. OK2.8. 完成安装一、安装准备 …

从校招生到核心架构师,支付宝研究员李俊奎谈如何成为一名优秀的程序员

校招进入支付宝&#xff0c;11年时间&#xff0c;从一线工程师成长为支付宝安全核心架构师&#xff0c;这个技术牛人就是李俊奎。 李俊奎一直聚焦风控平台的技术和架构发展&#xff0c;并着手搭建了中国第一家云上的商业银行——网商银行。 在2016年双11和新春红包等活动中&a…

在 Apache Spark 中利用 HyperLogLog 函数实现高级分析

在 Apache Spark 中利用 HyperLogLog 函数实现高级分析 预聚合是高性能分析中的常用技术&#xff0c;例如&#xff0c;每小时100亿条的网站访问数据可以通过对常用的查询纬度进行聚合&#xff0c;被降低到1000万条访问统计&#xff0c;这样就能降低1000倍的数据处理量&#xf…

华为智能IP网络,加速联接智能化转型

[中国&#xff0c;深圳&#xff0c;2020年5月19日]在华为第17届全球分析师大会期间&#xff0c;华为“引领智能网络&#xff0c;加速联接智能化转型”峰会隆重召开&#xff0c;会上首次阐述了智能IP网络的三大特征——“智能超宽、智能联接、智能运维”&#xff0c;并分享智能I…

Linux7/Redhat7/Centos7 安装Oracle 12C_监听配置及DBCA安装数据库_05

文章目录一、监听配置二、创建数据库一、监听配置 # 切换到oracle用户 su - oracle# 启动监听图形化页面 netca二、创建数据库 dbca

Kubernetes-native 弹性分布式深度学习系统

9月11日&#xff0c;蚂蚁金服在 Google Developer Day Shanghai 2019 上宣布开源了基于 TensorFlow 2.0 eager execution 的分布式深度学习系统 ElasticDL。基于 TensorFlow 的支持弹性调度的深度学习系统&#xff0c;据我们所知&#xff0c;ElasticDL 是第一 个。项目负责人王…

递归(特别重要,小计算用)

递归&#xff08;特别重要,小计算用&#xff09; 递归就是&#xff1a;A方法调用B方法&#xff0c;就是自己调用自己。 利用递归可以简单的程序来解决一些复杂的问题。它通常把一个大型的问题层层转化为一个与原问题相似的规模较小的问题来求解&#xff0c;递归策略只需少量的…

达摩院送你100万,请坚持“看月亮”

首批青橙奖获奖者合影 30年前&#xff0c;随便走进一间中国的小学教室&#xff0c;问其中埋头苦读的孩子&#xff0c;长大以后要做什么&#xff1f; “做个科学家&#xff01;” 梦想改变世界的小娃娃眼神透亮&#xff0c;声音也透亮。 但少有人能够真正在成年之后&#xf…

深度剖析数据库国产化迁移之路

作者 | 吴夏&#xff0c;腾讯云 TDSQL 高级工程师责编 | 唐小引头图 | CSDN 下载自东方 IC出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;随着国家有关部门近年来陆续出台相关政策指导文件&#xff0c;推动探索安全可控的金融科技产品&#xff0c;加强银行业信息安…

常用排序算法总结

概述 在计算器科学与数学中&#xff0c;一个排序算法&#xff08;英语&#xff1a;Sorting algorithm&#xff09;是一种能将一串数据依照特定排序方式进行排列的一种算法。本文将总结几类常用的排序算法&#xff0c;包括冒泡排序、选择排序、插入排序、快速排序和归并排序&…

4. java——多态(java巅峰设计,超越了C++的理解,取其精华,去其糟粕)

多态指的是同—个行为具有多个不同表现形式 。是指—个类实例(对象&#xff09;的相同方法在不同情形下具有 不同表现形式。封装和继承是多态的基础&#xff0c;也就是说&#xff0c;多态只是—种表现形式而已。一个对象&#xff0c;同一个方法不同形态&#xff0c;方法必须重…

ETL异构数据源Datax_日期增量同步_13

文章目录一、全量同步1. 增量同步SQL2. 构建reader3. 构建writer4. 字段对应关系映射5. 构建json6. 选择同步模板7. 查询最早时间8. 修改任务信息9. 添加增量参数10. 数据清理11. 执行任务12. 查看执行日期13. 数据验证15. 查看同步脚本二、基于日期增量同步2.1. 新增新数据2.2…

如何使用 SQL Server FILESTREAM 存储非结构化数据?这篇文章告诉你!

作者 | ALEN İBRI译者 | 火火酱&#xff0c;责编 | Carol封图 | CSDN 付费下载于视觉中国 在本文中&#xff0c;我将解释如何使用SQL Server FILESTREAM来存储非结构化数据。同时&#xff0c;还会介绍FILESTREAM的优缺点。 在SQL Server的早期版本中&#xff0c;非结构化数据的…

Apache Flink 进阶入门(二):Time 深度解析

前言 Flink 的 API 大体上可以划分为三个层次&#xff1a;处于最底层的 ProcessFunction、中间一层的 DataStream API 和最上层的 SQL/Table API&#xff0c;这三层中的每一层都非常依赖于时间属性。时间属性是流处理中最重要的一个方面&#xff0c;是流处理系统的基石之一&am…

月活用户达7.55亿,阿里淘系如何在后流量时代引爆用户增长?

2019 年 8 月&#xff0c;阿里巴巴集团公布截至 2019 年 6 月 30 日止季度业绩。 财报显示&#xff0c;本季度阿里巴巴集团收入为 1149.24 亿元人民币&#xff0c;同比增长 42%。其中&#xff0c;淘宝、天猫在内的中国零售平台移动月活跃用户达 7.55 亿&#xff0c;较上一季度…

数组,三种初始化和内存分析

数组&#xff0c;三种初始化和内存分析 Java内存分析&#xff1a; 堆&#xff1a;存放new的对象和数组 ​ 可以被所有的线程共享&#xff0c;不会存放别的对象引用 栈&#xff1a;存放基本变量类型&#xff08;会包含这个基本类型的具体数值&#xff09; ​ 引用对象的变量&a…

Arthas 3.1.2 版本发布 | 增加 logger/heapdump/vmoption 命令

最近偶尔有用户反馈某些 HTTP 接口出现超时问题&#xff0c;而 web 服务端的 Trace 监控没有出现 http 返回值为 503 等异常情况。出现这种情况一般是web容器出现问题&#xff0c;客户端连 Arthas是Alibaba开源的Java诊断工具&#xff0c;深受开发者喜爱。 Github&#xff1a;h…

Linux 便笺技巧专栏

文章目录一、 vi 专栏二、固定ip设置2.1. 自动获取改为静态2.2. IDADDR获取2.3. GATEWAY获取2.4. 重新网卡2.5. 重新连接三、主机名调整3.1. 临时有效主机名3.2. 永久有效主机名四、防火墙调整4.1. 临时关闭防火墙4.2. 开机不启动防火墙五、shell脚本5.1. shell格式5.2. shell执…