2011-03-31 56 views
1

我們正在刪除Cassandra中的大量記錄。我們得到以下錯誤。PHPCassa + Cassandra上的TFramedTransport錯誤

Error performing remove on 10.130.279.40:9160: exception 'TTransportException' with message 'TSocket: timed out reading 4 bytes from 10.130.279.40:9160' in /home/zonefiles/php/thrift/transport/TSocket.php:268 
    Stack trace: 
    0 /home/zonefiles/php/thrift/transport/TTransport.php(87): TSocket->read(4) 
    1 /home/zonefiles/php/thrift/transport/TFramedTransport.php(135): TTransport->readAll(4) 
    2 /home/zonefiles/php/thrift/transport/TFramedTransport.php(102): TFramedTransport->readFrame() 
    3 [internal function]: TFramedTransport->read(8192) 
    4 /home/zonefiles/php/thrift/packages/cassandra/Cassandra.php(691): thrift_protocol_read_binary(Object(TBinaryProtocolAccelerated), 'cassandra_Cassa...', false) 
    5 /home/zonefiles/php/thrift/packages/cassandra/Cassandra.php(664): CassandraClient->recv_remove() 
    6 [internal function]: CassandraClient->remove('CUSTOMERSERVICE...', Object(cassandra_ColumnPath), 1301555573936295, 1) 
    7 /home/zonefiles/php/connection.php(230): call_user_func_array(Array, Array) 
    8 /home/zonefiles/php/columnfamily.php(582): ConnectionPool->call('remove', 'CUSTOMERSERVICE...', Object(cassandra_ColumnPath), 1301555573936295, 1) 
    9 /home/zonefiles/php/delete.php(34): ColumnFamily->remove('CUSTOMERSERVICE...') 
    10 {main} 
    Error connecting to 10.130.279.40:9160: exception 'TTransportException' with message 'TSocket: timed out reading 4 bytes from 10.130.279.40:9160' in /home/zonefiles/php/thrift/transport/TSocket.php:268 
    Stack trace: 
    0 /home/zonefiles/php/thrift/transport/TTransport.php(87): TSocket->read(4) 
    1 /home/zonefiles/php/thrift/transport/TFramedTransport.php(135): TTransport->readAll(4) 
    2 /home/zonefiles/php/thrift/transport/TFramedTransport.php(102): TFramedTransport->readFrame() 
    3 [internal function]: TFramedTransport->read(8192) 
    4 /home/zonefiles/php/thrift/packages/cassandra/Cassandra.php(1015): thrift_protocol_read_binary(Object(TBinaryProtocolAccelerated), 'cassandra_Cassa...', false) 
    5 /home/zonefiles/php/thrift/packages/cassandra/Cassandra.php(992): CassandraClient->recv_describe_version() 
    6 /home/zonefiles/php/connection.php(63): CassandraClient->describe_version() 
    7 /home/zonefiles/php/connection.php(163): ConnectionWrapper->__construct('CDTMain1', '10.130.279.40:9...', NULL, true, 5000, 5000) 
    8 /home/zonefiles/php/connection.php(254): ConnectionPool->make_conn() 
    9 /home/zonefiles/php/connection.php(241): ConnectionPool->handle_conn_failure(Object(ConnectionWrapper), 'remove', Object(TTransportException), 1) 
    10 /home/zonefiles/php/columnfamily.php(582): ConnectionPool->call('remove', 'CUSTOMERSERVICE...', Object(cassandra_ColumnPath), 1301555573936295, 1) 
    11 /home/zonefiles/php/delete.php(34): ColumnFamily->remove('CUSTOMERSERVICE...') 
    12 {main} 

這裏是我們用來生成該錯誤的PHP:

<?php 
set_time_limit(2000); 
require 'connection.php'; 
require 'columnfamily.php'; 
$servers[0]['host'] = 'private ip'; 
$servers[0]['port'] = '9160'; 
$conn = new Connection('Server11', $servers); 
$urlFamily = new ColumnFamily($conn, 'Domain'); // ColumnFamily 

$start = microtime(true); 

$limit = 100000000; 

$rows = $urlFamily->get_range($key_start='', $key_finish='zzzzzzzzzzzzzzz',100000000); 

$num = 0; 
$delCount = 0; 

foreach($rows as $key => $columns) { 
    // Do stuff with $key or $columns 
     if (strpos($key, ' .net') !== false) { 
       //echo 'deleting ' . $key . "\n"; 
       $urlFamily->remove($key); 
       $delCount++; 
     } 
     if ($num++ > 100000000) break; 
     //$num++; 
     if ($num % 100000 == 0) echo $num . "\n"; 
} 

$end = microtime(true); 

echo $num . " total\n"; 
echo $delCount . ' deleted in ' . ($end - $start) . " seconds\n"; 
echo $delCount/($end - $start) . " deleted per second\n"; 

?> 

我們在Fedora 14勞克林運行PHP 5.3.5當我們插入的記錄數量龐大,我們也得到這個錯誤和節儉0.5.0。

一個理論是,這是由卡桑德拉不能夠足夠快地處理命令造成的。你同意/不同意嗎?你以前見過這個嗎?

如果您建議刪除不同的方式(例如截斷),那麼當我們用Cassandra做其他事情時,我們仍然如何防止這個問題發生?

+0

是delete語句的目的是刪除在.NET結束域的列表。有沒有辦法查詢cassandra來檢索其中有.net的所有URL?我知道在MySQL中它會像SELECT * WHERE Domain LIKE'* .net' – dengeltrees 2011-03-31 08:55:10

回答

2

那些只是日誌消息,還是實際上正在引發異常? phpcassa每次調用error_log()時,都會在使用其他連接重試之前捕獲這樣的異常。基本上,這意味着您應該密切關注記錄的堆棧軌跡,但您不必過多擔心它們。

這些是客戶端套接字超時,這意味着該調用所花費的時間超過默認的5秒超時。爲什麼這些首先發生在很大程度上取決於Cassandra的行爲方式。監測Cassandra可能是最好的開始。

+0

我們嘗試增加超時,我們仍然收到這些錯誤。我應該監視Cassandra?我如何執行監控?關於Cassandra在顯示消息後所做的最佳猜測是什麼:重試讀/寫,跳過它,崩潰? – dengeltrees 2011-04-03 08:31:35

+0

有關緩衝區大小或密鑰大小或yaml文件中的某些內容的設置是否會導致錯誤? – dengeltrees 2011-04-03 08:37:17

+0

它在TSocket.php中引發異常,這是引發它的行。 throw new TTransportException('TSocket:超時讀取'。$ len。'bytes from'。 $ this-> host _。':'。$ this-> port_); 異常被connection.php捕獲,它顯示錯誤消息。 – dengeltrees 2011-04-03 10:11:28

0

根據我的程序員,我們實際上是通過將超時值提升到非常高的值來解決這個問題。我們試圖導入一個5GB的文件,所以我猜這個db需要每次讀取超過5秒鐘。

以下是已設置的特定超時:

$ send_timeout = 60000 $ recv_timeout = 60000