在spark集群上完成时,session.execute()没有反映在cassandra上

时间:2016-04-28 07:16:31

标签: apache-spark cassandra spark-cassandra-connector

我正在运行一个spark作业,其中一些数据是从cassandra表加载的。从该数据,我做了一些插入和删除语句。 并执行它们。 (使用forEach)

boolean deleteStatus= connector.openSession().execute(delete).wasApplied();
boolean  insertStatus = connector.openSession().execute(insert).wasApplied();
System.out.println(delete+":"+deleteStatus);
System.out.println(insert+":"+insertStatus);

当我在本地运行时,我会在表格中看到相应的结果。

但是,当我在群集上运行它时,有时会显示结果,有时不会发生更改。 我看到了来自web-ui of spark的stdout,并且为两个查询打印了查询以及true。(数据已正确加载。但有时,只反映插入,有时只删除,有时两者都是,大多数没有时间。)

规格:

  1. 与cassandra节点在同一台机器上的火花从机。(每个节点有两个从机实例。)
  2. 在另一台机器上点火。
  3. 在所有节点上完成修复。
  4. Cassandra重启

1 个答案:

答案 0 :(得分:0)

  

boolean deleteStatus = connector.openSession()。execute(delete).wasApplied();

     

boolean insertStatus = connector.openSession()。execute(insert).wasApplied();

这是一个已知的反模式,您为每个查询创建一个新的Session对象,这是非常昂贵的。

只需创建一次会话,然后将其重新用于所有查询。

要查看正在执行哪些查询并将其发送到Cassandra,请使用慢速查询记录器功能作为黑客攻击:http://datastax.github.io/java-driver/manual/logging/#logging-query-latencies

我们的想法是将阈值设置为一个非常低的值,这样每个查询都会被视为慢速并显示在日志中。

您应该仅将此hack用于测试