ES实战ES-Hadoop之关键特性要求安装核心架构

Posted 顧棟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ES实战ES-Hadoop之关键特性要求安装核心架构相关的知识,希望对你有一定的参考价值。

文章目录

Key features

部分的特性:

  • Scalable Map/Reduce model可扩展的 Map/Reduce 模型

    elasticsearch-hadoop 是围绕 Map/Reduce 构建的:在 elasticsearch-hadoop 中完成的每个操作都会导致多个与 Elasticsearch 并行交互的 Hadoop 任务(基于目标分片的数量)。

  • REST based

    elasticsearch-hadoop 使用 Elasticsearch REST 接口进行通信,通过最大限度地减少网络中需要打开的端口数量来实现灵活部署。

  • Self contained

    library被设计得小巧而高效。 大约 300KB 并且在 Hadoop 本身之外没有额外的依赖项,在集群中分发 elasticsearch-hadoop 既简单又快速。

  • Universal jar

    无论您使用的是 vanilla Apache Hadoop 还是某个发行版,same elasticsearch-hadoop jar 都可以透明地工作。

  • Memory and I/O efficient

    elasticsearch-hadoop 专注于性能。 从基于 pull 的解析到批量更新和直接转换为原生类型,elasticsearch-hadoop 保持其内存和网络 I/O 使用的微调。

  • Adaptive I/O

    elasticsearch-hadoop 检测传输错误并自动重试。 如果 Elasticsearch 节点死亡,将请求重新路由到可用节点(自动发现)。 此外,如果 Elasticsearch 过载,elasticsearch-hadoop 会检测到被拒绝的数据并重新发送它,直到它被处理或应用用户定义的策略。

  • Facilitates data co-location

    elasticsearch-hadoop 与 Hadoop 完全集成,暴露其网络访问信息,允许位于同一位置的 Elasticsearch 和 Hadoop 集群相互了解并减少网络 IO。

  • Map/Reduce API support

    在其核心,elasticsearch-hadoop 使用低级 Map/Reduce API 向 Elasticsearch 读取和写入数据,从而实现最大的集成灵活性和性能。

  • old(mapred) & new(mapreduce) Map/Reduce APIs supported

    elasticsearch-hadoop 自动适应您的环境; 不必在使用 mapredmapreduce API 之间进行更改 - 两者都由相同的类同时支持。

  • Apache Hive support

    针对 Elasticsearch 运行 Hive 查询以获得高级分析和 real_time 响应。 elasticsearch-hadoop 将 Elasticsearch 公开为 Hive 表,因此您的脚本可以比以往更快地处理数据。

  • Apache Pig support

    elasticsearch-hadoop 支持将 Elasticsearch 公开为 native Pig Storage 的 Apache Pig。 针对 Elasticsearch 运行 Pig 脚本,无需对配置或 Pig 客户端进行任何修改。

  • Cascading support

    Cascading 是一个应用程序框架,供 Java 开发人员在 Apache Hadoop 上简单地开发健壮的应用程序。 借助 elasticsearch-hadoop,Cascading 可以直接在 Elasticsearch 上运行其流程。

  • Apache Spark

    通过流式数据或索引 arbitrary RDD 直接针对 Elasticsearch 运行快速转换。 提供 Java 和 Scala 两种风格。

  • Apache Storm

    elasticsearch-hadoop 支持 Apache Storm 将 Elasticsearch 暴露为Spout(源)或Bolt(接收器)。

Requirements

使用es-hadoop的前提准备

在运行 elasticsearch-hadoop 之前,请检查以下要求。 当在集群中部署 elasticsearch-hadoop 时,这一点更为重要,其中某些机器上的软件可能稍微不同步。 虽然 elasticsearch-hadoop 尽最大努力回退并对其环境进行各种验证,但进行快速健全性检查,尤其是在升级期间可以为您省去很多麻烦。

JDK

JDK 级别 6.0(或更高),就像 Hadoop。 由于 JDK 6 和 JDK 7 都已停产并且最近的产品更新不支持,我们强烈建议使用最新的 JDK 8(至少 u20 或更高版本)。 如果这不是一个选项,请使用 JDK 7.0 update u55(Elasticsearch 1.2 或更高版本需要)。 此处提供了 Elasticsearch 的最新支持矩阵。 请注意,JVM 版本对于稳定的环境至关重要,因为不正确的版本可能会破坏下面的数据,如本博文中所述。

可以从命令行检查可用的 JDK 版本:

$ java -version
java version "1.8.0_45"

Elasticsearch

我们强烈建议使用最新的 Elasticsearch(当前为 elasticsearch_version)。 虽然 elasticsearch-hadoop 保持与以前版本的 Elasticsearch 的向后兼容性,但我们强烈建议使用最新、稳定的 Elasticsearch 版本。 您可以在此处找到支持的版本矩阵。

可以从REST API检查Elasticsearch版本:

$ curl -XGET http://localhost:9200

  "status" : 200,
  "name" : "Dazzler",
  "version" : 
    "number" : "elasticsearch_version",
    ...
  ,
  "tagline" : "You Know, for Search"

Hadoop

Hadoop 2.x(最好是最新的稳定版本)。 elasticsearch-hadoop 每天针对 Apache Hadoop 进行测试; 任何与 Apache Hadoop 兼容的发行版都应该可以正常工作。

要检查 Hadoop 的版本,可以参考其文件夹或 jars(名称中包含版本)或从命令行:

$ bin/hadoop version
Hadoop 2.4.1

Apache YARN / Hadoop 2.x

elasticsearch-hadoop 二进制文件针对 Hadoop 2.x 进行了测试,旨在无需任何更改或修改即可在 Yarn 上运行。

Apache Hive

Apache Hive 0.10 或更高版本。 我们建议使用最新版本的 Hive(当前为 1.2.1)。

可以从其文件夹名称或命令行中找出 Hive 版本:

$ bin/hive --version
Hive version 1.2.1

Apache Spark

Spark 1.3.0 或更高版本。 我们建议使用最新版本的 Spark。 由于 elasticsearch-hadoop 提供与 Apache Spark 的本机集成(推荐),因此使用什么二进制文件并不重要。 当使用 Hadoop 层将两者集成时也是如此,因为 elasticsearch-hadoop 支持大多数 Hadoop 发行版。

Spark 版本通常可以通过查看其文件夹名称来发现:

$ pwd
/libs/spark/spark-2.2.0-bin-XXXXX

or by running its shell:

$ bin/spark-shell
...
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\\ \\/ _ \\/ _ `/ __/  '_/
   /___/ .__/\\_,_/_/ /_/\\_\\   version 2.2.0
      /_/
...

Apache Spark SQL

如果计划使用 Spark SQL,请确保下载适当的 jar。 虽然它是 Spark 发行版的一部分,但它不是 Spark 核心的一部分,而是有自己的 jar。 因此,在构建类路径时,请确保包含spark-sql-<scala-version>.jar或 Spark 程序集: spark-assembly-2.2.0-<distro>.jar

elasticsearch-hadoop 支持 Spark SQL 1.3 到 1.6 以及 Spark SQL 2.0。 由于 Spark 2.x 与 Spark 1.x 不兼容,所以 elasticsearch-hadoop 提供了两种不同的工件。 elasticsearch-hadoop 通过其主 jar 支持 Spark SQL 2.2.0。 由于 Spark SQL 2.0 不向后兼容 Spark SQL 1.6 或更低版本,elasticsearch-hadoop 提供了一个专用的 jar。 有关详细信息,请参阅 Spark 章节。 请注意,不再支持 Spark 1.0-1.2(同样是由于 Spark 中向后不兼容的更改)。

Installation

导入使用jar

elasticsearch-hadoop 二进制文件可以通过从 elastic.co 站点下载为 ZIP(包含项目 jars、源代码和文档)或使用具有以下依赖项的任何 Maven 兼容工具来获取:

<dependency>
  <groupId>org.elasticsearch</groupId>
  <artifactId>elasticsearch-hadoop</artifactId>
  <version>version</version>
</dependency>

上面的 jar 包含了 elasticsearch-hadoop 的所有特性,并且在运行时不需要任何其他依赖; 换句话说,它可以按原样使用。

elasticsearch-hadoop 二进制文件适用于 Hadoop 2.x(也称为 YARN)环境。 对 Hadoop 1.x 环境的支持在 5.5 中已弃用,并且将不再在 6.0 中进行测试。

Minimalistic binaries

除了 uber jar,elasticsearch-hadoop 还为每个集成提供了简约的 jar,为只使用一个模块的人量身定制(在所有其他情况下,建议使用 uber jar); jar 的尺寸更小,并使用专用的 pom,仅涵盖所需的依赖项。 这些在同一个groupId下可用,使用带有模式 elasticsearch-hadoop-integrationartifactId

Map/Reduce.

<dependency>
  <groupId>org.elasticsearch</groupId>
  <artifactId>elasticsearch-hadoop-mr</artifactId> 
  <version>version</version>
</dependency>

Apache Hive.

<dependency>
  <groupId>org.elasticsearch</groupId>
  <artifactId>elasticsearch-hadoop-hive</artifactId> 
  <version>version</version>
</dependency>

Apache Pig.

<dependency>
  <groupId>org.elasticsearch</groupId>
  <artifactId>elasticsearch-hadoop-pig</artifactId> 
  <version>version</version>
</dependency>

Apache Spark.

<dependency>
  <groupId>org.elasticsearch</groupId>
  <artifactId>elasticsearch-spark-20_2.10</artifactId> 
  <version>version</version>
</dependency>

Cascading.

<dependency>
  <groupId>org.elasticsearch</groupId>
  <artifactId>elasticsearch-hadoop-cascading</artifactId> 
  <version>ver</version>
</dependency>

Development Builds

Development (or nightly or snapshots) builds are published daily at sonatype-oss repository (see below). 确保使用快照版本控制:

<dependency>
  <groupId>org.elasticsearch</groupId>
  <artifactId>elasticsearch-hadoop</artifactId>
  <version>version-SNAPSHOT</version> 
</dependency>

还要启用专用的快照存储库:

<repositories>
  <repository>
    <id>sonatype-oss</id>
    <url>http://oss.sonatype.org/content/repositories/snapshots</url> 
    <snapshots><enabled>true</enabled></snapshots> 
  </repository>
</repositories>

Upgrading Your Stack

Elasticsearch for Apache Hadoop 是 Elasticsearch 的一个客户端库,尽管它具有支持 Hadoop/Spark 上的操作的扩展功能。 升级 Hadoop/Spark 版本时,最好检查以确保连接器支持您的新版本,并酌情升级您的 elasticsearch-hadoop 版本。

Elasticsearch for Apache Hadoop 保持与 Elasticsearch 先前主要版本的最新次要版本的向后兼容性(5.X 支持回溯到 2.4.X,6.X 支持回溯到 5.6.X,等等……)。 在升级 Elasticsearch 版本时,最好先将 elasticsearch-hadoop 升级到新版本(或更高版本)。 新的 elasticsearch-hadoop 版本应该继续适用于您之前的 Elasticsearch 版本,让您可以正常升级。

Elasticsearch for Apache Hadoop 不能很好地支持滚动升级。 在滚动升级期间,elasticsearch-hadoop 与之通信的节点将定期消失并重新上线。 由于在滚动升级的时间范围内 elasticsearch-hadoop 会遇到不断的连接故障,因此您的作业很可能会失败。 因此,建议您在滚动升级过程中针对 Elasticsearch 禁用任何基于 elasticsearch-hadoop 的写入或读取作业。

Architecture

核心部分,elasticsearch-hadoop 集成了两个分布式系统:分布式计算平台 Hadoop 和实时搜索和分析引擎 Elasticsearch。 从高层次来看,两者都提供了计算组件:一方面通过 Map/Reduce 或最近的库(如 Apache Spark)实现 Hadoop,另一方面通过搜索和聚合实现 Elasticsearch。

elasticsearch-hadoop 的目标是连接这两个实体,以便它们可以透明地相互受益。

Map/Reduce and Shards

可扩展性的一个关键组件是并行性将任务拆分为多个较小的任务,这些任务在集群中的不同节点上同时执行。 Hadoop 通过拆分(源或输入可以划分的部分数量)和分片(索引划分的部分数量)在 Elasticsearch 中都存在这个概念。

简而言之,粗略地说,更多的输入拆分意味着更多的任务可以同时读取源的不同部分。 更多的分片意味着更多的桶(同时)可以从中读取索引内容。

因此,elasticsearch-hadoop 使用拆分和分片作为 Hadoop 和 Elasticsearch 集群中执行的任务数量背后的主要驱动因素,因为它们对并行性有直接影响。

Hadoop 拆分和 Elasticsearch 分片在系统行为方面发挥着重要作用——我们建议熟悉这两个概念,以便更好地理解您的系统运行时语义。

Apache Spark and Shards

虽然 Apache Spark 不是基于 Map/Reduce 构建的,但它具有相似的概念:它具有partition概念,大致相当于 Elasticsearch 的shard或 Map/Reduce 的split。 因此,上面的类比在这里也适用——更多的分片和/或更多的分区会增加并行的数量,从而允许两个系统更好地扩展。

由于概念上的相似性,在整个文档中,人们可以互换地认为 Hadoop Input Split 和 Spark Partition

Reading from Elasticsearch

从 Elasticsearch 读取信息时,分片起着至关重要的作用。 由于它充当源,elasticsearch-hadoop 将为每个 Elasticsearch shard创建一个 Hadoop InputSplit,或者在 Apache Spark 的情况下创建一个Partition,该分区被提供一个针对索引I 的查询。elasticsearch-hadoop 将动态发现支持的分片数量 I然后为每个分片创建,在 Hadoop 的情况下,输入拆分(这将确定要执行的 Hadoop 任务的最大数量)或在 Spark 的情况下,将确定RDD最大并行度的分区。

在默认设置下,Elasticsearch 每个索引使用 5 个主分片,这将在 Hadoop 端为每个查询产生相同数量的任务。

elasticsearch-hadoop 不会查询相同的分片 - 它使用循环方法遍历所有分片(主分片和副本)。 为了避免数据重复,每个分片组(主分片和副本)只使用一个分片。

提高性能的一个常见问题(读取优化)是增加分片的数量,从而增加 Hadoop 端的任务数量。 除非通过基准测试证明了这种收益,否则我们建议不要采取这种措施,因为在大多数情况下,Elasticsearch 分片可以easily处理数据流到 Hadoop 或 Spark 任务。

Writing to Elasticsearch

写入 Elasticsearch 由可用的 Hadoop 输入拆分(或任务)或 Spark 分区的数量驱动。 elasticsearch-hadoop 检测将发生写入的(主)分片的数量,并在这些分片之间分配写入。 可用的拆分/分区越多,就越多的映射器/缩减器可以将数据并行写入 Elasticsearch。

Data co-location 数据协同定位

只要有可能,elasticsearch-hadoop 就会与 Hadoop 和 Spark 共享 Elasticsearch 集群信息,以促进数据共存。 在实践中,这意味着每当从 Elasticsearch 读取数据时,源节点的 IP 都会传递到 Hadoop 和 Spark 以优化任务执行。 如果需要/可能的共址,将 Elasticsearch 和 Hadoop 和 Spark 集群托管在同一机架内将显着节省网络成本。

以上是关于ES实战ES-Hadoop之关键特性要求安装核心架构的主要内容,如果未能解决你的问题,请参考以下文章

工作采坑札记:3. Spark中es-hadoop插件异常解决

elasticsearch备份与恢复4_使用ES-Hadoop将ES中的索引数据写入HDFS中

《ElasticSearch6.x实战教程》之分词

ElasticSearch核心之——分布式特性

乐字节Java8核心特性实战之四:方法引用

乐字节-Java8核心特性实战之函数式接口