Apache spark spark如何在cassandra表之间复制数据?

Apache spark spark如何在cassandra表之间复制数据?,apache-spark,pyspark,cassandra,cassandra-3.0,spark-cassandra-connector,Apache Spark,Pyspark,Cassandra,Cassandra 3.0,Spark Cassandra Connector,在cassandra中,当从一个表中读取数据并将其写入另一个表时,有人能解释一下spark的内部工作原理吗 以下是我的用例: 我通过卡夫卡主题将来自物联网平台的数据输入卡桑德拉。我有一个小的python脚本,它解析来自kafka的每条消息以获得它所属的表名,准备一个查询并使用datastax的cassandra python驱动程序将其写入cassandra。有了这个脚本,我可以每分钟摄取大约300000条记录到cassandra中。然而,我的传入数据速率是510000条记录/分钟,因此卡夫卡消

在cassandra中,当从一个表中读取数据并将其写入另一个表时,有人能解释一下spark的内部工作原理吗

以下是我的用例:

我通过卡夫卡主题将来自物联网平台的数据输入卡桑德拉。我有一个小的python脚本,它解析来自kafka的每条消息以获得它所属的表名,准备一个查询并使用datastax的cassandra python驱动程序将其写入cassandra。有了这个脚本,我可以每分钟摄取大约300000条记录到cassandra中。然而,我的传入数据速率是510000条记录/分钟,因此卡夫卡消费者延迟持续增加

Python脚本已经在并发调用cassandra。如果我增加python执行器的数量,cassandra驱动程序就会开始失败,因为cassandra节点对它不可用。我假设我在那里每秒打卡桑德拉电话的次数是有限的。以下是我收到的错误消息:

ERROR Operation failed: ('Unable to complete the operation against any hosts', {<Host: 10.128.1.3 datacenter1>: ConnectionException('Pool is shutdown',), <Host: 10.128.1.1 datacenter1>: ConnectionException('Pool is shutdown',)})"
版本:

  • 卡桑德拉3.9
  • 火花2.1.0
  • Datastax的spark cassandra连接器2.0.1
  • Scala版本2.11
群集:

  • 使用3个辅助节点和1个主节点进行Spark设置
  • 3个工作节点还安装了cassandra群集。(每个cassandra节点都有一个spark worker节点)
  • 每个工人允许使用10 GB ram和3个内核
所以我想知道:

  • spark是先从cassandra读取所有数据,然后将其写入新表,还是spark cassandra connector中存在某种优化,允许它在cassandra表中移动数据而不读取所有记录

  • 如果我将python脚本替换为spark streaming作业,在该作业中我解析数据包以获取cassandra的表名,这会帮助我更快地将数据摄取到cassandra中吗


Spark connector经过优化,因为它可以并行处理数据并将数据读取/插入到拥有数据的节点中。使用Cassandra Spark连接器可能会获得更好的吞吐量,但这需要更多资源

谈到您的任务-300000次插入/分钟等于5000次/秒,坦率地说,这不是一个很大的数字-您可以通过实施不同的优化来提高吞吐量:

  • 用于提交请求。您只需要确保您提交了更多可以由一个连接处理的请求(但您也可以增加这个数字——我不知道如何在Python中实现,但请检查一下以了解情况)
  • 使用正确的一致性级别(
    LOCAL\u ONE
    应该会给您带来非常好的性能)
  • 正确使用
  • 您可以并行运行脚本的多个副本,确保它们都在同一个卡夫卡消费者组中

谢谢。我将尝试这些优化。我已经在使用异步调用了。我也在使用python的并发库,它允许我在同一个脚本中有多个执行器。但是,当我将执行者的数量从某个数字(比如7)增加时,我开始“无法针对任何主机完成操作”错误。就像节点已脱机一样。这可能是因为我达到了cassandra呼叫数限制吗?您需要检查cassandra端的日志,以了解其原因。很可能是节点过载了,但可能有很多原因——这取决于您在编写时使用的一致性级别,等等。
df = spark.read\
    .format("org.apache.spark.sql.cassandra")\
    .options(table=sourcetable, keyspace=sourcekeyspace)\
    .load().cache()

df.createOrReplaceTempView("data")

query = ("select dev_id,datetime,DATE_FORMAT(datetime,'yyyy-MM-dd') as day, " + field + " as value  from data  " )

vgDF = spark.sql(query)
vgDF.show(50)
vgDF.write\
    .format("org.apache.spark.sql.cassandra")\
    .mode('append')\
    .options(table=newtable, keyspace=newkeyspace)\
    .save()