Cassandra json2sstable 和 sstableloader 报告了积极的结果,但没有数据发生变化
Cassandra json2sstable and sstableloader reporting positive results, but no data change happening
我是 Cassandra 的新手 - 在一个月内,我有一个长期的 SQL 服务器背景。我的任务是删除一些 Python 以自动批量加载 sstables。输入 sstableloader。到目前为止我安装的所有东西都是为了测试。我有 1 个虚拟机,在单节点集群上安装了 Cassandra。这需要一些设置和环回 IP 地址。所以我有 127.0.0.1 和 127.0.0.2,种子设置在 127.0.0.1。我成功地启动了 Cassandra 并 运行ning,并且可以通过 Python 中的简单连接字符串从其他盒子访问它 - 所以我的大部分要求都得到了满足。我 运行 遇到问题的地方是通过 cql 以外的任何方式加载数据。我可以整天使用插入语句获取数据——我需要成功完成的是 运行 json2sstable 和 sstableloader(此时分别)。更重要的是它报告说一切都很好......而且我的数据在任何一种情况下都不会出现。以下是我重现问题的方法。
键空间、列族和文件夹:sampledb_adl、emp_new_9 /var/lib/cassandra/data/emp_new_9
Table created at cqlsh prompt: CREATE TABLE emp_new_9 (pkreq uuid, empid int, deptid int, first_name text, last_name text, PRIMARY KEY ((pkreq))) WITH
bloom_filter_fp_chance=0.010000 AND
caching='KEYS_ONLY' AND
comment='' AND
dclocal_read_repair_chance=0.100000 AND
gc_grace_seconds=864000 AND
index_interval=128 AND
read_repair_chance=0.000000 AND
replicate_on_write='true' AND
populate_io_cache_on_flush='false' AND
default_time_to_live=0 AND
speculative_retry='99.0PERCENTILE' AND
memtable_flush_period_in_ms=0 AND
compaction={'class': 'SizeTieredCompactionStrategy'} AND
compression={'sstable_compression': 'LZ4Compressor'};
通过 cqlsh 输入 table 的初始数据:INSERT INTO emp_new_9 (pkreq,empid,deptid,first_name,last_name) VALUES (uuid(),30001 ,235,'yogi','bear');
'select * from emp_new_9'的结果:
请求 |部门 |空虚 | first_name | last_name
--------------------------------------+--------+-- -----+------------+----------
9c6dd9de-f6b1-4312-9737-e9d00b8187f3 | 235 | 30001 |瑜珈 |熊
已启动 nodetool flush
此时 emp_new_9 文件夹的内容:
sampledb_adl-emp_new_9-jb-1-CompressionInfo.db sampledb_adl-emp_new_9-jb-1-Index.db sampledb_adl-emp_new_9-jb-1-TOC.txt
sampledb_adl-emp_new_9-jb-1-Data.db sampledb_adl-emp_new_9-jb-1-Statistics.db
sampledb_adl-emp_new_9-jb-1-Filter.db sampledb_adl-emp_new_9-jb-1-Summary.db
当前结果:[root@localhost emp_new_9]# sstable2json /var/lib/cassandra/data/sampledb_adl/emp_new_9/sampledb_adl-emp_new_9-jb-1-Data.db
[
{"key": "9c6dd9def6b143129737e9d00b8187f3","columns": [["","",1443108919841000], ["deptid","235",1443108919841000], ["empid","30001",1443108919841000], ["first_name","yogi",1443108919841000], ["last_name","bear",1443108919841000]]}
]
现在用不同的数据创建 emp_new_10:
键空间、列族和文件夹:sampledb_adl、emp_new_10 /var/lib/cassandra/data/emp_new_10
Table created at cqlsh prompt: CREATE TABLE emp_new_10 (pkreq uuid, empid int, deptid int, first_name text, last_name text, PRIMARY KEY ((pkreq))) WITH
bloom_filter_fp_chance=0.010000 AND
caching='KEYS_ONLY' AND
comment='' AND
dclocal_read_repair_chance=0.100000 AND
gc_grace_seconds=864000 AND
index_interval=128 AND
read_repair_chance=0.000000 AND
replicate_on_write='true' AND
populate_io_cache_on_flush='false' AND
default_time_to_live=0 AND
speculative_retry='99.0PERCENTILE' AND
memtable_flush_period_in_ms=0 AND
compaction={'class': 'SizeTieredCompactionStrategy'} AND
compression={'sstable_compression': 'LZ4Compressor'};
通过 cqlsh 输入 table 的初始数据:INSERT INTO emp_new_10 (pkreq,empid,deptid,first_name,last_name) VALUES (uuid(),30101 ,298,'scoobie','doo');
'select * from emp_new_10' 的结果:
pkreq |部门|空虚 | first_name | last_name
--------------------------------------+--------+-- -----+------------+----------
c0e1763d-8b2b-4593-9daf-af3596ed08be | 298| 30101 |史酷比 |斗
已启动 nodetool flush
此时 emp_new_10 文件夹的内容:
sampledb_adl-emp_new_10-jb-1-CompressionInfo.db sampledb_adl-emp_new_10-jb-1-Index.db sampledb_adl-emp_new_10-jb-1-TOC.txt
sampledb_adl-emp_new_10-jb-1-Data.db sampledb_adl-emp_new_10-jb-1-Statistics.db
sampledb_adl-emp_new_10-jb-1-Filter.db sampledb_adl-emp_new_10-jb-1-Summary.db
当前结果:[root@localhost emp_new_10]# sstable2json /var/lib/cassandra/data/sampledb_adl/emp_new_10/sampledb_adl-emp_new_10-jb-1-Data.db
[
{"key": "c0e1763d8b2b45939dafaf3596ed08be","columns": [["","",1443109509458000], ["deptid","298",1443109509458000], ["empid","30101",1443109509458000], ["first_name","scoobie",1443109509458000], ["last_name","doo",1443109509458000]]}
]
那么,yogi 9,scoobie 10。
现在我将首先尝试将 json2sstable 与我命名为 emp_new_10 的文件一起使用(我知道是原创的):emp_new_10.json
json2sstable -K sampledb_adl -c emp_new_9 /home/tdmcoe_admin/Desktop/emp_new_10.json /var/lib/cassandra/data/sampledb_adl/emp_new_10/sampledb_adl-emp_new_10-jb-1-Data.db
结果打印到终端 window:
ERROR 08:56:48,581 Unable to initialize MemoryMeter (jamm not specified as javaagent). This means Cassandra will be unable to measure object sizes accurately and may consequently OOM.
Importing 1 keys...
1 keys imported successfully.
我一直收到 MemoryMeter 错误并忽略,因为谷歌搜索说它不会影响结果。
SO,我的文件夹内容没有变,'select * from emp_new_9;'还是一样的单条原始记录结果。 emp_new_10 也没有改变。我的“成功导入 1 个密钥”到底发生了什么?成功在哪里?
现在是相关的 sstableloader。相同的基础 folders/data,但现在 运行ning sstableloader:
[root@localhost emp_new_10]# sstableloader -d 127.0.0.1 /var/lib/cassandra/data/sampledb_adl/emp_new_9
注意:我还 运行 上面的行与 127.0.0.2 和 127.0.0.1、127.0.0.2 以防万一,但结果相同。
结果打印到终端 window:
ERROR 09:05:07,686 Unable to initialize MemoryMeter (jamm not specified as javaagent). This means Cassandra will be unable to measure object sizes accurately and may consequently OOM.
Established connection to initial hosts
Opening sstables and calculating sections to stream
Streaming relevant part of /var/lib/cassandra/data/sampledb_adl/emp_new_9/sampledb_adl-emp_new_9-jb-1-Data.db to [/<my machine ip>]
Streaming session ID: 06a9c1a0-62d6-11e5-b85d-597b365ae56f
progress: [/<my machine ip> 1/1 (100%)] [total: 100% - 0MB/s (avg: 0MB/s)]
所以 - 100% - 耶! 0MB/s 嘘!
现在我没有接触过的emp_new_9文件夹的内容现在有了第二组文件:
sampledb_adl-emp_new_9-jb-1-CompressionInfo.db sampledb_adl-emp_new_9-jb-1-TOC.txt sampledb_adl-emp_new_9-jb-2-Statistics.db
sampledb_adl-emp_new_9-jb-1-Data.db sampledb_adl-emp_new_9-jb-2-CompressionInfo.db sampledb_adl-emp_new_9-jb-2-Summary.db
sampledb_adl-emp_new_9-jb-1-Filter.db sampledb_adl-emp_new_9-jb-2-Data.db sampledb_adl-emp_new_9-jb-2-TOC.txt
sampledb_adl-emp_new_9-jb-1-Index.db sampledb_adl-emp_new_9-jb-2-Filter.db
sampledb_adl-emp_new_9-jb-1-Statistics.db sampledb_adl-emp_new_9-jb-2-Index.db
'select * from emp_new_9;' 的结果没有改变,在两个数据文件上使用 sstable2json 也只显示 1 个旧的 yogi 条目。当我 运行 nodetool compact 时,它会返回到只有 1 条 yogi 行的 1 组文件。那么 100% 发生了什么?!?什么的 100%?
感谢任何帮助。我很困惑。
使用 json2sstable 时,您应该指定一个新的不存在的 .db 文件的名称。按照设计,SSTable 是不可变的,因此不允许通过 json2sstable 更新它们。
无论出于何种原因,该工具都不会抱怨现有的 SSTable。如果您指定一个新的 .db 文件,您会发现 SSTable 文件将按照您的预期创建。
我想通了 - 我正在使用一个带有 uuid 字段的 table,并尝试添加一个 table 用于批量加载,该字段中已经有一个 uuid,所以它是失败。使用文本列进行测试,一切正常!
我是 Cassandra 的新手 - 在一个月内,我有一个长期的 SQL 服务器背景。我的任务是删除一些 Python 以自动批量加载 sstables。输入 sstableloader。到目前为止我安装的所有东西都是为了测试。我有 1 个虚拟机,在单节点集群上安装了 Cassandra。这需要一些设置和环回 IP 地址。所以我有 127.0.0.1 和 127.0.0.2,种子设置在 127.0.0.1。我成功地启动了 Cassandra 并 运行ning,并且可以通过 Python 中的简单连接字符串从其他盒子访问它 - 所以我的大部分要求都得到了满足。我 运行 遇到问题的地方是通过 cql 以外的任何方式加载数据。我可以整天使用插入语句获取数据——我需要成功完成的是 运行 json2sstable 和 sstableloader(此时分别)。更重要的是它报告说一切都很好......而且我的数据在任何一种情况下都不会出现。以下是我重现问题的方法。
键空间、列族和文件夹:sampledb_adl、emp_new_9 /var/lib/cassandra/data/emp_new_9
Table created at cqlsh prompt: CREATE TABLE emp_new_9 (pkreq uuid, empid int, deptid int, first_name text, last_name text, PRIMARY KEY ((pkreq))) WITH
bloom_filter_fp_chance=0.010000 AND
caching='KEYS_ONLY' AND
comment='' AND
dclocal_read_repair_chance=0.100000 AND
gc_grace_seconds=864000 AND
index_interval=128 AND
read_repair_chance=0.000000 AND
replicate_on_write='true' AND
populate_io_cache_on_flush='false' AND
default_time_to_live=0 AND
speculative_retry='99.0PERCENTILE' AND
memtable_flush_period_in_ms=0 AND
compaction={'class': 'SizeTieredCompactionStrategy'} AND
compression={'sstable_compression': 'LZ4Compressor'};
通过 cqlsh 输入 table 的初始数据:INSERT INTO emp_new_9 (pkreq,empid,deptid,first_name,last_name) VALUES (uuid(),30001 ,235,'yogi','bear');
'select * from emp_new_9'的结果:
请求 |部门 |空虚 | first_name | last_name
--------------------------------------+--------+-- -----+------------+----------
9c6dd9de-f6b1-4312-9737-e9d00b8187f3 | 235 | 30001 |瑜珈 |熊
已启动 nodetool flush
此时 emp_new_9 文件夹的内容:
sampledb_adl-emp_new_9-jb-1-CompressionInfo.db sampledb_adl-emp_new_9-jb-1-Index.db sampledb_adl-emp_new_9-jb-1-TOC.txt
sampledb_adl-emp_new_9-jb-1-Data.db sampledb_adl-emp_new_9-jb-1-Statistics.db
sampledb_adl-emp_new_9-jb-1-Filter.db sampledb_adl-emp_new_9-jb-1-Summary.db
当前结果:[root@localhost emp_new_9]# sstable2json /var/lib/cassandra/data/sampledb_adl/emp_new_9/sampledb_adl-emp_new_9-jb-1-Data.db
[
{"key": "9c6dd9def6b143129737e9d00b8187f3","columns": [["","",1443108919841000], ["deptid","235",1443108919841000], ["empid","30001",1443108919841000], ["first_name","yogi",1443108919841000], ["last_name","bear",1443108919841000]]}
]
现在用不同的数据创建 emp_new_10:
键空间、列族和文件夹:sampledb_adl、emp_new_10 /var/lib/cassandra/data/emp_new_10
Table created at cqlsh prompt: CREATE TABLE emp_new_10 (pkreq uuid, empid int, deptid int, first_name text, last_name text, PRIMARY KEY ((pkreq))) WITH
bloom_filter_fp_chance=0.010000 AND
caching='KEYS_ONLY' AND
comment='' AND
dclocal_read_repair_chance=0.100000 AND
gc_grace_seconds=864000 AND
index_interval=128 AND
read_repair_chance=0.000000 AND
replicate_on_write='true' AND
populate_io_cache_on_flush='false' AND
default_time_to_live=0 AND
speculative_retry='99.0PERCENTILE' AND
memtable_flush_period_in_ms=0 AND
compaction={'class': 'SizeTieredCompactionStrategy'} AND
compression={'sstable_compression': 'LZ4Compressor'};
通过 cqlsh 输入 table 的初始数据:INSERT INTO emp_new_10 (pkreq,empid,deptid,first_name,last_name) VALUES (uuid(),30101 ,298,'scoobie','doo');
'select * from emp_new_10' 的结果:
pkreq |部门|空虚 | first_name | last_name --------------------------------------+--------+-- -----+------------+---------- c0e1763d-8b2b-4593-9daf-af3596ed08be | 298| 30101 |史酷比 |斗
已启动 nodetool flush
此时 emp_new_10 文件夹的内容:
sampledb_adl-emp_new_10-jb-1-CompressionInfo.db sampledb_adl-emp_new_10-jb-1-Index.db sampledb_adl-emp_new_10-jb-1-TOC.txt
sampledb_adl-emp_new_10-jb-1-Data.db sampledb_adl-emp_new_10-jb-1-Statistics.db
sampledb_adl-emp_new_10-jb-1-Filter.db sampledb_adl-emp_new_10-jb-1-Summary.db
当前结果:[root@localhost emp_new_10]# sstable2json /var/lib/cassandra/data/sampledb_adl/emp_new_10/sampledb_adl-emp_new_10-jb-1-Data.db
[
{"key": "c0e1763d8b2b45939dafaf3596ed08be","columns": [["","",1443109509458000], ["deptid","298",1443109509458000], ["empid","30101",1443109509458000], ["first_name","scoobie",1443109509458000], ["last_name","doo",1443109509458000]]}
]
那么,yogi 9,scoobie 10。
现在我将首先尝试将 json2sstable 与我命名为 emp_new_10 的文件一起使用(我知道是原创的):emp_new_10.json
json2sstable -K sampledb_adl -c emp_new_9 /home/tdmcoe_admin/Desktop/emp_new_10.json /var/lib/cassandra/data/sampledb_adl/emp_new_10/sampledb_adl-emp_new_10-jb-1-Data.db
结果打印到终端 window:
ERROR 08:56:48,581 Unable to initialize MemoryMeter (jamm not specified as javaagent). This means Cassandra will be unable to measure object sizes accurately and may consequently OOM.
Importing 1 keys...
1 keys imported successfully.
我一直收到 MemoryMeter 错误并忽略,因为谷歌搜索说它不会影响结果。
SO,我的文件夹内容没有变,'select * from emp_new_9;'还是一样的单条原始记录结果。 emp_new_10 也没有改变。我的“成功导入 1 个密钥”到底发生了什么?成功在哪里?
现在是相关的 sstableloader。相同的基础 folders/data,但现在 运行ning sstableloader:
[root@localhost emp_new_10]# sstableloader -d 127.0.0.1 /var/lib/cassandra/data/sampledb_adl/emp_new_9
注意:我还 运行 上面的行与 127.0.0.2 和 127.0.0.1、127.0.0.2 以防万一,但结果相同。
结果打印到终端 window:
ERROR 09:05:07,686 Unable to initialize MemoryMeter (jamm not specified as javaagent). This means Cassandra will be unable to measure object sizes accurately and may consequently OOM.
Established connection to initial hosts
Opening sstables and calculating sections to stream
Streaming relevant part of /var/lib/cassandra/data/sampledb_adl/emp_new_9/sampledb_adl-emp_new_9-jb-1-Data.db to [/<my machine ip>]
Streaming session ID: 06a9c1a0-62d6-11e5-b85d-597b365ae56f
progress: [/<my machine ip> 1/1 (100%)] [total: 100% - 0MB/s (avg: 0MB/s)]
所以 - 100% - 耶! 0MB/s 嘘!
现在我没有接触过的emp_new_9文件夹的内容现在有了第二组文件:
sampledb_adl-emp_new_9-jb-1-CompressionInfo.db sampledb_adl-emp_new_9-jb-1-TOC.txt sampledb_adl-emp_new_9-jb-2-Statistics.db
sampledb_adl-emp_new_9-jb-1-Data.db sampledb_adl-emp_new_9-jb-2-CompressionInfo.db sampledb_adl-emp_new_9-jb-2-Summary.db
sampledb_adl-emp_new_9-jb-1-Filter.db sampledb_adl-emp_new_9-jb-2-Data.db sampledb_adl-emp_new_9-jb-2-TOC.txt
sampledb_adl-emp_new_9-jb-1-Index.db sampledb_adl-emp_new_9-jb-2-Filter.db
sampledb_adl-emp_new_9-jb-1-Statistics.db sampledb_adl-emp_new_9-jb-2-Index.db
'select * from emp_new_9;' 的结果没有改变,在两个数据文件上使用 sstable2json 也只显示 1 个旧的 yogi 条目。当我 运行 nodetool compact 时,它会返回到只有 1 条 yogi 行的 1 组文件。那么 100% 发生了什么?!?什么的 100%?
感谢任何帮助。我很困惑。
使用 json2sstable 时,您应该指定一个新的不存在的 .db 文件的名称。按照设计,SSTable 是不可变的,因此不允许通过 json2sstable 更新它们。
无论出于何种原因,该工具都不会抱怨现有的 SSTable。如果您指定一个新的 .db 文件,您会发现 SSTable 文件将按照您的预期创建。
我想通了 - 我正在使用一个带有 uuid 字段的 table,并尝试添加一个 table 用于批量加载,该字段中已经有一个 uuid,所以它是失败。使用文本列进行测试,一切正常!