轻松获取Elasticsearch数据到HDFS

时间:2017-11-03 21:30:28

标签: hadoop apache-spark elasticsearch hdfs

我们已经有一个Elasticsearch集群在内部已有近2年的历史,并希望进行一些更高级的分析,例如其中包含的日志数据以及其他不同的数据源。

我们的重点是Elasticsearch中的Syslogs。每天生成~100gb的syslog数据 - 每天都是它自己的索引。我们也有一些应用程序日志,但如果我可以为syslog解决这个问题,我可以轻松解决其他数据移动问题。

这引出了我的问题。对于我的分析,我们使用Spark 2.1.1和Python API。我想在HDFS中拥有所有的系统日志数据,比如2周,所以我们可以做两件事:

  1. 避免我们的Spark / Hadoop集群之间的通信延迟
  2. 加速我们的机器学习工作
  3. 在路上,我想开始使用Parquet作为我的数据,所以如果我从ES中提取数据,我可以随后用它做任何我想做的事情。
  4. 现在,我的问题 - 从ES中提取大量数据并将其放入HDFS的最佳方法是什么?我在PySpark中有一个做一些基本查询的例子,但是当我尝试将一个完整的索引(每天100gb生成的索引)拉入RDD时,我就会出现内存错误。我已经联系到Elasticsearch支持,但我被告知这是一个我需要在Hadoop / Spark方面解决的问题而且他们不支持这个问题。

    我们已经设置了“ES-Hadoop Connector”,它确实为我提供了一些框架,但理解文档确实是一个挑战。 Hadoop生态系统的几个组件(HIVE,Spark,Hadoop等)都有连接器。我不确定那里是否有解决方案,或者是否有更好的事情要做。我是新手,所以请原谅任何有明显答案的问题。我正在寻找一些指导和一些具体的建议(如果可能的话,指向具有设置和代码的特定示例的指针将是惊人的)。我的目标是:

    1. 在HDFS中获得约2周的系统日志(我希望这可以滚动2周)
    2. 在Elasticsearch系统上创建最小负载
    3. 无论采用何种方法,最好自动执行此操作,以便每天摄取新索引并删除最旧的索引。这不是一个硬性要求,但只是一个很好的。
    4. 感谢您提供的任何帮助,建议或示例。

      编辑/附加信息:

      我想在这里添加一些代码来解释我想要做的事情。这个过程需要很长时间才能完成,即使在几个小时之后,也没有显示出进展,所以我想知道我是否做错了什么。

      以下是我启动Py Spark的方法:

      pyspark --jars=/sysadmin/hadoop/elasticsearch-hadoop-5.6.3/dist/elasticsearch-hadoop-5.6.3.jar --master yarn --deploy-mode client --num-executors 10 --executor-cores 4 --executor-memory 8G --driver-memory 50G
      

      然后,我做了几件事,我设置esconf,创建RDD,然后尝试将其作为文本保存到HDFS:

      >>> esconf = {"es.net.http.auth.user":"XXXXX","es.net.http.auth.pass":"XXXXX","es.resource":"logstash-syslog-2017.10.11", "es.query":"?q=*","es.read.field.include":"message","es.nodes":"server0005","es.net.ssl":"true"}
      >>> rdd = sc.newAPIHadoopRDD("org.elasticsearch.hadoop.mr.EsInputFormat", "org.apache.hadoop.io.NullWritable", "org.elasticsearch.hadoop.mr.LinkedMapWritable", conf=esconf)
      >>> rdd.saveAsTextFile("/user/spark/logstash-syslog-2017.10.11.txt") 
      

      现在,RDD回来了,如果我从RDD做take(1),它需要一段时间,但我可以取回前十名的结果。在那10个记录集中,我可以保存它,就像一个魅力。然而,在完整的RDD上,这只是永远。我不确定我应该期待什么,但我无法想象在一个10节点的集群上,每个盒子有64GB的RAM和8个核心,这需要几个小时。

1 个答案:

答案 0 :(得分:1)

  

我在PySpark中有一个做一些基本查询的例子,但是当我尝试将整个索引(每日生成100g的索引)拉入RDD时,我出现了内存错误

默认情况下,Spark并没有为你的作业分配大量内存,所以是的,在处理那么多数据时,你会得到OOM错误。

这是您应该关注的关键属性及其默认值。

  • spark.dynamicAllocation.enabled - false
  • spark.executor.instances - 2
  • spark.executor.memory - 1g
  • spark.driver.cores - 1

如果您的Spark作业在YARN群集管理下运行,您还需要考虑YARN容器大小。在群集模式下运行时,Application Master将成为Spark驱动程序容器。根据我的经验,除非您的Spark代码调用collect()通过驱动程序发回数据,否则它本身并不需要那么多内存。

我会首先尝试增加Executor内存,然后增加执行程序的数量。如果启用动态分配,则可以考虑不指定执行程序数量,但它确实设置了较低的边界以开始。

ES-Hadoop提供了许多连接器来提取数据,但这一切都归结为偏好。如果您了解SQL,请使用Hive。猪比Spark更容易运行。 Spark非常重要,在某些集群中可能效果不佳。

您在评论中提到了NiFi,但这仍然是一个Java进程,并且容易出现OOM错误。除非你有一个NiFi集群,否则在写入HDFS之前,你会在某个地方通过FlowFile在磁盘上拉100 GB。

如果您需要整个索引的快照,Elasticsearch会为此类功能提供HDFS support。我不确定是什么数据格式,或者Hadoop进程是否可以读取它。