Spark集成在现有的应用程序中使用cassandra



我们有一个应用程序服务器和3节点Cassandra集群的工作应用程序。最近,我们得到了新的需求导入大型CSV文件到我们现有的数据库。CSV中的行需要在保存到Cassandra之前进行转换。我们的基础设施部署在Amazon AWS上。

有几个问题:

    在我们看来,Spark是适合这项工作的工具,因为它有Spark Cassandra连接器和Spark CSV插件。我们对吗?
  1. 可能是Spark新手的问题,但在我们的部署场景中,应该在哪里部署importer app ?我们的想法是将Spark Master放在一个DB节点上,Spark worker分布在3个数据库节点上,并在Master所在的同一节点上导入应用程序。如果有一些命令行接口来导入CSV,这将是完美的,以后可以发展为API/web接口。
  2. 我们可以在应用服务器上放置进口商应用程序吗?网络惩罚是什么?
  3. 我们可以在这个场景中使用Spark来实现Cassandra join吗?如果需要,我们如何集成到已经使用常规Datastax java驱动程序和应用程序连接的现有应用程序中呢?

首先,请记住,Spark Cassandra连接器仅在从Cassandra加载数据而不是从外部源加载数据时才对数据局域性有用。因此,要加载CSV文件,你必须使用共享存储或HDFS等将其传输到Spark工作器。这意味着,无论你把导入器应用放在哪里,它都会把数据流式传输给spark Workers。

现在来谈谈你的观点:

  1. 你对Spark是正确的,但对Spark Cassandra连接器不正确,因为它只有在你从Cassandra加载数据时才有用(当你需要执行外部数据和Cassandra数据之间的连接时,可能是#4的情况),否则它不会给你任何重要的帮助。

  2. 您的导入器应用程序将被部署到您的集群。在您描述的场景中,这是一个独立的Spark Cluster。因此,您需要打包应用程序,然后在主节点上使用spark-submit命令部署应用程序。使用CSV文件位置的命令行参数,可以将应用程序作为普通命令行工具部署和运行。

  3. 如#2所述,您的导入器应用程序将从主节点部署到所有工作节点。这里重要的是CSV文件的位置。部署它的一种简单方法是跨工作节点拆分文件(使用相同的本地文件路径),并将其作为本地文件加载。但是要注意,如果节点死亡,您将丢失本地CSV部分。为了获得更可靠的分发,您可以将CSV文件放在HDFS集群上,然后从那里读取。

  4. 使用Spark Cassandra Connector,您可以将数据从Cassandra加载到相应本地节点上的rdd中,然后使用您通过加载CSV数据创建的rdd,您可以执行join,当然如果需要的话,还可以将结果写回Cassandra。你可以使用Spark Cassandra Connector作为一个更高级别的工具来执行读取和写入,你不需要直接使用Java Driver(因为连接器是建立在Java Driver之上的)。

相关内容

最新更新