0

我們正在嘗試將大量記錄(每次超過500萬個)寫入Cassandra。這些正在從製表符分隔的文件中讀取,並正在使用executeAsync導入到Cassandra中。 我們一直在使用更小的數據集(約330k條記錄),這將更常見。直到最近,我們的腳本一直在默默停止進口約65k的記錄。由於將RAM從2Gb升級到4Gb,導入的記錄數增加了一倍,但我們仍未成功導入所有記錄。Cassandra執行大量寫入操作時遇到的問題

這是我們目前運行的進程的一個例子:

$cluster = \Cassandra::cluster()->withContactPoints('127.0.0.1')->build(); 
$session = $cluster->connect('example_data'); 

$statement = $session->prepare("INSERT INTO example_table (example_id, column_1, column_2, column_3, column_4, column_5, column_6) VALUES (uuid(), ?, ?, ?, ?, ?, ?)"); 
$futures = array(); 
$data = array(); 

foreach ($results as $row) { 
    $data = array($row[‘column_1’], $row[‘column_2’], $row[‘column_3’], $row[‘column_4’], $row[‘column_5’], $row[‘column_6’]); 
    $futures = $session->executeAsync($statement, new \Cassandra\ExecutionOptions(array(
     'arguments' => $data 
    ))); 
} 

我們懷疑這可能是向下運行的空間堆:

DEBUG [SlabPoolCleaner] 2017-02-27 17:01:17,105 ColumnFamilyStore.java:1153 - Flushing largest CFS(Keyspace='dev', ColumnFamily='example_data') to free up room. Used total: 0.67/0.00, live: 0.33/0.00, flushing: 0.33/0.00, this: 0.20/0.00 
DEBUG [SlabPoolCleaner] 2017-02-27 17:01:17,133 ColumnFamilyStore.java:854 - Enqueuing flush of example_data: 89516255 (33%) on-heap, 0 (0%) off-heap 

表我們插入此數據如下:

CREATE TABLE example_data (
    example_id uuid PRIMARY KEY, 
    column_1 int, 
    column_2 varchar, 
    column_3 int, 
    column_4 varchar, 
    column_5 int, 
    column_6 int 
); 
CREATE INDEX column_5 ON example_data (column_5); 
CREATE INDEX column_6 ON example_data (column_6); 

我們試圖使用批處理方法,但b elieve在這裏並不合適,因爲它會導致Cassandra進程在高CPU使用率(〜85%)下運行。

我們正在使用存儲庫中提供的最新版本的DSE/Cassandra。

Cassandra 3.0.11.1564 | DSE 5.0.6 

回答

1

2gb(和4gb真的)甚至不是Cassandra在開發或生產中推薦的最小值。運行它是可能的,但它需要更多的調整,因爲它低於默認的調整。即使調整你不應該期望很多性能,然後開始有問題保持(錯誤你得到),你需要添加更多的節點。

https://docs.datastax.com/en/landing_page/doc/landing_page/planning/planningHardware.html

  • 製作:32 GB到512 GB; Cassandra的最小值爲8 GB,DataStax Enterprise分析和搜索節點的最小值爲32 GB。
  • 在非加載測試環境下開發:不少於4 GB。
  • DSE圖形:除了特定的DSE搜索或DSE分析組合之外,還有2至4 GB。如果你想要一個大的專用圖形緩存,添加更多的RAM。

此外,您的垃圾郵件與executeAsync寫入,而不是應用任何背壓。最終你會超過任何這樣的系統。您可能需要添加某種節流,反饋或僅使用同步請求。

+0

謝謝@Chris,我們的構建工作已經完成。關於節流,DataStax的PHP驅動程序中是否有內置的可用於此目的? – deano23

+0

不,我對PHP不熟悉,不知道處理異步方法的好方法。可能會把期貨列入清單,如果清單是> 1000或者什麼東西來拉第一個,並做一個'get',那麼你就有大約1000個航班在任何時候。可以調整該數字,然後根據一些性能數字(對於這樣的小型系統可能較低)。 –

+0

非常感謝Chris,這非常有幫助。 – deano23

相關問題