65.9K
CodeProject 正在变化。 阅读更多。
Home

Apache Spark/Cassandra 1 of 2

starIconstarIconstarIconstarIconstarIcon

5.00/5 (11投票s)

2016年1月20日

CPOL

14分钟阅读

viewsIcon

28887

一起看 Spark/Cassandra 的协同工作

系列链接

目录

引言

距离我上次写文章已经有一段时间了,但我想不出有什么比在 2016 年开始时写一篇文章更好的方式了。

本文是(计划中的)两部分文章系列的第一篇。该系列将向您展示如何将两项出色的技术结合使用。即 Apache Cassandra 和 Apache Spark。

本文将引导您完成如何将 Apache Cassandra 作为单节点安装(非常适合玩耍)。而下一篇文章将基于我之前关于 Apache Spark 的文章,并教您如何将 Cassandra 和 Spark 一起使用。

 

什么是 Apache Spark

自从我之前写过 Apache Spark(https://codeproject.org.cn/Articles/1023037/Introduction-to-Apache-Spark)后,我将简单地重申我在那篇文章中所说的内容。我将使用那篇文章来修改以使其与 Cassandra 交互。

这是 Apache Spark 的创建者对他们自己工作的评价。

Apache Spark 是一个快速、通用的集群计算系统。它提供 Java、Scala、Python 和 R 的高级 API,以及支持通用执行图的优化引擎。它还支持丰富的更高级工具,包括用于 SQL 和结构化数据处理的 Spark SQL、用于机器学习的 MLlib、用于图处理的 GraphX 和 Spark Streaming。

 

https://spark.apache.ac.cn/docs/latest/index.html 更新于 2016/01/20

 

嗯,想要更多一点的介绍,试试这个

在高层次上,每个 Spark 应用程序都包含一个运行用户 main 函数的驱动程序,并在集群上执行各种并行操作。Spark 提供的核心抽象是弹性分布式数据集(RDD),它是一个分区在集群节点上的元素的集合,可以并行操作。RDD 是通过 Hadoop 文件系统(或任何其他 Hadoop 支持的文件系统)中的文件或驱动程序中的现有 Scala 集合开始,并对其进行转换而创建的。用户还可以要求 Spark 将 RDD 持久化到内存中,以便在并行操作中高效地重用。最后,RDD 可以自动从节点故障中恢复。

Spark 中的第二个抽象是可以在并行操作中使用的共享变量。默认情况下,当 Spark 在不同节点上以一组任务的形式并行运行函数时,它会将函数中使用的每个变量的副本发送到每个任务。有时,变量需要在任务之间,或在任务和驱动程序之间共享。Spark 支持两种类型的共享变量:广播变量,可用于将值缓存到所有节点上的内存中;以及累加器,它们是仅可供使用的变量,例如计数器和求和。

 Spark 编程指南 更新于 2015/08/24

 

如果您是喜欢图表的人,这张图或许能帮到您

 

所以这就是他们对它的评价。这里有几个我自己的要点,或许也有帮助

  • Spark 提供了一个通用的抽象:弹性分布式数据集(RDD)
  • Spark 提供了一个类似 LINQ 的语法,您可以实际地将其分布在多个工作节点上(跨多个节点的类似 LINQ 的语法,想想看,这就像,哇!)
  • Spark 提供容错功能
  • Spark 提供与本地运行相同的 API,与在集群中运行相同,这使得尝试事物变得非常容易
  • Spark 提供相当简单的 API
  • 非常活跃的社区
  • 坦白说,这是一个非常出色的产品

 

下图说明了当前的 Apache Spark 产品。图中的每个深蓝色块都代表一个略有不同的产品,例如:

  • Spark SQL:允许查询结构化数据,例如 JSON 到 RDD(这意味着您可以对 JSON 有效地运行 RDD 操作)
  • Spark Streaming:允许对数据进行时间上的微批处理(窗口缓冲区、大小缓冲区、滑动缓冲区等),其中在缓冲区中接收的数据呈现为列表。这使得处理非常容易。Spark Streaming 有许多源,例如:
    • 套接字 (Sockets)
    • Kafka
    • Flume
    • Zero MQ

 

 

所有这些的基础都是通用的抽象(弹性分布式数据集(RDD))。所以,让我们继续谈谈 RDD。

 

 

什么是 Apache Cassandra

这是 Cassandra 的创建者所说的(见 https://cassandra.apache.ac.cn/ 更新于 2016/01/20)

 

当您需要可伸缩性和高可用性而不牺牲性能时,Apache Cassandra 数据库是正确的选择。在商用硬件或云基础设施上实现线性可伸缩性和经过验证的容错能力,使其成为关键任务数据的理想平台。Cassandra 对跨多个数据中心的复制的支持是顶级的,为用户提供更低的延迟,并让您安心知道可以承受区域性中断。

Cassandra 的数据模型提供了列索引的便利性、日志结构更新的性能、对反规范化和物化视图的强大支持,以及强大的内置缓存。

经过验证

Cassandra 已被 Constant Contact、CERN、Comcast、eBay、GitHub、GoDaddy、Hulu、Instagram、Intuit、Netflix、Reddit、The Weather Channel 以及其他 1500 多家拥有大型、活跃数据集的公司使用。

最大的生产部署之一是 Apple 的,拥有超过 75,000 个节点,存储超过 10 PB 的数据。其他大型 Cassandra 安装包括 Netflix(2,500 个节点,420 TB,每天超过 1 万亿次请求)、中国搜索引擎 Easou(270 个节点,300 TB,每天超过 8 亿次请求)以及 eBay(超过 100 个节点,250 TB)。

容错

数据会自动复制到多个节点以实现容错。支持跨多个数据中心的复制。故障节点可以替换,不会造成停机。

高性能

在基准测试和实际应用中,Cassandra 的性能始终优于流行的 NoSQL 替代品,这主要是由于其基本的架构选择。

分布式

没有单点故障。没有网络瓶颈。集群中的每个节点都是相同的。

持久性
Cassandra 适用于即使整个数据中心发生故障也无法承受数据丢失的应用程序。

尽在掌控
为每次更新选择同步或异步复制。高度可用的异步操作通过 Hinted Handoff 和 Read Repair 等功能进行优化。

弹性
随着新机器的添加,读写吞吐量都呈线性增长,而不会导致停机或应用程序中断。

所以这就是它的宣传卖点,但它究竟是做什么用的呢?

 

好吧,我将用我自己的话来解释,所以如果您是 Cassandra 的资深用户,并且读到这里认为“等等,这纯粹是胡说八道”,请尽管指出。

Cassandra 涉足几个领域,它支持 NoSQL,并且很快将支持原生 JSON。这是其中一点,但它远不止于此,它在一个具有跨节点复制的容错集群中运行,因此它非常持久。它还有一个主节点的概念(如果主节点出现故障,可以由另一个节点取代)。

所有这些都很棒,但 Cassandra 的酷之处在于它本质上是一个分布式哈希表,其中“环”中的每个节点都将持有令牌(分区键)。

这张图或许能帮助说明这一点

点击查看大图

 

这使得超快速查找成为可能,前提是您的模型正确,这也是 Cassandra 对您编写的查询类型有些挑剔的原因之一。如果您有 PB 级的数据,您不希望遍历每个节点来获取数据。Cassandra 会尽量在这方面帮助您,让您无法进行无界查询。

使用 Cassandra 进行数据建模的技术对于本文来说有点超出范围,但如果这类东西让您感兴趣,您应该参加这个免费课程: https://academy.datastax.com/courses/ds220-data-modeling

Cassandra 的另一个优点是它使用的 gossip 协议,用于确保节点互相了解彼此及其状态。您可以在这里阅读更多关于此的信息: http://docs.datastax.com/en/cassandra/2.0/cassandra/architecture/architectureGossipAbout_c.html

现在,这一切都是好消息,但使用 Cassandra 是否有什么缺点?当然有。

  • 您不能随便进行 Cassandra 的安装,它需要经过周密的考虑和极好的建模。
  • 它没有任何真正的 ORM 支持
  • 存在 CAP 定理的概念,如下所示,它规定您可以选择三角形的 2 个边,您必须接受这一点。

 

点击查看大图

 

如上所示,Cassandra 属于 A/P 阵营。

 

为什么要一起使用 Cassandra 和 Spark 

好的,如果您读到这里,说明您足够感兴趣想了解更多。那么,为什么会同时使用 Apache Spark 和 Apache Cassandra 呢?让我们停下来想一分钟。我已经说过,这两个工具的典型设置是在集群中运行。现在,如果我们使用相同的机器来运行 Spark + Cassandra 呢?也就是说,集群中的每台机器都将同时运行 Spark + Cassandra。

有趣。您会在实际生活中这样做吗?是的,当然。运行这种设置实际上有几个非常好的原因。

  1. Spark RDD 的结果可以使用 Spark 本身保存到磁盘,但如果您将数据库(即 Cassandra)引入其中,我们可以对这些结果做各种事情,例如报告、转换等。
  2. 数据局部性。这利用了您可能最终运行一个集群的事实,即您在同一台物理机器上拥有一个 Spark 节点和一个 Cassandra 节点。数据将更容易访问,spark/Cassandra 驱动程序有一些智能功能可以利用数据局部性。

 

入门

本节将引导您如何在 Windows 机器上本地安装 Cassandra。这将是一个单节点 Cassandra 安装,这并不是您在生产环境中会使用的,但对于玩耍和弄明白 Apache Spark,这足以让您理解其中的概念。

 

必备组件

在继续进行本文的其余设置之前,您必须确保已安装以下软件:

  • Java JRE
  • Java JDK

 

安装 Apache Cassandra

我主要是一名 Windows 用户,在尝试新事物时,我通常会尝试做最简单的事情,对于 Cassandra 来说,这意味着安装 DataStax 社区版(免费),并且这是在独立机器上尝试 Cassandra 的一种非常简单的方法。

显然不会为实际的生产环境这样做,您会使用一台 Linux 集群机器来托管 Cassandra 实例。

事实上,在您自己的 Windows PC 上快速做到这一点的一种方法是使用虚拟机镜像软件 Vagrant 来快速启动一个集群。

这里有一些不错的

如果您从未听说过 Vagrant,您应该在这里了解更多:https://www.vagrantup.com/

好了,我们先不跑题,我们要设置一个 Windows 上的单节点实例(为了简单起见)。

 

在 Windows PC 上安装单节点 Cassandra 实例

从这里获取 DataStax 社区版:http://www.planetcassandra.org/cassandra/. 我选择了 64 位版本的 MSI,我只是下载了最新版本的 MSI。

我简单地按照 MSI 安装程序进行操作,并确保 OpsCenter 设置为自动启动。

这里有一些关于整个过程的良好说明/截图。

http://www.datastax.com/2012/01/getting-started-with-apache-cassandra-on-windows-the-easy-way

安装 DataStax 社区版时,您会获得一些很棒的功能:

  • CqlSh 已为您安装,您可以使用“Cassandra CQL Shell”启动它,运行时应该会看到类似这样的内容:

点击查看大图

 

点击查看大图

 

  • 可以启动和停止 Cassandra/OpsCenter 服务

点击查看大图

 

 

 

DataStax 开发中心

现在我们已经完成了一个非常简单/低维护的 Cassandra 安装(请记住,这只是为了玩耍,我们不会这样做用于实际生产,我们会创建一个 Linux 集群),是时候添加查询我们 Cassandra 安装的功能了。

有两个工具可以做到这一点:Cqlsh,CQL 脚本宿主,一个命令行实用程序。它还可以,但如果您刚开始,您可能想要更直观的东西。

幸运的是,还有一个 DataStax 工具叫做 Dev Center,您可以从这里下载:

https://academy.datastax.com/downloads/ops-center?destination=downloads/ops-center&dxt=DevCenter#devCenter

 

确保下载与您的 Java 安装匹配的版本。例如,我运行的是 64 位版本的 Java,所以我需要下载 64 位版本的 Dev Center 安装程序。如果不遵循此建议,DevCenter.exe 很可能无法正常运行。

这个工具有点像 SQL Server Enterprise Manager,虽然功能远不如它丰富,而且它会消耗大量内存来运行,这很奇怪,因为它在我看来并没有做什么太多的事情。

所以,一旦您下载了正确版本的 DataStax DevCenter,您将得到一个 zip 文件,对我来说,它叫做“DevCenter-1.5.0-win-x86_64.zip”。所以只需将其解压缩到某个地方。

所以一旦您解压缩了下载的 zip 文件,您应该会看到类似这样的内容:

所以现在我们已经解压好了,我们应该可以通过单击 DevCenter.exe 图标来运行该应用程序。这样做应该会运行应用程序,如果运行正常,应该看起来是这样的:

点击放大图

请注意,还没有活动连接。我们将在下一步设置连接。

 

检查我们的安装

好的,让我们回顾一下我们到目前为止所做的事情:

  1. 您已安装 Java JRE(如果尚未安装)
  2. 您已安装 Java JDK(如果尚未安装)
  3. 我们获取并安装了 DataStax 社区版(并悄悄注明我们不会为生产环境这样做,我们会是个好人,会设置一个不错的 Linux 集群)
  4. 我们获取并解压缩了 DataStax DevCenter。
  5. 我们运行了 DataStax DevCenter。

一切都很好,但我们需要测试 Cassandra 的安装。那么,让我们这样做。

 

让我们再次启动 DevCenter。让我们创建一个新连接,这和按照这些截图操作一样简单。我应该指出,我的笔记本电脑是 QHD 分辨率,这就是为什么截图按钮看起来很奇怪。对于我来说,很多应用程序都是这样的,真是的,*. 我应该指出,我的笔记本电脑有 QHD 分辨率,这就是为什么截图按钮看起来很奇怪。这是应用程序在我身上看起来的样子,一个现代的好笔记本电脑。真是的。对我来说,很多应用程序都是这样的。*

 

点击新建连接按钮

点击查看大图

 

填写本地主机地址,然后点击“添加”按钮。

点击查看大图

 

只需完成向导。

点击查看大图

 

右键单击新连接,然后选择“打开连接”。

 

然后使用 File -> New -> Keyspace 菜单项。

点击查看大图

 

为 keyspace 命名。

点击查看大图

 

我选择将其脚本化到一个新窗口,这样我们就可以从 DevCenter 中运行它。

点击查看大图

 

从 DevCenter 运行它。

点击查看大图

 

 

如果一切正常,我们应该会在列表中看到一个新的 KeySpace。

 

 

如果您到达最后一步,那么您就成功安装了 Cassandra。做得好。

 

 

就这些

下次我们将使用我之前写的一个小的 Apache Spark 演示项目,并对其进行修改,以便从 Apache Cassandra 加载/保存数据。

© . All rights reserved.