2013-07-30 6 views
0

나는 돌연변이 대를 사용하는 데이터 로딩 방법에 대해 토론 할 수있는 토론이 시작되기를 바랍니다. 'LOAD DATA INFILE'을 통해 플랫 파일을 사용하여로드.HyperTable : 뮤 테이터 Vs. LOAD DATA INFILE

(배치 크기 = 1000 또는 10000 또는 100K 등을 사용하여) 뮤 테이터를 사용하여 엄청난 성능 향상을 얻지 못했습니다.

내 프로젝트에는 실시간 분석을 위해 HyperTable에 4 억 행의 소셜 미디어 데이터를로드하는 작업이 포함되었습니다. 1 백만 행의 데이터 만로드하는 데 3 일이 걸렸습니다 (아래 코드 샘플). 각 행은 약 32 바이트입니다. 그래서 2-3 주 동안 많은 데이터를로드하는 것을 피하기 위해 행이있는 플랫 파일을 준비하고 DATA LOAD INFILE 메서드를 사용했습니다. 성능 향상은 놀랍습니다. 이 방법을 사용하여 로딩 속도는 368336 세포/초이었다.

See below for actual snapshot of action: 

hypertable> LOAD DATA INFILE "/data/tmp/users.dat" INTO TABLE users; 


Loading 7,113,154,337 bytes of input data...      

0% 10 20 30 40 50 60 70 80 90 100%   
|----|----|----|----|----|----|----|----|----|----|    
***************************************************    
Load complete.             

Elapsed time: 508.07 s          
Avg key size: 8.92 bytes          
    Total cells: 218976067          
    Throughput: 430998.80 cells/s        
     Resends: 2210404           


hypertable> LOAD DATA INFILE "/data/tmp/graph.dat" INTO TABLE graph; 

Loading 12,693,476,187 bytes of input data...      

0% 10 20 30 40 50 60 70 80 90 100%   
|----|----|----|----|----|----|----|----|----|----| 
***************************************************    
Load complete.             

Elapsed time: 1189.71 s          
Avg key size: 17.48 bytes          
    Total cells: 437952134          
    Throughput: 368118.13 cells/s        
     Resends: 1483209 

이유는 두 방법 사이의 성능 차이가 너무 광대인가? 뮤 테이터 성능을 향상시키는 가장 좋은 방법은 무엇입니까? 샘플 뮤 테이터 코드는 다음과 같습니다.

my $batch_size = 1000000; # or 1000 or 10000 make no substantial difference 
my $ignore_unknown_cfs = 2; 
my $ht = new Hypertable::ThriftClient($master, $port); 
my $ns = $ht->namespace_open($namespace); 
my $users_mutator = $ht->mutator_open($ns, 'users', $ignore_unknown_cfs, 10); 
my $graph_mutator = $ht->mutator_open($ns, 'graph', $ignore_unknown_cfs, 10); 
my $keys = new Hypertable::ThriftGen::Key({ row => $row, column_family => $cf, column_qualifier => $cq }); 
my $cell = new Hypertable::ThriftGen::Cell({key => $keys, value => $val}); 
$ht->mutator_set_cell($mutator, $cell); 
$ht->mutator_flush($mutator); 

이 입력에 감사드립니다. 엄청난 양의 HyperTable 경험이 없습니다.

감사합니다.

답변

2

100 만 개의 행을로드하는 데 3 일이 걸리면 모든 행 삽입 후에 flush()를 호출 할 가능성이 있습니다. 이는 옳지 않은 작업입니다. 문제를 해결하기 전에 mutator_open() 인수가 올바르지 않습니다. 당신은 ignore_unknown_cfs를 지정할 필요가 없습니다 당신은이 같은 flush_interval, 뭔가에 0을 제공해야합니다 : 당신은 당신이 입력 데이터의 양을 체크 포인트하려는 경우 mutator_flush()를 호출하는 것은 소비되었는지해야

my $users_mutator = $ht->mutator_open($ns, 'users', 0, 0); 
my $graph_mutator = $ht->mutator_open($ns, 'graph', 0, 0); 

. mutator_flush()를 성공적으로 호출하면 해당 뮤 테이타에 삽입 된 모든 데이터가 내구성있게 데이터베이스에 저장됩니다. 입력 데이터의 양을 체크 포인트하지 않으면 mutator_flush()를 호출 할 필요가 없습니다. mutator_flush()는 뮤 테이터를 닫을 때 자동으로 플러시됩니다.

내가보기에 코드에서 다음 성능 문제는 mutator_set_cell()을 사용하고 있다는 것입니다. mutator_set_cells() 또는 mutator_set_cells_as_arrays()를 사용해야합니다. 각 메소드 호출은 ThriftBroker로 왕복하는 것이므로 비용이 많이 듭니다. mutator_set_cells_ * 메소드를 사용하면 많은 왕복 여행을 할 수 있습니다. mutator_set_cells_as_arrays() 메소드는 네이티브 데이터 유형 (예 : 문자열)과 비교하여 객체 생성 오버 헤드가 큰 언어의 경우 더 효율적일 수 있습니다. Perl에 대해서는 잘 모르겠지만 퍼포먼스가 향상되는지 확인하려고 할 수도 있습니다.

또한 뮤 테이타가 완료되면 mutator_close()를 호출해야합니다.

+0

\ Doug - 추천대로 mutator_set_cells() 또는 mutator_set_cells_as_arrays()를 사용하려고했지만이 오류가 발생합니다. ./lib/Hypertable/ThriftGen/ClientService.pm의 ARRAY 참조가 아닙니다. 나는 확실하다, 유형 또는 논쟁은 원인이다. 나는 계속 노력할 것입니다. 그러나 당신은 그것이 버그 일 수 있다고 생각합니다. 저에게 알려주십시오. 덕. 고마워. 정말 감사합니다. – NullException

+0

일단 플러시를 제거하면 일괄 삽입에서 엄청난 성능 향상을 달성 할 수있었습니다. 이후로는 수백만 행 (각 ~ 32 바이트)을 얻었으므로 해당 컴퓨터의 RAM을 기반으로 1 백만 개의 그룹으로 배치했습니다. 대답을 수락합니다. – NullException