由于apachespark是cassandra推荐的分布式处理引擎,我知道可以将spark执行器与cassandra节点一起运行。我的问题是,驱动程序和spark连接器是否足够聪明,能够理解分区和碎片分配,从而以超聚合的方式处理数据。
简单地说,executors是否从运行executor的节点上托管的分区读取存储的数据,这样就不会像spark在hdfs上运行时那样通过网络传输不必要的数据?
由于apachespark是cassandra推荐的分布式处理引擎,我知道可以将spark执行器与cassandra节点一起运行。我的问题是,驱动程序和spark连接器是否足够聪明,能够理解分区和碎片分配,从而以超聚合的方式处理数据。
简单地说,executors是否从运行executor的节点上托管的分区读取存储的数据,这样就不会像spark在hdfs上运行时那样通过网络传输不必要的数据?
3条答案
按热度按时间7hiiyaii1#
是的,SparkCassandra连接器能够做到这一点。从源代码:
这个
getPreferredLocations
方法告诉spark从中获取分区的首选节点,以便分区的数据位于任务发送到的同一节点。如果cassandra节点与spark节点并置,则查询总是发送到与spark executor进程在同一节点上运行的cassandra进程,因此数据不会在节点之间传输。如果cassandra节点在读取过程中失败或过载,则会将查询重试到其他节点。gopyfrb32#
我想补充亚历克斯的回答:
是的,SparkCassandra连接器能够做到这一点。从源代码:
getpreferredlocations方法告诉spark要从中获取分区的首选节点,以便分区的数据位于任务发送到的同一节点上。如果cassandra节点与spark节点并置,则查询总是发送到与spark executor进程在同一节点上运行的cassandra进程,因此数据不会在节点之间传输。如果cassandra节点在读取过程中失败或过载,则会将查询重试到其他节点。
这是一种不好的行为。
在cassandra中,当您请求获取特定分区的数据时,只访问一个节点。由于采用了复制技术,spark实际上可以访问3个节点。因此,在没有shuffelling的情况下,您有3个节点参与作业。
然而,在hadoop中,当您请求获取特定分区的数据时,通常访问集群中的所有节点,然后spark使用集群中的所有节点作为执行器。
所以如果你有100个节点:在cassandra中,spark将利用3个节点。在hadoop中,spark将利用100个节点。
cassandra针对实时操作系统进行了优化,因此没有针对数据湖之类的分析进行优化。
ilmyapht3#
理论上是的。hdfs也一样。但实际上,我在云上看到的较少,在使用spark和cassandra的云服务时,它们使用了单独的节点。如果您使用iasas并设置自己的cassandra和spark,那么您就可以实现它。