벌크 로딩
벌크 로딩 (Bulk Loading)
Apache Cassandra 데이터의 벌크 로딩은 다양한 도구로 지원됩니다. 벌크 로드할 데이터는 SSTable 형태여야 합니다. Cassandra는 CSV, JSON, XML 같은 다른 형식의 데이터를 직접 로드하는 것을 지원하지 않습니다. cqlsh COPY 명령으로 CSV 데이터를 로드할 수 있지만, 많은 양의 데이터에는 좋은 옵션이 아니에요. 벌크 로딩은 다음에 사용됩니다:
- 증분 백업과 스냅샷 복원. 백업과 스냅샷은 이미 SSTable 형태입니다.
- 기존 SSTable을 다른 클러스터에 로드. 데이터는 다른 수의 노드나 복제 전략을 가질 수 있어요.
- 외부 데이터를 클러스터에 로드.
출처: 문서
본문
벌크 로딩 도구 (Tools for Bulk Loading)
Cassandra는 벌크 로딩을 위한 두 가지 명령 또는 도구를 제공합니다:
- Cassandra Bulk loader, 일명 sstableloader
- nodetool import 명령
Cassandra 설치의 bin 디렉터리가 PATH 환경 변수에 있으면 sstableloader와 nodetool import에 접근할 수 있어요. 또는 bin 디렉터리에서 직접 접근할 수 있습니다. 예제는 Backups에서 만든 키스페이스와 테이블을 사용합니다.
sstableloader 사용
sstableloader는 벌크 업로드의 주요 도구입니다. sstableloader는 SSTable 데이터 파일을 실행 중인 클러스터에 스트리밍하며, 복제 전략과 복제 계수를 따릅니다. 데이터를 업로드할 테이블이 비어 있을 필요는 없습니다.
sstableloader를 실행하는 유일한 요구 사항은:
- 링 정보를 얻기 위해 연결할 초기 호스트 하나 이상(쉼표로 구분)
- 로드할 SSTable의 디렉터리 경로
sstableloader [options] <dir_path>
sstableloader는 <dir_path> 디렉터리에서 발견된 SSTable을 구성된 클러스터에 벌크 로드합니다. <dir_path>는 대상 키스페이스/테이블 이름으로 사용됩니다. 예를 들어 Standard1-g-1-Data.db라는 SSTable을 Keyspace1/Standard1에 로드하려면 /path/to/Keyspace1/Standard1/ 디렉터리에 Standard1-g-1-Data.db와 Standard1-g-1-Index.db 파일이 있어야 합니다.
대상 키스페이스 이름을 받는 sstableloader 옵션
백업 전략의 일부로 일부 Cassandra DBA가 전체 데이터 디렉터리를 저장하는 경우가 많습니다. 데이터에서 손상이 발견되면, 같은 클러스터(대형 클러스터는 200개 노드)의 데이터를 복원하지만 다른 키스페이스 이름으로 복원하는 것이 흔해요.
현재 sstableloader는 폴더 구조에서 키스페이스 이름을 유도합니다. 선택적으로 sstableloader의 일부로 대상 키스페이스 이름을 지정하기 위해 버전 4.0은 --target-keyspace 옵션 지원을 추가합니다(CASSANDRA-13884).
아래 옵션이 지원되며 -d, --nodes <initial hosts>가 필수입니다:
-alg,--ssl-alg <ALGORITHM> Client SSL: algorithm
-ap,--auth-provider <auth provider> Custom
AuthProvider class name for
cassandra authentication
-ciphers,--ssl-ciphers <CIPHER-SUITES> Client SSL:
comma-separated list of
encryption suites to use
-cph,--connections-per-host <connectionsPerHost> Number of
concurrent connections-per-host.
-d,--nodes <initial hosts> Required.
Try to connect to these hosts (comma separated) initially for ring information
--entire-sstable-throttle-mib <throttle-mib> Entire SSTable throttle
speed in MiB/s (default 0 for unlimited).
--entire-sstable-inter-dc-throttle-mib <inter-dc-throttle-mib>
Entire SSTable inter-datacenter throttle
speed in MiB/s (default 0 for unlimited).
-f,--conf-path <path to config file> cassandra.yaml file path for streaming throughput and client/server SSL.
-h,--help Display this help message
-i,--ignore <NODES> Don't stream to this (comma separated) list of nodes
-idct,--inter-dc-throttle <inter-dc-throttle> (deprecated) Inter-datacenter throttle speed in Mbits (default 0 for unlimited).
Use --inter-dc-throttle-mib instead.
--inter-dc-throttle-mib <inter-dc-throttle-mib> Inter-datacenter throttle speed in MiB/s (default 0 for unlimited)
-k,--target-keyspace <target keyspace name> Target
keyspace name
-ks,--keystore <KEYSTORE> Client SSL:
full path to keystore
-kspw,--keystore-password <KEYSTORE-PASSWORD> Client SSL:
password of the keystore
--no-progress Don't
display progress
-p,--port <native transport port> Port used
for native connection (default 9042)
-prtcl,--ssl-protocol <PROTOCOL> Client SSL:
connections protocol to use (default: TLS)
-pw,--password <password> Password for
cassandra authentication
-sp,--storage-port <storage port> Port used
for internode communication (default 7000)
-spd,--server-port-discovery <allow server port discovery> Use ports
published by server to decide how to connect. With SSL requires StartTLS
to be used.
-ssp,--ssl-storage-port <ssl storage port> Port used
for TLS internode communication (default 7001)
-st,--store-type <STORE-TYPE> Client SSL:
type of store
-t,--throttle <throttle> (deprecated) Throttle speed in Mbits (default 0 for unlimited).
Use --throttle-mib instead.
--throttle-mib <throttle-mib> Throttle
speed in MiB/s (default 0 for unlimited)
-ts,--truststore <TRUSTSTORE> Client SSL:
full path to truststore
-tspw,--truststore-password <TRUSTSTORE-PASSWORD> Client SSL:
Password of the truststore
-u,--username <username> Username for
cassandra authentication
-v,--verbose verbose
output
cassandra.yaml 파일은 스트리밍 처리량, 클라이언트 및 서버 암호화 옵션을 설정하기 위해 -f 옵션으로 명령줄에 제공될 수 있습니다. cassandra.yaml 파일에서 stream_throughput_outbound_megabits_per_sec, server_encryption_options, client_encryption_options만 읽힙니다. cassandra.yaml에서 읽은 옵션을 해당 명령줄 옵션으로 재정의할 수 있어요.
sstableloader 데모
예제는 sstableloader로 catalogkeyspace.magazine 테이블의 증분 백업 데이터를 업로드하는 방법을 보여줍니다. 또한 같은 테이블의 스냅샷을 만들어 sstableloader로 벌크 업로드합니다.
catalogkeyspace.magazine 테이블의 백업과 스냅샷은 다음과 같이 나열됩니다:
$ cd ./cassandra/data/data/catalogkeyspace/magazine-446eae30c22a11e9b1350d927649052c && ls -l
결과:
total 0
drwxrwxr-x. 2 ec2-user ec2-user 226 Aug 19 02:38 backups
drwxrwxr-x. 4 ec2-user ec2-user 40 Aug 19 02:45 snapshots
sstableloader로 업로드할 SSTable의 디렉터리 경로 구조는 대상 키스페이스/테이블로 사용됩니다. 디렉터리 구조가 sstableloader가 사용하는 형식이면 backups와 snapshots 디렉터리에서 각각 직접 업로드할 수 있어요. 하지만 SSTable의 backups와 snapshots 디렉터리 경로는 각각 /catalogkeyspace/magazine-446eae30c22a11e9b1350d927649052c/backups와 /catalogkeyspace/magazine-446eae30c22a11e9b1350d927649052c/snapshots이며, catalogkeyspace.magazine 테이블에 SSTable을 업로드하는 데 사용할 수 없습니다. sstableloader를 사용하려면 디렉터리 경로 구조가 /catalogkeyspace/magazine/이어야 합니다. /catalogkeyspace/magazine에 위치한 sstableloader로 SSTable을 업로드하기 위한 새 디렉터리 구조를 만들고 적절한 권한을 설정하세요.
$ sudo mkdir -p /catalogkeyspace/magazine
$ sudo chmod -R 777 /catalogkeyspace/magazine
증분 백업에서 벌크 로딩
증분 백업은 테이블의 DDL을 포함하지 않습니다. 테이블이 이미 존재해야 해요. 테이블이 삭제되었다면 테이블의 각 스냅샷과 함께 생성된 schema.cql 파일로 만들 수 있습니다. sstableloader로 SSTable을 magazine 테이블에 로드하기 전에 테이블이 존재해야 합니다. 테이블이 비어 있을 필요는 없지만 CQL 쿼리가 나타내듯 빈 테이블을 사용했습니다:
SELECT * FROM magazine;
결과:
id | name | publisher
----+------+-----------
(0 rows)
업로드할 테이블을 만든 뒤 백업 디렉터리에서 /catalogkeyspace/magazine/ 디렉터리로 SSTable 파일을 복사하세요.
$ sudo cp ./cassandra/data/data/catalogkeyspace/magazine-446eae30c22a11e9b1350d927649052c/backups/* \
/catalogkeyspace/magazine/
/catalogkeyspace/magazine/ 디렉터리에서 SSTable을 업로드하기 위해 sstableloader를 실행합니다.
$ sstableloader --nodes 10.0.2.238 /catalogkeyspace/magazine/
sstableloader 명령의 출력은 이 목록과 유사해야 합니다:
$ sstableloader --nodes 10.0.2.238 /catalogkeyspace/magazine/
결과:
Opening SSTables and calculating sections to stream
Streaming relevant part of /catalogkeyspace/magazine/na-1-big-Data.db
/catalogkeyspace/magazine/na-2-big-Data.db to [35.173.233.153:7000, 10.0.2.238:7000,
54.158.45.75:7000]
progress: [35.173.233.153:7000]0:1/2 88 % total: 88% 0.018KiB/s (avg: 0.018KiB/s)
progress: [35.173.233.153:7000]0:2/2 176% total: 176% 33.807KiB/s (avg: 0.036KiB/s)
progress: [35.173.233.153:7000]0:2/2 176% total: 176% 0.000KiB/s (avg: 0.029KiB/s)
progress: [35.173.233.153:7000]0:2/2 176% [10.0.2.238:7000]0:1/2 39 % total: 81% 0.115KiB/s
(avg: 0.024KiB/s)
progress: [35.173.233.153:7000]0:2/2 176% [10.0.2.238:7000]0:2/2 78 % total: 108%
97.683KiB/s (avg: 0.033KiB/s)
progress: [35.173.233.153:7000]0:2/2 176% [10.0.2.238:7000]0:2/2 78 %
[54.158.45.75:7000]0:1/2 39 % total: 80% 0.233KiB/s (avg: 0.040KiB/s)
progress: [35.173.233.153:7000]0:2/2 176% [10.0.2.238:7000]0:2/2 78 %
[54.158.45.75:7000]0:2/2 78 % total: 96% 88.522KiB/s (avg: 0.049KiB/s)
progress: [35.173.233.153:7000]0:2/2 176% [10.0.2.238:7000]0:2/2 78 %
[54.158.45.75:7000]0:2/2 78 % total: 96% 0.000KiB/s (avg: 0.045KiB/s)
progress: [35.173.233.153:7000]0:2/2 176% [10.0.2.238:7000]0:2/2 78 %
[54.158.45.75:7000]0:2/2 78 % total: 96% 0.000KiB/s (avg: 0.044KiB/s)
sstableloader가 데이터 로딩을 마친 후 magazine 테이블을 쿼리해 확인하세요:
SELECT * FROM magazine;
결과:
id | name | publisher
----+---------------------------+------------------
1 | Couchbase Magazine | Couchbase
0 | Apache Cassandra Magazine | Apache Cassandra
(2 rows)
스냅샷에서 벌크 로딩
테이블의 스냅샷을 같은 테이블로 복원하는 것은 쉽게 이루어집니다:
catalogkeyspace.magazine에 SSTable을 로드하는 데 필요한 디렉터리 구조가 존재하지 않으면 디렉터리를 만들고 적절한 권한을 설정하세요:
$ sudo mkdir -p /catalogkeyspace/magazine
$ sudo chmod -R 777 /catalogkeyspace/magazine
스냅샷 파일이 간섭 없이 복사될 수 있도록 디렉터리에서 파일을 제거하세요:
$ sudo rm /catalogkeyspace/magazine/*
$ cd /catalogkeyspace/magazine/
$ ls -l
결과:
total 0
스냅샷 파일을 /catalogkeyspace/magazine 디렉터리로 복사합니다.
$ sudo cp ./cassandra/data/data/catalogkeyspace/magazine-446eae30c22a11e9b1350d927649052c/snapshots/magazine/* \
/catalogkeyspace/magazine
/catalogkeyspace/magazine 디렉터리의 파일을 나열합니다. schema.cql도 나열될 것입니다.
$ cd /catalogkeyspace/magazine && ls -l
결과:
total 44
-rw-r--r--. 1 root root 31 Aug 19 04:13 manifest.json
-rw-r--r--. 1 root root 47 Aug 19 04:13 na-1-big-CompressionInfo.db
-rw-r--r--. 1 root root 97 Aug 19 04:13 na-1-big-Data.db
-rw-r--r--. 1 root root 10 Aug 19 04:13 na-1-big-Digest.crc32
-rw-r--r--. 1 root root 16 Aug 19 04:13 na-1-big-Filter.db
-rw-r--r--. 1 root root 16 Aug 19 04:13 na-1-big-Index.db
-rw-r--r--. 1 root root 4687 Aug 19 04:13 na-1-big-Statistics.db
-rw-r--r--. 1 root root 56 Aug 19 04:13 na-1-big-Summary.db
-rw-r--r--. 1 root root 92 Aug 19 04:13 na-1-big-TOC.txt
-rw-r--r--. 1 root root 815 Aug 19 04:13 schema.cql
데이터를 복사하는 대신 스냅샷 폴더에 대한 심볼릭 링크를 만드는 대안도 있습니다:
$ mkdir <keyspace_name>
$ ln -s <path_to_snapshot_folder> <keyspace_name>/<table_name>
magazine 테이블이 삭제되었다면 schema.cql의 DDL을 실행해 테이블을 만드세요. 다음 명령으로 sstableloader를 실행합니다:
$ sstableloader --nodes 10.0.2.238 /catalogkeyspace/magazine/
명령의 출력이 나타내듯 SSTable이 클러스터로 스트리밍됩니다:
Established connection to initial hosts
Opening SSTables and calculating sections to stream
Streaming relevant part of /catalogkeyspace/magazine/na-1-big-Data.db to
[35.173.233.153:7000, 10.0.2.238:7000, 54.158.45.75:7000]
progress: [35.173.233.153:7000]0:1/1 176% total: 176% 0.017KiB/s (avg: 0.017KiB/s)
progress: [35.173.233.153:7000]0:1/1 176% total: 176% 0.000KiB/s (avg: 0.014KiB/s)
progress: [35.173.233.153:7000]0:1/1 176% [10.0.2.238:7000]0:1/1 78 % total: 108% 0.115KiB/s
(avg: 0.017KiB/s)
progress: [35.173.233.153:7000]0:1/1 176% [10.0.2.238:7000]0:1/1 78 %
[54.158.45.75:7000]0:1/1 78 % total: 96% 0.232KiB/s (avg: 0.024KiB/s)
progress: [35.173.233.153:7000]0:1/1 176% [10.0.2.238:7000]0:1/1 78 %
[54.158.45.75:7000]0:1/1 78 % total: 96% 0.000KiB/s (avg: 0.022KiB/s)
progress: [35.173.233.153:7000]0:1/1 176% [10.0.2.238:7000]0:1/1 78 %
[54.158.45.75:7000]0:1/1 78 % total: 96% 0.000KiB/s (avg: 0.021KiB/s)
고려해야 할 sstableloader의 몇 가지 다른 요구 사항:
- 로드되는 SSTable은 로드되는 Cassandra 버전과 호환되어야 합니다.
- 다른 클러스터에 로드된 테이블을 리페어하는 것은 소스 테이블을 리페어하지 않습니다.
- sstableloader는 노드 간 통신에 포트 7000을 사용합니다.
- 증분 백업을 복원하기 전에
nodetool flush를 실행해 멤테이블의 데이터를 백업하세요.
nodetool import 사용
테이블에 SSTable을 가져오는 것은 더 이상 사용되지 않는(deprecated) nodetool refresh 명령 대신 nodetool import 명령을 권장합니다. nodetool import 명령에는 별도 디렉터리에서 새 SSTable을 로드하는 옵션이 있습니다.
명령 사용법은 다음과 같습니다:
nodetool [(-h <host> | --host <host>)] [(-p <port> | --port <port>)]
[(-pp | --print-port)] [(-pw <password> | --password <password>)]
[(-pwf <passwordFilePath> | --password-file <passwordFilePath>)]
[(-u <username> | --username <username>)] import
[(-c | --no-invalidate-caches)] [(-e | --extended-verify)]
[(-l | --keep-level)] [(-q | --quick)] [(-r | --keep-repaired)]
[(-t | --no-tokens)] [(-v | --no-verify)] [--] <keyspace> <table>
<directory> ...
keyspace, table 이름, directory 인자는 필수입니다.
다음 옵션이 지원됩니다:
-c, --no-invalidate-caches
Don't invalidate the row cache when importing
-e, --extended-verify
Run an extended verify, verifying all values in the new SSTables
-h <host>, --host <host>
Node hostname or ip address
-l, --keep-level
Keep the level on the new SSTables
-p <port>, --port <port>
Remote jmx agent port number
-pp, --print-port
Operate in 4.0 mode with hosts disambiguated by port number
-pw <password>, --password <password>
Remote jmx agent password
-pwf <passwordFilePath>, --password-file <passwordFilePath>
Path to the JMX password file
-q, --quick
Do a quick import without verifying SSTables, clearing row cache or
checking in which data directory to put the file
-r, --keep-repaired
Keep any repaired information from the SSTables
-t, --no-tokens
Don't verify that all tokens in the new SSTable are owned by the
current node
-u <username>, --username <username>
Remote jmx agent username
-v, --no-verify
Don't verify new SSTables
--
This option can be used to separate command-line options from the
list of argument, (useful when arguments might be mistaken for
command-line options
nodetool import는 명령줄에서 키스페이스와 테이블을 지정하므로, sstableloader와 같은 특정 디렉터리 경로에 SSTable을 두어야 하는 요구 사항은 없습니다. snapshot이나 증분 백업을 nodetool import로 가져올 때 SSTable을 다른 디렉터리로 복사할 필요가 없습니다.
증분 백업에서 데이터 가져오기
nodetool import로 증분 백업의 SSTable을 가져오고 테이블을 복원하는 것을 아래에 보여줍니다.
DROP table t;
테이블의 증분 백업은 테이블의 스키마 정의를 포함하지 않습니다. 스키마 정의를 별도 백업으로 유지하지 않으면 테이블 백업의 schema.cql을 사용해 다음과 같이 테이블을 만들 수 있습니다:
CREATE TABLE IF NOT EXISTS cqlkeyspace.t (
id int PRIMARY KEY,
k int,
v text)
WITH ID = d132e240-c217-11e9-bbee-19821dcea330
AND bloom_filter_fp_chance = 0.01
AND crc_check_chance = 1.0
AND default_time_to_live = 0
AND gc_grace_seconds = 864000
AND min_index_interval = 128
AND max_index_interval = 2048
AND memtable_flush_period_in_ms = 0
AND speculative_retry = '99p'
AND additional_write_policy = '99p'
AND comment = ''
AND caching = { 'keys': 'ALL', 'rows_per_partition': 'NONE' }
AND compaction = { 'max_threshold': '32', 'min_threshold': '4',
'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy' }
AND compression = { 'chunk_length_in_kb': '16', 'class':
'org.apache.cassandra.io.compress.LZ4Compressor' }
AND cdc = false
AND extensions = { }
;
처음에는 테이블이 비어 있을 수 있지만 빌 필요는 없습니다.
SELECT * FROM t;
id | k | v
----+---+---
(0 rows)
키스페이스, 테이블, backups 디렉터리를 제공해 nodetool import 명령을 실행하세요. sstableloader처럼 테이블 백업을 다른 디렉터리로 복사하지 마세요.
$ nodetool import -- cqlkeyspace t \
./cassandra/data/data/cqlkeyspace/t-d132e240c21711e9bbee19821dcea330/backups
SSTable이 테이블로 가져옵니다. cqlsh에서 쿼리를 실행해 확인하세요:
SELECT * FROM t;
id | k | v
----+---+------
1 | 1 | val1
0 | 0 | val0
(2 rows)
스냅샷에서 데이터 가져오기
nodetool import 명령으로 스냅샷의 SSTable을 가져오는 것은 증분 백업의 SSTable을 가져오는 것과 유사합니다. 여기서는 restore를 시연하기 위해 테이블을 삭제한 뒤 catalogkeyspace.journal 테이블의 스냅샷을 가져오는 것을 보여줍니다.
USE CATALOGKEYSPACE;
DROP TABLE journal;
journal 테이블에 대해 catalog-ks 스냅샷을 사용하세요. 스냅샷의 파일을 확인하고 schema.cql 파일의 존재를 기록하세요.
$ ls -l
total 44
-rw-rw-r--. 1 ec2-user ec2-user 31 Aug 19 02:44 manifest.json
-rw-rw-r--. 3 ec2-user ec2-user 47 Aug 19 02:38 na-1-big-CompressionInfo.db
-rw-rw-r--. 3 ec2-user ec2-user 97 Aug 19 02:38 na-1-big-Data.db
-rw-rw-r--. 3 ec2-user ec2-user 10 Aug 19 02:38 na-1-big-Digest.crc32
-rw-rw-r--. 3 ec2-user ec2-user 16 Aug 19 02:38 na-1-big-Filter.db
-rw-rw-r--. 3 ec2-user ec2-user 16 Aug 19 02:38 na-1-big-Index.db
-rw-rw-r--. 3 ec2-user ec2-user 4687 Aug 19 02:38 na-1-big-Statistics.db
-rw-rw-r--. 3 ec2-user ec2-user 56 Aug 19 02:38 na-1-big-Summary.db
-rw-rw-r--. 3 ec2-user ec2-user 92 Aug 19 02:38 na-1-big-TOC.txt
-rw-rw-r--. 1 ec2-user ec2-user 814 Aug 19 02:44 schema.cql
schema.cql에서 DDL을 복사해 cqlsh에서 실행해 catalogkeyspace.journal 테이블을 만듭니다:
CREATE TABLE IF NOT EXISTS catalogkeyspace.journal (
id int PRIMARY KEY,
name text,
publisher text)
WITH ID = 296a2d30-c22a-11e9-b135-0d927649052c
AND bloom_filter_fp_chance = 0.01
AND crc_check_chance = 1.0
AND default_time_to_live = 0
AND gc_grace_seconds = 864000
AND min_index_interval = 128
AND max_index_interval = 2048
AND memtable_flush_period_in_ms = 0
AND speculative_retry = '99p'
AND additional_write_policy = '99p'
AND comment = ''
AND caching = { 'keys': 'ALL', 'rows_per_partition': 'NONE' }
AND compaction = { 'min_threshold': '4', 'max_threshold':
'32', 'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy' }
AND compression = { 'chunk_length_in_kb': '16', 'class':
'org.apache.cassandra.io.compress.LZ4Compressor' }
AND cdc = false
AND extensions = { }
;
스냅샷의 SSTable을 가져오기 위해 nodetool import 명령을 실행합니다:
$ nodetool import -- catalogkeyspace journal \
./cassandra/data/data/catalogkeyspace/journal-
296a2d30c22a11e9b1350d927649052c/snapshots/catalog-ks/
이후 journal 테이블에 CQL 쿼리를 실행해 가져온 데이터를 확인합니다:
SELECT * FROM journal;
id | name | publisher
----+---------------------------+------------------
1 | Couchbase Magazine | Couchbase
0 | Apache Cassandra Magazine | Apache Cassandra
(2 rows)
외부 데이터 벌크 로딩
외부 데이터를 직접 벌크 로딩하는 것은 우리가 논의한 도구(sstableloader와 nodetool import 포함) 어느 것도 지원하지 않습니다. sstableloader와 nodetool import는 데이터가 SSTable 형태여야 합니다. Apache Cassandra는 org.apache.cassandra.io.sstable.CQLSSTableWriter Java 클래스를 사용해 입력 데이터에서 SSTable을 생성하는 Java API를 지원해요. 이후 sstableloader 또는 nodetool import 중 하나를 사용해 SSTable을 벌크 로드합니다.
CQLSSTableWriter Java API로 SSTable 생성
CQLSSTableWriter 클래스로 SSTable을 생성하려면 다음이 필요합니다:
- SSTable을 생성할 출력 디렉터리
- SSTable의 스키마
- INSERT용 prepared statement
- 파티셔너
출력 디렉터리는 시작 전에 존재해야 합니다. 디렉터리(/sstables 예시)를 만들고 적절한 권한을 설정하세요.
$ sudo mkdir /sstables
$ sudo chmod 777 -R /sstables
Java 애플리케이션에서 CQLSSTableWriter를 사용하려면 출력 디렉터리용 Java 상수를 만드세요.
public static final String OUTPUT_DIR = "./sstables";
CQLSSTableWriter Java API는 사용자 정의 타입을 만들 수 있습니다. int 데이터를 저장할 새 타입을 만듭니다:
String type = "CREATE TYPE CQLKeyspace.intType (a int, b int)";
// Define a String variable for the SSTable schema.
String schema = "CREATE TABLE CQLKeyspace.t ("
+ " id int PRIMARY KEY,"
+ " k int,"
+ " v1 text,"
+ " v2 intType,"
+ ")";
사용할 prepared statement용 String 변수를 정의합니다:
String insertStmt = "INSERT INTO CQLKeyspace.t (id, k, v1, v2) VALUES (?, ?, ?, ?)";
사용할 파티셔너는 기본 파티셔너 Murmur3Partitioner를 사용하지 않는 경우에만 설정하면 됩니다.
이 모든 변수 또는 설정은 빌더 클래스 CQLSSTableWriter.Builder가 CQLSSTableWriter 객체를 만드는 데 사용합니다.
출력 디렉터리용 File 객체를 만듭니다.
File outputDir = new File(OUTPUT_DIR + File.separator + "CQLKeyspace" + File.separator + "t");
정적 메서드 CQLSSTableWriter.builder()로 CQLSSTableWriter.Builder 객체를 얻습니다. 다음 항목을 설정하세요:
- 출력 디렉터리 File 객체
- 사용자 정의 타입
- SSTable 스키마
- 버퍼 크기
- prepared statement
- 선택적으로 다른 builder 옵션
그리고 build() 메서드를 호출해 CQLSSTableWriter 객체를 만듭니다:
CQLSSTableWriter writer = CQLSSTableWriter.builder()
.inDirectory(outputDir)
.withType(type)
.forTable(schema)
.withBufferSizeInMB(256)
.using(insertStmt).build();
SSTable 데이터를 설정합니다. 사용자 정의 타입을 사용한다면 각 타입에 대해 UserType 객체를 얻습니다:
UserType userType = writer.getUDType("intType");
결과 SSTable에 데이터 행을 추가합니다:
writer.addRow(0, 0, "val0", userType.newValue().setInt("a", 0).setInt("b", 0));
writer.addRow(1, 1, "val1", userType.newValue().setInt("a", 1).setInt("b", 1));
writer.addRow(2, 2, "val2", userType.newValue().setInt("a", 2).setInt("b", 2));
writer를 닫아 SSTable을 마무리합니다:
writer.close();
CQLSSTableWriter 클래스가 제공하는 다른 공개 메서드:
| 메서드 | 설명 |
|---|---|
| addRow(java.util.List<java.lang.Object> values) | writer에 새 행을 추가. CQLSSTableWriter 객체를 반환. 제공된 각 값 타입은 그 값이 들어있는 CQL 컬럼의 타입에 대응해야 함. Java 타입과 CQL 타입의 대응 관계는 www.datastax.com/drivers/java/2.0/apidocs/com/datastax/driver/core/DataType.Name.html#asJavaClass()에 문서화된 것과 동일 |
| addRow(java.util.Map<java.lang.String,java.lang.Object> values) | writer에 새 행을 추가. CQLSSTableWriter 객체를 반환. 다른 addRow 메서드와 동등하지만, 이 SSTable writer 생성 중 사용된 insert 문의 순서대로 값 목록을 받는 대신 키가 추가할 컬럼 이름인 map을 받음. map 키의 컬럼 이름은, 선언된 컬럼 이름이 대소문자 구분 큐오트 식별자(그 경우 map 키는 컬럼의 정확한 대소문자를 사용해야 함)가 아니면 소문자여야 함. values 파라미터는 추가할 새 행을 나타내는 컬럼 이름-컬럼 값 map. 컬럼이 map에 포함되지 않으면 그 값은 null. 이 SSTable writer를 만들 때 사용된 insert 문의 컬럼 중 하나에 대응하지 않는 키가 map에 있으면 해당 값은 무시됨 |
| addRow(java.lang.Object… values) | writer에 새 행을 추가. CQLSSTableWriter 객체를 반환 |
| CQLSSTableWriter.builder() | CQLSSTableWriter용 새 builder 반환 |
| close() | writer 닫음 |
| rawAddRow(java.nio.ByteBuffer… values) | 이미 직렬화된 바이너리 값이 주어진 writer에 새 행을 추가. CQLSSTableWriter 객체를 반환. 행 값은 이 SSTable writer 생성 중 사용된 삽입 문의 바인드 변수에 대응해야 함 |
| rawAddRow(java.util.List<java.nio.ByteBuffer> values) | 이미 직렬화된 바이너리 값이 주어진 writer에 새 행을 추가. CQLSSTableWriter 객체를 반환. 행 값은 이 SSTable writer 생성 중 사용된 삽입 문의 바인드 변수에 대응해야 함 |
| rawAddRow(java.util.Map<java.lang.String, java.nio.ByteBuffer> values) | 이미 직렬화된 바이너리 값이 주어진 writer에 새 행을 추가. CQLSSTableWriter 객체를 반환. 행 값은 이 SSTable writer 생성 중 사용된 삽입 문의 바인드 변수에 대응해야 함 |
| getUDType(String dataType) | 이 SSTable Writer에서 사용되는 사용자 정의 타입을 반환하며, UDTValue 인스턴스를 만드는 데 사용할 수 있음 |
CQLSSTableWriter.Builder 클래스가 제공하는 다른 공개 메서드:
| 메서드 | 설명 |
|---|---|
| inDirectory(String directory) | SSTable을 쓸 디렉터리. 필수 옵션. 사용할 디렉터리는 이미 존재하고 쓰기 가능해야 함 |
| inDirectory(File directory) | SSTable을 쓸 디렉터리. 필수 옵션. 사용할 디렉터리는 이미 존재하고 쓰기 가능해야 함 |
| forTable(String schema) | SSTable을 만들 테이블의 스키마(CREATE TABLE 문). 제공된 CREATE TABLE 문은 키스페이스 이름을 포함한 완전히 자격을 갖춘 테이블 이름을 사용해야 함. 필수 옵션 |
| withPartitioner(IPartitioner partitioner) | 사용할 파티셔너. 기본적으로 Murmur3Partitioner가 사용됨. 이것이 SSTable이 생성되는 클러스터가 사용하는 파티셔너가 아니면 올바른 파티셔너를 제공해야 함 |
| using(String insert) | 주어진 CQL 행에 추가할 값의 순서를 정의하는 INSERT 또는 UPDATE 문. 제공된 INSERT 문은 키스페이스 이름을 포함한 완전히 자격을 갖춘 테이블 이름을 사용해야 함. 또한 그 문은 바인드 변수를 사용해야 하며, 이 변수들은 결과 SSTable writer가 값에 바인딩할 것임. 필수 옵션 |
| withBufferSizeInMiB(int size) | 사용할 버퍼 크기. 새 SSTable로 쓰기 전에 얼마나 많은 데이터가 버퍼링될지 정의함. 이는 생성될 SSTable이 가질 데이터 크기와 대략 일치. 기본값은 128MB이며 1GB 힙에 합리적. SSTable writer를 사용하는 동안 OutOfMemory 예외가 발생하면 이 값을 낮춰야 함 |
| withBufferSizeInMB(int size) | 더 이상 사용되지 않음(deprecated), 최소한 다음 메이저 릴리스까지는 사용 가능. 새 이름의 같은 메서드인 withBufferSizeInMiB(int size)를 사용하세요 |
| sorted() | 정렬된 입력을 기대하는 CQLSSTableWriter 생성. 이 옵션을 사용하면 결과 SSTable writer가 SSTable 정렬 순서대로 행이 추가되기를 기대함(행 삽입 중 그렇지 않으면 예외가 발생). SSTable 정렬 순서는 행이 추가되어 파티션 키가 파티셔너 순서를 따르게 됨을 의미. 이 옵션은 행을 순서대로 제공할 수 있을 때만 사용해야 하며, 그 경우는 드묾. 행을 순서대로 제공할 수 있다면 sorted를 사용하는 것이 더 효율적일 수 있음. 이 옵션을 사용하면 withBufferSizeInMB 같은 일부 옵션은 무시됨 |
| build() | CQLSSTableWriter 객체 구축 |
더 알아보기 (Learn more)
- 백업 — 스냅샷과 증분 백업
- nogetool import
- CQLSSTableWriter 소스 코드