1.4 配套工具

现在我们已经建立了一个技术栈,下面具体描述技术栈中的每个组件以及它们在Spark环境中的作用。1.4节是作为参考而不是供读者直接阅读的。如果你对大部分技术相当熟悉,可以快速浏览知识然后继续阅读第2章。

1.4.1 Apache HDFS

HDFS是一个内置冗余的分布式文件系统。在默认情况下,它在3个或更多节点上工作,尽管只有1个节点也能正常工作并且可以增加节点限制,这一机制为系统提供了在重复的块中存储数据的能力。因此每个文件不仅被分成很多数据块进行存储,而且还存储了这些数据块的3个副本。这一巧妙的机制不但提供了数据冗余(如果一个数据块丢失了还有其他两个数据块),也具有数据局部性。当在HDFS运行分布式作业时,系统不仅会收集输入该作业所需的数据相关的所有数据块,而且还会仅使用物理上靠近运行该作业的服务器的数据块,因此它可以仅使用本地存储中的数据块或者靠近该作业服务器节点上的数据块来降低网络带宽使用率。它的具体实现是将HDFS物理磁盘分配给节点,将节点分配到机架;块分别以节点本地、机架本地和集群本地的模式写入。HDFS的所有指令都通过名为NameNode的中央服务器传递,这就存在一个可能的中心故障点,但是相应地有多种方法可以提供NameNode冗余配置。

此外,在多租户HDFS使用场景中,当多个进程同时访问同一个文件,也可以通过使用多个块来实现负载均衡。例如,如果一个文件占用一个块,则该块被复制3次,因此可以同时从3个不同的物理位置读取数据。虽然这看上去不算一个巨大的优势,但是在有着成百上千个节点的集群上,网络I/O通常是正在运行的作业的最大限制因素。在数千个节点的集群上,因为大量的其他线程调用数据,而耗尽了网络带宽,导致作业需要数个小时才能完成。

如果你正在使用笔记本电脑,需要把数据存储在本地,或者希望使用已有的硬件,那么HDFS是一个不错的选择。

1.优点

下面介绍HDFS的优点。

  • 冗余:可配置的数据块复制提供了节点容错和硬盘容错。
  • 负载均衡:数据块复制意味着可以从不同的物理位置访问相同的数据。
  • 数据局部性:数据分析试图访问最近的相关物理块,以降低网络I/O。
  • 数据平衡:在数据块过于聚集或碎片化时,有可用的算法将数据块重新平衡。
  • 灵活存储:如果需要更多空间,可以往集群添加更多磁盘和节点;不过这一过程不是热添加的,需要中断运行集群来添加这些资源。
  • 额外费用:不需要第三方支出费用。
  • 数据加密:透明加密(在启用时)。

2.缺点

以下是HDFS的缺点。

  • 使用NameNode中央服务器产生了一个可能的中心故障点;为解决这一问题,可以启用第二NameNode节点和高可用选项。
  • 集群需要基本的管理和潜在的一些硬件开销。

3.安装

要使用HDFS,应该事先决定是以本地、伪分布式还是完全分布式的方式运行Hadoop;对于单个服务器来说,采用伪分布式方式非常有用,因为在这一方式下数据分析可以直接从当前服务器转换到任意的Hadoop集群。无论如何,安装Hadoop至少需要包括以下组件。

  • NameNode。
  • 第二NameNode(或者高可用NameNode)。
  • DataNode。

可以通过官方网站下载安装Hadoop。

Hadoop与Spark集成时,Spark需要知道Hadoop配置的位置,特别是以下文件的位置:hdfs-site.xml,core-site.xml。然后在Spark配置中对HADOOP_CONF_DIR配置参数进行设置。

然后就可以直接使用HDFS了,在Spark中可以用/user/local/dir/text.txt来直接访问hdfs://user/local/dir/text.txt文件。

1.4.2 亚马逊S3

S3解决了与并行性、存储限制和安全性相关的问题,以非常低的成本运行非常复杂的并行读写操作以及非常好的服务级别协议(SLA)。如果你需要快速启动与运行程序,但却无法在本地存储数据,或者不知道未来的存储需求,那么S3将是完美的选择。s3n和s3a是使用对象存储模型,而不是文件存储模型,因此需要做出妥协。

  • 最终一致性:当一个应用做出更改(创建、更新或删除)之后,经过一个不确定的时间延迟之后才会显现。不过现在大部分AWS区域已经支持写入后读取一致性。
  • s3n和s3a使用非原子的重命名和删除操作,因此对大目录进行重命名和删除所需的时间与目录内的条目数成比例。但在重命名和删除期间,目录内的条目仍然对其他进程保持可见,实际上,这种情况会持续到操作完成。

可以利用命令行工具(s3cmd)通过网页或利用大部分语言的API访问S3,可以进行一些简单的配置,将S3与Hadoop和Spark进行本地集成。

1.优点

下面介绍的是亚马逊S3的优点。

  • 无限的存储容量。
  • 无须考虑硬件。
  • 加密可用(用户保存密钥)。
  • 具有99.9%的可用性。
  • 提供冗余。

2.缺点

以下是亚马逊S3的缺点。

  • 需要存储和传输数据的费用。
  • 没有数据局部性。
  • 存在最终一致性。
  • 相对较高的延迟。

3.安装

可以在亚马逊AWS官网上创建一个AWS账户,通过这个账户,只需要创建凭证就可以访问S3了。

目前的S3标准是s3a,要想通过Spark使用它需要修改Spark配置:

spark.hadoop.fs.s3a.impl=org.apache.hadoop.fs.s3a.S3AFileSystem
spark.hadoop.fs.s3a.access.key=MyAccessKeyID
spark.hadoop.fs.s3a.secret.key=MySecretKey

如果使用HDP,还完成需要以下配置:

spark.driver.extraClassPath=${HADOOP_HOME}/extlib/hadoop-aws-
currentversion.jar:${HADOOP_HOME}/ext/aws-java-sdk-1.7.4.jar

然后,可以在S3对象引用前使用s3a://前缀来访问Spark中的所有S3文件:

Val rdd = spark.sparkContext.textFile("s3a://user/dir/text.txt")

如果已经设置了spark.hadoop.fs.s3a.impl,也可以使用内联的AWS凭证:

spark.sparkContext.textFile("s3a://AccessID:SecretKey@user/dir/file")

如果密钥中存在正斜杠符号/,这一方法就无法使用。通常的解决方法是从AWS获取另外的密钥来解决(一直生成新的密钥,直到密钥中不存在正斜杠符号),也可以通过AWS账户中S3选项卡下的网页界面浏览对象。

1.4.3 Apache Kafka

Apache Kafka是一个用Scala编写的分布式消息系统,可以在Apache软件基金会许可下使用。该项目旨在提供统一、高吞吐量、低延迟的平台,用于处理实时数据馈送。本质上它是一个灵活的大规模发布—订阅消息队列,这使得它对需要建立处理流数据的基础设施的企业来说非常有价值。

1.优点

下面介绍的是Apache Kafka的优点。

  • 是发布—订阅消息传送模式。
  • 容错率高。
  • 保证送达。
  • 失败时重发消息。
  • 高可扩展性,无共享架构。
  • 支持背压。
  • 延迟低。
  • 良好的Spark-streaming集成。
  • 对用户来说易于实现。

2.缺点

以下是Apache Kafka的缺点。

  • 至少一次语义——由于缺乏事务管理而不能提供精确的一次语义(译者注:0.11.×之后的Kafka已支持)。
  • 需要ZooKeeper才能运行。

3.安装

由于Kafka是发布—订阅工具,功能是管理消息(发布者)并将其指向相关的终点(订阅者),是用Kafka安装后提供的代理来具体实现的。Hortonworks HDP平台安装后Kafka就立即可用,也可以在Kafka官网上下载后单独安装。

Kafka使用ZooKeeper来管理领导节点选举(因为Kafka可以分布式安装从而允许冗余)。Kafka官网上的快速入门指南可以指导设置单节点ZooKeeper实例,还提供了一个客户端及消费者发布和订阅主题的消息处理机制范例。

1.4.4 Apache Parquet

自Hadoop诞生以来,基于列的格式(与基于行相反)的想法得到了越来越多的支持。因此为了利用压缩和高效的列数据表示形式,Parquet被开发出来,为复杂的嵌套数据结构而设计,这一算法的灵感来源于谷歌发表的介绍Dremel的论文《Dremel:网络规模数据集的交互式分析》(Dremel: Interactive Analysis of Web-Scale Datasets)。Parquet允许在每列上指定压缩方案,并且支持在未来新编码被实现时进行添加。它还被设计为在整个Hadoop生态系统中提供兼容性,而且与Avro一样,将数据模式与数据一起存储。

1.优点

下面介绍的是Apache Parquet的优点。

  • 列存储方式。
  • 高存储效率。
  • 每列压缩。
  • 支持谓词下推。
  • 支持列剪枝。
  • 与其他格式兼容,如Avro。
  • 读取效率高,专为部分数据检索而设计。

2.缺点

以下是Apache Parquet的缺点。

  • 不适合随机访问。
  • 写入有可能是计算密集型的。

3.安装

Parquet在Spark中是原生可用的,可以像下面这样直接访问:

val ds = Seq(1, 2, 3, 4, 5).toDS
ds.write.parquet("/data/numbers.parquet")
val fromParquet = spark.read.parquet("/data/numbers.parquet")

1.4.5 Apache Avro

Apache Avro最初是为Hadoop开发的数据序列化框架,它使用JSON来定义数据类型和协议(另外,接口描述语言也是可选的),并以紧凑的二进制格式序列化数据。Avro既提供持久性数据的序列化格式,也提供Hadoop节点之间以及客户端程序与Hadoop服务器之间通信的电报格式。它的另一个有用的特性是能够将数据模式与数据一起存储,因此无须引用外部源就可以读取任何Avro文件。此外,Avro支持模式演变,因此可以使用较新的模式版本读取旧模式版本编写的Avro文件,保持了向后兼容性。

1.优点

下面介绍的是Apache Avro的优点。

  • 支持模式演变。
  • 节省硬盘空间。
  • 支持JSON和接口描述语言(IDL)中的模式。
  • 支持多语言。
  • 支持压缩。

2.缺点

以下是Apache Avro的缺点。

  • 需要模式来读写数据。
  • 序列化数据的计算量很大。

3.安装

由于本书中使用Scala、Spark和Maven环境,因此可以用如下方式导入Avro:

<dependency>
   <groupId>org.apache.avro</groupId>
   <artifactId>avro</artifactId>
   <version>1.7.7</version> 
</dependency>

可以创建一个模式并生成Scala代码,并且可以使用该模式将数据写入Avro。第3章将对此进行详细说明。

1.4.6 Apache NiFi

Apache NiFi源自美国国家安全局(NSA),它作为NSA技术转让计划的一部分于2014年开源发布。NiFi可在简单的用户界面内生成可扩展的数据路由和转换的有向图,它还支持数据来源、众多的预构建处理程序,以及快速高效地构建新处理程序的能力。它具有优先级,可调传输容差和背压功能,允许用户根据特定要求调整处理程序和管道,甚至允许在运行时进行数据流修改。这些功能加起来,构成了一个非常灵活的工具,可以构建从一次性文件下载数据流到企业级ETL管道的所有流程。使用NiFi构建管道和下载文件通常比编写快速bash脚本更快,而这一方式还添加了功能丰富的处理程序,强烈推荐读者使用它。

1.优点

下面介绍的是Apache NiFi的优点。

  • 处理范围广泛。
  • 中心辐射型架构。
  • 图形用户界面(GUI)。
  • 可扩展。
  • 简化并行处理。
  • 简化线程处理。
  • 允许运行时修改数据流。
  • 通过集群进行冗余。

2.缺点

以下是Apache NiFi的缺点。

  • 没有跨领域的错误处理。
  • 仅部分实现表达式语言。
  • 缺乏流文件版本管理。

3.安装

Apache NiFi可以与Hortonworks一起安装,被称为Hortonworks数据流;也可以在Kafka的NiFi官网上下载后单独安装。第2章将对NiFi进行介绍。

1.4.7 Apache YARN

YARN是Hadoop 2.0的主要组成部分,它允许Hadoop插入处理范式,不局限于原始的MapReduce。YARN有3个主要组件:资源管理器、节点管理器和应用程序管理器。深入介绍YARN超出了本书的主要范围,我们要了解的重点是,如果运行一个Hadoop集群,那么Spark作业可以通过YARN在客户端模式下执行,如下所示:

spark-submit --class package.Class /
             --master yarn /
             --deploy-mode client [options] <app jar> [app options]

1.优点

下面介绍的是Apache YARN的优点。

  • 支持Spark。
  • 支持优先调度。
  • 支持数据局部性。
  • 作业历史存档。
  • 在HDP中开箱即用。

2.缺点

以下是Apache YARN的缺点。

  • 没有CPU资源控制。
  • 不支持数据沿袭。

3.安装

YARN可以作为Hadoop的一部分进行安装,也可以作为Hortonworks HDP、Apache Hadoop的一部分进行安装,或者作为其他供应商的一部分进行安装。无论如何,安装YARN至少应该包括以下组件。

  • 资源管理器。
  • 节点管理器(1个或更多)。

要确保Spark可以使用YARN,需要知道yarn-site.xml的位置,可以在Spark配置中对YARN_CONF_DIR配置参数进行设置。

1.4.8 Apache Lucene

Lucene最初是一个使用Java编写的索引和搜索库等工具,但现在已经应用于包括Python在内的其他几种语言上。Lucene孵化了许多子项目,包括Mahout、Nutch和Tika。现在这些项目已成为顶级Apache项目,而Solr最近成为Lucene的一个子项目。Lucene具有很多功能,而应用于问答搜索引擎和信息检索系统的功能尤为知名。

1.优点

下面介绍的是Apache Lucene的优点。

  • 高效的全文搜索功能。
  • 可扩展。
  • 支持多语言。
  • 出色的开箱即用功能。

2.缺点

Apache Lucene的缺点是数据库通常更适用于关系操作。

3.安装

想了解更多信息并直接与数据库交互,可以在Lucene官网上下载相关资料。

如果要使用Lucene,只需要在项目中包含lucene-core-<version>.jar即可,例如在使用Maven时,代码如下所示:

<dependency>
    <groupId>org.apache.lucene</groupId>
    <artifactId>lucene-core</artifactId>
    <version>6.1.0</version> 
</dependency>

1.4.9 Kibana

Kibana是一个分析与可视化平台,还提供图表和流数据汇总。因为它将Elasticsearch作为其数据源(后者又使用Lucene),所以有着非常强的大规模搜索和索引能力。Kibana能以多种方式对数据进行可视化,包括条形图、直方图和地图等。本章末尾简要介绍Kibana,它将在本书中广泛使用。

1.优点

下面介绍Kibana的优点。

  • 大规模地可视化数据。
  • 具有直观的界面,可以快速开发仪表盘。

2.缺点

以下是Kibana的缺点。

  • 仅与Elasticsearch集成。
  • Kibana版本仅与相应的特定Elasticsearch版本相配套。

3.安装

Kibana有自己的Web服务器,因此用户可以很容易地在Kibana的官网上下载后单独安装。由于Kibana需要Elasticsearch,因此还需要安装对应版本的Elasticsearch,具体细节请参阅Kibana官网。Kibana的配置在config/kibana.yml中修改。

1.4.10 Elasticsearch

Elasticsearch是一个基于Lucene(见前文介绍)和Web的搜索引擎,它提供了面向模式自由JSON文档的分布式、多租户全文搜索引擎。它是用Java编写的,但用户可以用任意语言使用其HTTP Web接口,这使它特别适用于处理事务或执行数据密集型指令并通过网页展示结果。

1.优点

下面介绍的是Elasticsearch的优点。

  • 分布式。
  • 模式自由。
  • HTTP接口。

2.缺点

以下是Elasticsearch的缺点。

  • 缺乏前端工具。

3.安装

可以在Elastic官网上下载Elasticsearch,要对REST API进行访问,可以导入Maven依赖项:

<dependency>
    <groupId>org.elasticsearch</groupId>
    <artifactId>elasticsearch-spark_2.10</artifactId>
    <version>2.2.0-m1</version> 
</dependency>

有一个很好的工具可以帮助你管理Elasticsearch内容,就是在谷歌浏览器应用商店中下载谷歌浏览器插件Sense(译者注:Sense插件已经被谷歌浏览器应用商店下架,建议改用Kibana控制台,如确定需要使用Sense请在GitHub官方网站搜索sense-chrome,然后根据说明安装使用)。

1.4.11 Accumulo

Accumulo是一个基于Google Bigtable设计的No SQL数据库,最初由美国国家安全局开发,随后于2011年发布到Apache社区。Accumulo提供了常用的大数据处理技术,如批量加载和并行读取、用于高效服务器和客户端预计算的迭代器、数据聚合,最重要的是还具有单元级安全性。Accumulo的安全性使其对企业级应用来说非常有用,因为它可以在多租户环境中具有灵活的安全性。Accumulo和Kafka一样由Apache ZooKeeper提供支持,它还使用了Apache Thrift来提供跨语言远程过程调用(RPC)功能。

1.优点

下面介绍的是Accumulo的优点。

  • Google Bigtable的纯净实现。
  • 具有单元级安全性。
  • 可扩展。
  • 提供冗余。
  • 为服务端计算提供迭代器。

2.缺点

以下介绍Accumulo的缺点。

  • 在开发运维人员使用的技术中ZooKeeper不算流行。
  • 对于批量关系操作,不能保证Accumulo一直是最佳的选择。

3.安装

Accumulo可以作为Hortonworks HDP的一部分安装,也可以在Apache的Accumulo官网上下载后单独安装。在编写实例时需要根据Accumulo官网上的安装文档进行配置。

第7章将演示如何通过Spark来使用Accumulo,以及类似迭代器和输入格式的高级功能,还将展示如何在Elasticsearch和Accumulo之间处理数据。