2015-10-23 30 views
5

Używam pojedynczego węzła Cassandra i zamierzam uruchomić kilka zapytań w celu sprawdzenia czasu odpowiedzi. W niektórych zapytań, po 10s egzekucyjnych następuje mi następujący błąd:OperationTimedOut: errors = {}, last_host = 127.0.0.1

OperationTimedOut: errors = {}, last_host = 127.0.0.1 

Więc wpadłem następujące polecenie:

sudo gedit /usr/bin/cqlsh.py 

I zmienił cqlsh.py plik:

# cqlsh should run correctly when run out of a Cassandra source tree, 
# out of an unpacked Cassandra tarball, and after a proper package install. 
cqlshlibdir = os.path.join(CASSANDRA_PATH, 'pylib') 
if os.path.isdir(cqlshlibdir): 
    sys.path.insert(0, cqlshlibdir) 

from cqlshlib import cql3handling, cqlhandling, pylexotron, sslhandling 
from cqlshlib.displaying import (ANSI_RESET, BLUE, COLUMN_NAME_COLORS, CYAN, 
           RED, FormattedValue, colorme) 

from cqlshlib.formatting import (DEFAULT_DATE_FORMAT, DEFAULT_NANOTIME_FORMAT, 
           DEFAULT_TIMESTAMP_FORMAT, DateTimeFormat, 
           format_by_type, format_value_utype, 
           formatter_for) 

from cqlshlib.tracing import print_trace, print_trace_session 
from cqlshlib.util import get_file_encoding_bomsize, trim_if_present 

DEFAULT_HOST = '127.0.0.1' 
DEFAULT_PORT = 9042 
DEFAULT_CQLVER = '3.3.1' 
DEFAULT_PROTOCOL_VERSION = 4 
DEFAULT_CONNECT_TIMEOUT_SECONDS = 240 

DEFAULT_FLOAT_PRECISION = 5 
DEFAULT_MAX_TRACE_WAIT = 300 

jednak kiedy próbuję ponownie uruchomić kwerendę, cql zwróci ten sam błąd po 10s:

OperationTimedOut: errors = {}, last_host = 127.0.0.1 

Co muszę zrobić, aby zapytanie nie zawierało limitu czasu odpowiedzi?

Odpowiedz

5

Czy wykonujesz te zapytania w cqlsh?

Jeśli tak, oznacza to, że upłynął limit czasu żądania klienta (nie upłynął limit czasu połączenia ani czas oczekiwania na żądanie odczytu po stronie serwera).

Możesz zmienić domyślny limit czasu poprzez ustawienie jednego w ~/.cassandra/cqlshrc:

[connection] 
client_timeout = 20 
# Can also be set to None to disable: 
# client_timeout = None 

Zobacz https://issues.apache.org/jira/browse/CASSANDRA-7516 więcej szczegółów.

Widzę z innego komentarza, że ​​jesteś już świadomy stronicowania. To będzie najlepsze podejście, ponieważ nie wymaga od ciebie marnowania całego zestawu wyników w pamięci na poziomie warstw danych i aplikacji.

+0

który jest katalogiem, który powinien zmienić domyślny limit czasu w ~/.cassandra/cqlshrc? Nie mogę znaleźć ... –

+1

Nie zamierzam używać "stronicowania", ponieważ wykonuję porównanie wydajności zapytań między RDBMS i Cassandrą. Zamierzam uzyskać pełny wynik zapytania i sprawdzić czas odpowiedzi ... Z opcją "stronicowania" myślę, że to niemożliwe ... –

+1

Możesz umieścić go w określonej ścieżce (~/.cassandra/cqlshrc) lub podać alternatywną ścieżkę w linii komend cqlsh: https://github.com/apache/cassandra/blob/cassandra-2.2.3/ bin/cqlsh.py # L174 –

1

Należy zmienić parametr read_request_timeout_in_ms w pliku cassandra.yaml. A potem uruchom ponownie Cassandrę.

+0

Zmieniłem [read_request_timeout] dla '5000000' i błąd nadal. Pracuję z jednym węzłem, potem pomyślałem, aby zmienić plik "cqlsh.py" powinien rozwiązać problem, ale nie ... –

+0

Jakie jest twoje zapytanie? – DineMartine

+0

Plik cassandra.yaml, który należy edytować, jest jednym z węzłów, a nie klientem cqlsh. Czy to co zrobiłeś? Czy zrestartowałeś węzeł? – DineMartine

4

Zobaczysz kilka odpowiedzi z informacją o tym, jak podnieść różne limity czasu, ale prawdziwa odpowiedź brzmi, że prawie nigdy nie chcesz podnieść tych limitów czasu, ponieważ jeśli masz prawdziwy zestaw danych, zabijesz swój serwer (lub upuść żądania/mutacje) z wieloma długotrwałymi zapytaniami. Lepiej używać stronicowania i bardziej krótkich zapytań niż wielkich, długotrwałych zapytań.

+1

Potrzebowałem podniesienia limitu czasu do interaktywnej inspekcji podczas testów porównawczych. Tak więc "prawdziwa odpowiedź" jest w oku patrzącego ... ;-) –

6

Najnowsza wersja programu cassandra umożliwia określenie limitu czasu cqlsh podczas korzystania z niego, zamiast edytować plik cqlshrc.

cqlsh --request-timeout <your-timeout>