Cassandra 文件

版本

您正在檢視預發行版本的說明文件。

大量載入

大量載入 Apache Cassandra 資料由不同的工具支援。要大量載入的資料必須採用 SSTables 的形式。Cassandra 不支援直接載入任何其他格式(例如 CSV、JSON 和 XML)的資料。儘管 cqlsh COPY 命令可以載入 CSV 資料,但對於大量資料而言並非一個好選項。大量載入用於

  • 還原增量備份和快照。備份和快照已經採用 SSTables 的形式。

  • 將現有的 SSTables 載入到另一個叢集。資料可以有不同的節點數或複製策略。

  • 將外部資料載入到叢集。

大量載入的工具

Cassandra 提供兩個命令或工具來大量載入資料

  • Cassandra 大量載入器,也稱為 sstableloader

  • nodetool import 命令

如果 Cassandra 安裝的 bin 目錄在 PATH 環境變數中,則可以存取 sstableloadernodetool import。或者,可以直接從 bin 目錄存取這些目錄。範例使用在 備份 中建立的鍵空間和表格。

使用 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.dbStandard1-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

可以使用 -f 選項在命令列中提供 cassandra.yaml 檔案,以設定串流傳輸量、用戶端和伺服器加密選項。只有 stream_throughput_outbound_megabits_per_secserver_encryption_optionsclient_encryption_options 會從 cassandra.yaml 檔案讀取。您可以使用對應的命令列選項覆寫從 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 使用的格式,你可以直接從 backupssnapshots 目錄上傳。但是,SSTable 的備份和快照目錄路徑分別為 /catalogkeyspace/magazine-446eae30c22a11e9b1350d927649052c/backups/catalogkeyspace/magazine-446eae30c22a11e9b1350d927649052c/snapshots,且無法用於將 SSTable 上傳到 catalogkeyspace.magazine 表格。目錄路徑結構必須為 /catalogkeyspace/magazine/ 才能使用 sstableloader。建立新的目錄結構以使用位於 /catalogkeyspace/magazinesstableloader 上傳 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)

建立要上傳到的表格後,將 SSTable 檔案從 backups 目錄複製到 /catalogkeyspace/magazine/ 目錄。

$ sudo cp ./cassandra/data/data/catalogkeyspace/magazine-446eae30c22a11e9b1350d927649052c/backups/* \
/catalogkeyspace/magazine/

執行 sstableloader 以從 /catalogkeyspace/magazine/ 目錄上傳 SSTable。

$ 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)

從快照大量載入

可以輕鬆地將表格快照還原到同一表格

如果載入 SSTable 至 catalogkeyspace.magazine 所需的目錄結構不存在,請建立目錄並設定適當的權限

$ 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

建議使用 nodetool import 指令將 SSTable 匯入資料表,而不是使用已棄用的 nodetool refresh 指令。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> ...

需要 keyspacetable 名稱和 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 放置在特定目錄路徑中。使用 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)

執行 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。這裡顯示的是在刪除資料表以示範還原後,匯入 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 = {  }
;

執行 nodetool import 指令,以匯入快照的 SSTable

$ 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)

大量載入外部資料

我們討論過的所有工具,包括 sstableloadernodetool import,都不支援直接大量載入外部資料。sstableloadernodetool import 要求資料以 SSTable 的形式呈現。Apache Cassandra 支援一個 Java API,可使用 org.apache.cassandra.io.sstable.CQLSSTableWriter Java 類別,從輸入資料產生 SSTable。接著,使用 sstableloadernodetool import 來大量載入 SSTable。

使用 CQLSSTableWriter Java API 產生 SSTable

若要使用 CQLSSTableWriter 類別產生 SSTable,需要下列項目

  • 用來產生 SSTable 的輸出目錄

  • SSTable 的架構

  • INSERT 的已準備陳述式

  • 一個分割器

輸出目錄必須在開始前存在。建立一個目錄(例如 /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,"
                 + ")";

定義一個 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");

使用 static 方法 CQLSSTableWriter.builder() 取得一個 CQLSSTableWriter.Builder 物件。設定下列項目

  • 輸出目錄 File 物件

  • 自訂類型

  • SSTable 架構

  • 緩衝區大小

  • 已準備的陳述式

  • 其他建構函式選項(選用)

並呼叫 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));

關閉寫入器,完成 SSTable

writer.close();

CQLSSTableWriter 類別提供的其他公開方法為

方法 說明

addRow(java.util.List<java.lang.Object> values)

新增一列至寫入器。傳回 CQLSSTableWriter 物件。每個提供的值類型應對應至該值所屬的 CQL 欄位類型。Java 類型與 CQL 類型之間的對應關係與 www.datastax.com/drivers/java/2.0/apidocs/com/datastax/driver/core/DataType.Name.html#asJavaC lass() 中所記載的相同。

addRow(java.util.Map<java.lang.String,java.lang.Object> values)

新增一列至寫入器。傳回 CQLSSTableWriter 物件。這等同於其他 addRow 方法,但採用一個其金鑰為要新增的欄位名稱的映射,而非採用一個在建構此 SSTable 寫入器時所使用的插入陳述順序中的值清單。映射金鑰中的欄位名稱必須為小寫,除非宣告的欄位名稱為大小寫敏感的引號識別碼,在此情況下,映射金鑰必須使用欄位的確切大小寫。值參數是欄位名稱至欄位值的映射,代表要新增的新列。如果映射中未包含某個欄位,其值將為 null。如果映射包含不對應於建構此 SSTable 寫入器時所使用的插入陳述中任一欄位的金鑰,則會忽略對應的值。

addRow(java.lang.Object…​ values)

新增一列至寫入器。傳回 CQLSSTableWriter 物件。

CQLSSTableWriter.builder()

傳回 CQLSSTableWriter 的新建構器。

close()

關閉寫入器。

rawAddRow(java.nio.ByteBuffer…​ values)

新增一列至寫入器,提供已序列化的二進位值。傳回 CQLSSTableWriter 物件。列值必須對應於建構此 SSTable 寫入器時所使用的插入陳述的繫結變數。

rawAddRow(java.util.List<java.nio.ByteBuffer> values)

新增一列至寫入器,提供已序列化的二進位值。傳回 CQLSSTableWriter 物件。列值必須對應於建構此 SSTable 寫入器時所使用的插入陳述的繫結變數。

rawAddRow(java.util.Map<java.lang.String, java.nio.ByteBuffer> values)

新增一列至寫入器,提供已序列化的二進位值。傳回 CQLSSTableWriter 物件。列值必須對應於建構此 SSTable 寫入器時所使用的插入陳述的繫結變數。

getUDType(String dataType)

傳回此 SSTable 寫入器中使用的使用者定義類型,可用於建立 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 寫入器的數值。這是強制選項。

withBufferSizeInMiB(int size)

要使用的緩衝區大小。這會定義在寫入為新的 SSTable 之前,將緩衝多少資料。這大致對應於建立的 SSTable 將擁有的資料大小。預設值為 128MB,這對於 1GB 堆積來說應該是合理的。如果在使用 SSTable 寫入器時產生 OutOfMemory 例外狀況,應降低此值。

withBufferSizeInMB(int size)

已過時,且至少會提供至下一個主要版本。請使用 withBufferSizeInMiB(int size),這是具有新名稱的相同方法。

sorted()

建立會預期已排序輸入的 CQLSSTableWriter。如果使用此選項,結果 SSTable 寫入器將預期列會以 SSTable 已排序順序新增(如果在列插入期間並非如此,則會擲回例外狀況)。SSTable 已排序順序表示列的加入方式,其分區金鑰會遵循分區器順序。只有當列可以按順序提供時,才應使用此選項,而這種情況很少見。然而,如果列可以按順序提供,使用此已排序選項可能會更有效率。如果使用此選項,會略過一些選項,例如 withBufferSizeInMB。

build()

建立 CQLSSTableWriter 物件。