我有一个dse集群,集群中的每个节点都运行spark和cassandra。
当我从cassandra加载数据到sparkrdd并对rdd执行一些操作时,我知道数据将被分发到多个节点。在我的例子中,我想把这些RDD从每个节点直接写到它的本地cassandra db表中,不管怎样都可以做到。
如果我进行正常的rdd收集,来自spark节点的所有数据都将被合并并返回到带有驱动程序的节点。我不希望发生这种情况,因为从节点返回驱动程序节点的数据流可能需要很长时间,我希望数据直接保存到本地节点,以避免数据跨spark节点移动。
2条答案
按热度按时间x6h2sr281#
警告:我只使用cassandra和spark作为独立的开源项目,我没有dse方面的专业知识。
我担心数据需要通过网络进行复制,即使每个spark节点都与本地cassandra节点通信。
如果没有复制和运行spark作业来确保所有数据都散列并预散列到相应的cassandra节点,那么应该可以使用127.0.0.1:9042并避免网络。
ddarikpa2#
当spark executor从cassandra读取数据时,它会将请求发送到根据不同因素选择的“最佳节点”:
当spark与cassandra并置时,spark试图从同一个节点提取数据
当spark位于不同的节点上时,它使用令牌感知路由,并按照分区范围的定义并行地从多个节点读取数据。
在写入时,如果有多个执行器,那么每个执行器将打开到每个节点的多个连接,并使用令牌感知路由写入数据,这意味着数据将直接发送到其中一个副本。另外,spark正在尝试将属于同一分区的多个行批处理到一个未标记的批处理中,因为它的性能更好。即使spark分区与cassandra分区是同一位置的,当scc使用一致性级别2进行写入时,写入也可能涉及额外的网络开销。
如果将数据重新分区以匹配cassandra的分区,则可以获得共定位的数据),但这种重新分区可能会导致spark shuffle,与将数据从executor写入另一个节点相比,它可能更为繁重。
p、 你可以在russell spitzer的博客中找到很多关于spark cassandra连接器的附加信息。