Cassandra在阻止同步请求的多个进程中同步执行

时间:2015-08-20 23:36:17

标签: python database cassandra multiprocessing cql

我有一个应用程序,它读取一系列包含道路车辆通道日志的XML文件。然后,应用程序处理每个记录,转换一些信息以匹配数据库列并将其插入到cassandra数据库中(在远程服务器中运行单个节点[它在内部网络中,因此连接不是'真的是一个问题])。在数据库中插入数据之后,每个文件的进程继续读取此数据并生成摘要表的信息,这使得信息可以在应用程序的不相关部分中进行深入分析。

我使用多处理并行处理多个XML文件,而我遇到的麻烦就是与cassandra服务器进行通信。示意性地,该过程如下:

  1. 从XML文件中读取记录
  2. 处理记录的数据
  3. 将处理后的数据插入数据库(使用.execute_async(query)
  4. 重复1到3,直到XMl文件结束
  5. 等待我所做的所有插入查询的响应
  6. 从数据库中读取数据
  7. 处理读取数据
  8. 将已处理的数据插入摘要表
  9. 现在,这在多个并行流程中顺利运行,直到一个流程继续执行到第6步,其请求(使用.execute(query)生成的请求,这意味着我将等待响应)总是面临超时。我收到的错误是:

     Process ProcessoImportacaoPNCT-1:
    Traceback (most recent call last):
      File "C:\Users\Lucas\Miniconda\lib\multiprocessing\process.py", line 258, in _bootstrap
        self.run()
      File "C:\Users\Lucas\PycharmProjects\novo_importador\app\core\ImportacaoArquivosPNCT.py", line 231, in run
        core.CalculoIndicadoresPNCT.processa_equipamento(sessao_cassandra, equipamento, data, sentido, faixa)
      File "C:\Users\Lucas\PycharmProjects\novo_importador\app\core\CalculoIndicadoresPNCT.py", line 336, in processa_equipamento
        desvio_medias(sessao_cassandra, equipamento, data_referencia, sentido, faixa)
      File "C:\Users\Lucas\PycharmProjects\novo_importador\app\core\CalculoIndicadoresPNCT.py", line 206, in desvio_medias
        veiculos = sessao_cassandra.execute(sql_pronto)
      File "C:\Users\Lucas\Miniconda\lib\site-packages\cassandra\cluster.py", line 1594, in execute
        result = future.result(timeout)
      File "C:\Users\Lucas\Miniconda\lib\site-packages\cassandra\cluster.py", line 3296, in result
        raise self._final_exception
    ReadTimeout: code=1200 [Coordinator node timed out waiting for replica nodes' responses] message="Operation timed out - received only 0 responses." info={'received_responses': 0, 'required_responses': 1, 'consistency': 'ONE'}
    

    我已将服务器中的超时更改为荒谬的时间(例如500000000毫秒),并且我还尝试使用.execute(query, timeout=3000)在客户端中设置超时限制,但仍然没有成功。

    现在,当更多进程遇到同样的问题并且多个进程中步骤1-3的强烈写入停止时,进入步骤6的最后进程已成功遵循该过程,这让我觉得问题是cassandra优先考虑我每秒要求的成千上万个插入请求,并忽略我的读取请求或将其放回到行中。

    在我看来,解决这个问题的一种方法是,无论如何我都可以要求cassandra优先考虑我的读取请求,以便我可以继续处理,即使这意味着减慢其他进程。

    现在,作为旁注,您可能认为我的流程建模不是最优的,我很乐意听到有关此的意见,但对于此应用程序的实际情况,在我们的愿景中,这是最佳方式继续。所以我们实际上已经广泛地考虑过优化过程,但是(如果cassandra服务器可以处理它),这对我们的现实来说是最佳的。

    所以,TL; DR:在执行成千上万的异步查询时,有没有办法优先考虑查询?如果没有,是否有办法以请求不超时的方式每秒执行数万个插入查询和读取查询?另外,你建议我做什么来解决这个问题?并行运行较少的流程显然是一种解决方案,但我试图避免这种解决方案。所以,很想听听每个人的想法。

    在插入时存储数据,所以我不需要再次阅读它以获取摘要是不可能的,因为XML文件很大并且内存是个问题。

1 个答案:

答案 0 :(得分:5)

我不知道如何优先阅读查询。我相信内部Cassandra有独立的线程池用于读写操作,因此它们并行运行。如果没有看到您正在进行的架构和查询,很难说您是否正在进行非常昂贵的读取操作,或者如果系统如此淹没了写入而无法跟上阅读。

您可能希望在应用程序运行时尝试监控Cassandra中正在发生的事情。您可以使用多种工具来监控正在进行的操作。例如,如果你ssh到你的Cassandra节点并运行:

watch -n 1 nodetool tpstats

这将显示线程池统计信息(每秒更新一次)。您将能够查看队列是否正在填满或操作是否被阻止。如果有任何" Dropped"柜台增加,这表明你没有足够的能力来做你想做的事情。如果是这种情况,那么通过添加更多节点来增加容量,或者更改您的架构和方法,以便节点可以做的工作量更少。

要监控的其他有用的东西(在linux上使用watch -n 1连续监控):

nodetool compactionstats
nodetool netstats
nodetool cfstats <keyspace.table name>
nodetool cfhistograms <keyspace> <table name>

使用top和iostat等linux命令监视节点也很好,可以检查CPU利用率和磁盘利用率。

根据您的说法,我的印象是您的单个节点没有足够的容量来完成您提供的所有工作,因此您需要每单位时间处理更少的数据,或者添加更多Cassandra节点分散工作量。

由于分区行太多,我目前面临自己的超时错误,因此我可能需要在分区键中添加基数,以使每个分区的内容变小。