- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我们在内部部署 Elasticsearch 集群已经快 2 年了,我们想做一些更高级的分析,例如使用其中包含的日志数据以及其他不同的数据源。
我们的重点是 Elasticsearch 中的系统日志。每天生成约 100gb 的系统日志数据——每天都是它自己的索引。我们也有一些应用程序日志,但如果我能为系统日志解决这个问题,我就可以轻松解决其他数据移动问题。
这引出了我的问题。对于我的分析,我们使用 Spark 2.1.1 和 Python API。我想要所有的系统日志数据,比如说,在 HDFS 中保存 2 周,这样我们就可以做两件事:
现在,我的问题是 - 从 ES 中提取如此大量的数据并将其放入 HDFS 的最佳方法是什么?我在 PySpark 中有一个执行一些基本查询的示例,但是当我尝试将整个索引(每天生成 100gb 的索引)拉入 RDD 时,出现内存不足错误。我已经联系了 Elasticsearch 支持,但被告知这是我需要在 Hadoop/Spark 端解决的问题,但他们不支持。
我们已经设置了“ES-Hadoop 连接器”,它确实为我提供了一些工作框架,尽管理解文档确实是一个挑战。 Hadoop 生态系统的几个组件(HIVE、Spark、Hadoop 等)都有连接器。我不确定那里是否有解决方案,或者是否有更好的事情要做。我对此很陌生,所以请原谅任何有明显答案的问题。我正在寻找一些指导和一些具体的建议(如果可能的话,指向带有设置和代码的具体示例的指针会很棒)。我的目标是:
感谢您给我的任何帮助、建议或示例。
编辑/附加信息:
我想在这里添加一些代码来解释我正在尝试做什么。这个过程需要很长时间才能完成,甚至几个小时后也没有显示任何进展,所以我想知道我是否做错了什么。
以下是我启动 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 个结果。在那 10 个记录集上,我可以保存它,效果很好。但是,在完整的 RDD 上,这会花费很长时间。我不太确定我应该期待什么,但我无法想象在一个 10 节点的集群上,每个盒子有 64gb 的 RAM 和 8 个内核,这需要几个小时。
最佳答案
I have an example in PySpark of doing some basic queries, but when I try and pull an entire index (100gb daily generated index) into an RDD, I get out of memory errors
默认情况下,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()
以通过驱动程序发回数据,否则它本身不需要那么多内存。
我会尝试先增加执行器内存,然后再增加执行器的数量。如果启用动态分配,那么您可以考虑不指定执行程序数量,但它确实设置了一个下限。
ES-Hadoop 提供了许多连接器来提取数据,但这一切都取决于偏好。如果您了解 SQL,请使用 Hive。 Pig 比 Spark 更容易运行。 Spark 占用大量内存,在某些集群中可能无法正常工作。
您在评论中提到了 NiFi,但它仍然是一个 Java 进程,并且容易出现 OOM 错误。除非你有一个 NiFi 集群,否则在写入 HDFS 之前,你将有一个进程在某个地方通过磁盘上的 FlowFile 提取 100 GB。
如果您需要整个索引的快照,Elasticsearch 提供 HDFS support对于这样的功能。不过,我不确定那是什么数据格式,或者 Hadoop 进程是否可以读取它。
关于hadoop - 轻松将 Elasticsearch 数据导入 HDFS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47104670/
HDFS 是 Hadoop 中的逻辑文件系统,块大小为 64MB。 HDFS 上的文件依次保存在底层操作系统文件系统上,比如 ext4,块大小为 4KiB。 据我所知,对于本地文件系统上的文件,操作系
哪种工具最适合测量 HDFS 空间消耗? 当我总结“hdfs dfs -du/”的输出时,与“hdfs dfsadmin -report”(“DFS Used”行)相比,我总是消耗更少的空间。是否有
我正在尝试编写一个简单的脚本来验证 HDFS 和本地文件系统校验和。 在 HDFS 上我得到 - [m@x01tbipapp3a ~]$ hadoop fs -checksum /user/m/fil
我从 HDFS 中删除了一个文件夹,我在下面找到了它 /user/hdfs/.Trash/Current/ 但我无法恢复它。我查看了论坛,但没有找到好的解决方案。 请有人有解决方案我可以帮助我如何在最
在 5 个节点的集群上运行 Presto 大型扫描查询,看起来只有一个节点是查询协调器,并通过网络从 5 个 hdfs 节点读取数据。 所有 presto 进程都在数据节点上运行。 有没有办法让5个节
我有一个名为 file name(1).zip 的文件(里面有空格和括号),我想把这个文件放在 HDFS 上。但是每次我尝试通过 hadoop fs -put ... 放置它时,我都会遇到异常。 我什
在 5 个节点集群上运行 Presto 大扫描查询,看起来只有一个节点是查询协调器,并通过网络从 5 个 hdfs 节点读取数据。 所有presto进程都在数据节点上运行。 有没有办法让5个节点使用s
所以我在 CentOS 5 上通过 Cloudera Manager cdh3u5 安装了 Hadoop。当我运行 cmd 时 hadoop fs -ls/ 我希望看到 hdfs://localhos
我用命令在hadoop上运行flume flume-ng agent -c conf -f conf/flume-twitter.conf -n TwitterAgent 现在我无法保存推特数据。它显
我使用两台主机(hadoop-coc-1 和 hadoop-coc-2)尝试在其中配置 HDFS 联合。因此,我在两个主机(hadoop-coc-1 和 hadoop-coc-2)中配置了 $ cat
我需要将大量文件从一个 hdfs 目录移动(而不是复制)到同一集群中的另一个 hdfs 目录。 我可以使用 distcp,但它似乎有点矫枉过正,因为它正在复制文件(复制它)我只想移动它。两个问题: A
当我尝试将文件从我的 本地目录 复制到 HDFS 时,出现以下错误: [cloudera@localhost ~]$ hadoop fs -copyFromLocal hello.txt /user/
据我所知,在从一个 HDFS 位置移动到另一个位置时,没有直接选项可以覆盖 HDFS 中的文件,复制 cp 可以选择强制执行。我试图找出是否有任何黑客可以做到这一点? 我们能做的是 hdfs dfs
我有两个 HDFS 设置,想将一些表从 HDFS1 复制(而不是迁移或移动)到 HDFS2。如何将数据从一个 HDFS 复制到另一个 HDFS?是否可以通过 Sqoop 或其他命令行实现? 最佳答案
目前尚不清楚您是否可以像在 Flume 中那样在 Kafka 中进行扇出(复制)。 我想让 Kafka 将数据保存到 HDFS 或 S3,并将该数据的副本发送到 Storm 进行实时处理。 Storm
如何发出 hdfs 命令作为 EMR 集群中的一个步骤?将步骤添加为 script_runner.jar 任务似乎奇怪地失败了。 最佳答案 使用 command-runner.jar 并调出 bash
如何发出 hdfs 命令作为 EMR 集群中的一个步骤?将步骤添加为 script_runner.jar 任务似乎奇怪地失败了。 最佳答案 使用 command-runner.jar 并调出 bash
我是 Hadoop 和 HDFS 的新手,所以当我从本地 (Ubuntu 10.04) 复制到本地主机上单个节点上的 HDFS 时,可能是我做错了什么。初始副本工作正常,但当我修改我的本地输入文件夹并
根据我在 Hadoop HDFS 上的实践,我了解到在创建用户 say u1 并尝试将文件从本地文件系统放入 HDFS 时,它会搜索目录 /user/u1 (默认情况下)对 HDFS 文件系统具有写入
我想将一个 70G 的文件放入 hdfs,所以我使用“put”命令来完成此操作。但是,我得到以下异常。我用相同的命令尝试了小尺寸文件,它有效。有谁知道是什么问题?谢谢! WARN [DataStre
我是一名优秀的程序员,十分优秀!