0

카산드라에 대량의 레코드 (한 번에 5 백만 개 이상)를 기록하려고합니다. 탭으로 구분 된 파일에서이 파일을 읽고 있으며 executeAsync를 사용하여 Cassandra로 가져옵니다. 우리는 훨씬 더 작은 데이터 세트 (~ 330k 레코드)를 사용하여보다 보편화되었습니다. 최근까지 우리 스크립트는 자동으로 약 65k 레코드에서 가져 오기를 중지했습니다. RAM을 2Gb에서 4Gb로 업그레이드 한 이후로 가져 오는 레코드 수가 두 배가되었지만 아직 모든 레코드를 성공적으로 가져 오지 못했습니다. 많은 수의 쓰기를 수행 할 때 카산드라와 관련된 문제가 발생했습니다.

우리가 현재 실행중인 프로세스의 예는 다음과 같습니다

$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 Cassandra 프로세스가 높은 CPU 사용률 (~ 85 %)에서 실행되도록하기 때문에 여기서는 적절하지 않습니다.

우리는 최신 버전의 DSE/Cassandra를 저장소에서 사용할 수 있습니다.

답변

1

2GB (실제로 4GB)는 개발 또는 생산시 Cassandra에 대해서도 권장되지 않습니다. 그것을 실행하는 것은 가능하지만 기본 설정이 조정 된 것보다 아래에 있기 때문에 더 많은 조정이 필요합니다. 심지어 문제가 계속되기 전에 많은 성능을 기대해서는 안되며 (오류가 발생 함) 더 많은 노드를 추가해야합니다.

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

  • 제작 : 5백12~32기가바이트 GB; Cassandra만의 경우 최소 8GB이고 DataStax Enterprise 분석 및 검색 노드의 경우 최소 32GB입니다.
  • 비 부하 테스트 환경에서 개발 : 4GB 이상.
  • DSE 그래프 : 특정 DSE 검색 또는 DSE 분석 조합 외에도 2 - 4GB. 커다란 전용 그래프 캐시가 필요하면 RAM을 추가하십시오.

스팸은 executeAsync로 쓰고 배압은 적용하지 않습니다. 결국 당신은 그런 시스템을 오버런 할 것입니다. 어떤 종류의 제한이나 피드백을 추가하거나 동기식 요청 만 사용해야합니다.

+0

감사합니다. @Chris, 우리는 현재 잘 작동하고 있습니다. 쓰로틀 링에 관해서는,이 용도로 활용할 수있는 DataStax PHP 드라이버에 내장 된 것이 있습니까? – deano23

+0

아니, 나는 충분히 비동기 메서드를 처리하는 좋은 방법을 알고 PHP에 익숙하지 않다. 아마도리스트에 선물을 넣고 목록이> 1000이거나 첫 번째 것을 꺼내서'get'을하면 항상 1000 개 정도의 비행을 할 수 있습니다. 그런 다음 성능 수치를 기반으로 해당 수치를 조정할 수 있습니다 (이러한 소형 시스템에서는 낮을 수 있음). –

+0

크리스 고맙습니다. 매우 도움이됩니다. – deano23