使用 cassandra 将 Spark 集成到现有应用程序中

Spark integration in existing application using cassandra

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

有几个问题:

  1. 在我们看来,Spark 是完成这项工作的正确工具,因为它具有 Spark Cassandra Connector and Spark CSV plugin。我们是对的吗?
  2. 可能是一个新手 Spark 问题,但是在我们的部署场景中,导入程序应该部署在哪里?我们的想法是让 Spark Master 在一个数据库节点上,Spark worker 分布在 3 个数据库节点上,而 importer 应用程序在主节点上。最好有一些命令行界面来导入 CSV,稍后可以演变成 API/web 界面。
  3. 我们可以将进口商应用程序放在应用程序服务器上吗?网络惩罚是什么?
  4. 我们能否在这种情况下将 Spark 用于 Cassandra JOINS 以及我们如何集成到已经使用常规 Datastax java 驱动程序的现有应用程序以及需要时的应用程序连接

首先,请记住,如果您从 Cassandra 而非外部源加载数据,Spark Cassandra Connector 仅对数据局部性有用。因此,要加载 CSV 文件,您必须使用共享存储或 HDFS 等将其传输到您的 Spark 工作人员。这意味着无论您将导入程序放置在何处,它都会将数据流式传输到您的 Spark 工作人员。

现在谈谈你的观点:

  1. 你对 Spark 的看法是正确的,但对 Spark Cassandra Connector 的看法是错误的,因为它只有在你从 Cassandra 加载数据时才有用(当你需要执行时,#4 可能就是这种情况)在外部数据和 Cassandra 数据之间加入),否则它不会给你任何显着的帮助。

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

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

  4. 使用Spark Cassandra Connector,您可以将Cassandra中的数据加载到相应本地节点上的RDD中,然后使用通过加载CSV数据创建的RDD,您可以执行Join,当然还可以写入如果需要,将结果返回给 Cassandra。您可以将 Spark Cassandra 连接器用作更高级别的工具来执行读取和写入,您不需要直接使用 Java 驱动程序(因为连接器无论如何都构建在它之上)。