0

解决

原来我们需要将validation.jar 放在hadoop/share/hadoop/common/lib/ 中(从https://mvnrepository.com/artifact/javax.validation/validation-api * 下载)。

将其与文档所说的相结合:在您的 Druid 的索引任务 json 中将“mapreduce.job.classloader”设置为“true”。

你会得到它的工作:)——德鲁伊 0.9.2 和 Hadoop 2.7.3

*) 不知道为什么,我可以看到 Druid 将其类路径中的所有 jar 上传到 Hadoop(并且 validation.jar 在那里)。也许对 JVM 如何从自定义类加载器加载 javax.* 库有限制(?)

以下内容出于历史目的,以帮助搜索。


更新更新

我的错。我忘记将 Dockerfile 中的 core-site.xml 等复制到 Druid 安装中的正确位置。

我解决了这个问题,现在它将工作发送到 hadoop。

在此处输入图像描述

但是,现在我遇到了另一个问题。作业执行失败。java.lang.reflect.InvocationTargetException,位于 io.druid.indexer.JobHelper.runJobs(JobHelper.java:369) ~[druid-indexing-hadoop-0.9.2.jar:0.9.2]。

在此处输入图像描述

与此处报道的类似:https ://groups.google.com/forum/#!topic/druid-development/_JXvLbykD0E 。但至少在堆栈跟踪(权限)中有更多提示。我的情况不是很清楚。有人有同样的问题吗?

!!!再次更新!!!

我想这就是我遇到的情况。同样:https ://groups.google.com/forum/#!topic/druid-user/4yDRoQZn8h8

我通过 Hadoop 的时间线服务器检查了 MR 的日志,确认了这一点:

在此处输入图像描述

让我尝试修复它并在之后更新这篇文章。

更新:发现这个:https ://groups.google.com/forum/#!topic/druid-user/U6zMkhm3WiU

更新:不。设置 "mapreduce.job.classloader": "true" 在地图任务上给了我另一个问题:java.lang.ClassNotFoundException: javax.validation.Validator at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java .lang.ClassLoader.loadClass(ClassLoader.java:424).... 这整个类加载的事情:(

所以,罪魁祸首是 guice 库。Druid 0.9.2 使用 Guice 4.1.0,而 Hadoop 2.7.3 坚持使用 Guice 3.0.0...,并且 mapreduce.job.classloader 不工作(它给出了另一个 java 类未找到问题)。

现在要做什么?将 guice 4.1.0 从 Druid 复制到 Hadoop?

在此处输入图像描述

原帖

为什么 Druid (0.9.2) 没有将作业提交给资源管理器(并且作业在 hadoop 集群中运行)?有人可以指出我遗漏了什么细节吗?

我在主机名设置为“hadoop”的机器上运行 2.7.2 版的 Hadoop 集群(伪)。那个 hadoop 和我的德鲁伊在不同的​​ docker 实例上运行。druid docker 有 --link 到 hadoop 实例。

从日志中我可以看出它在本地执行 MR(使用 LocalJobRunner)。

在此处输入图像描述

我还可以从日志中并通过检查 HDFS 来确认索引是否成功:

在此处输入图像描述

另外,从 YARN UI...我没有看到任何正在提交的作业。

在此处输入图像描述

我已经根据文档配置了所有内容。在我的德鲁伊的 core-site.xml 中,我有:

<property>
  <name>fs.default.name</name>
  <value>hdfs://hadoop:9000</value>
</property>

(是的,它是 fs.default.name,而不是 fs.defaultFS……因为 Druid 扩展仍然使用 2.3.0,而 defaultFS 直到 2.4.x 才知道)。稍微回避一下:我认为 Druid 中的类路径存在一个错误,它没有将 hadoop 依赖项添加到运行工作者的类路径列表中(我已经在 common 的运行时属性中指定了默认坐标)。

在此处输入图像描述

好的,另外,在overlord runtime.properties 中,我已将索引运行器类型指定为远程。在 middleManager runtime.properties 中也是如此。我可以看到德鲁伊拿起那些配置。

在此处输入图像描述

此外,索引日志存储类型设置为 HDFS,我可以确认文件存储在 HDFS 中。

在此处输入图像描述

因此,就深度存储而言,一切都很好。就是这个 Map-Reduce。不在集群中运行。有人也偶然发现了同样的问题,线程没有解决方案。在这里:https ://groups.google.com/forum/#!topic/druid-user/vvX3VEGMTcw

我可以确认深度存储没有问题(从我指定的 HDFS 路径中提取的输入文件,并且段也存储在 HDFS 中)。

我错过了什么?

4

2 回答 2

1

原来我们需要将validation.jar 放在hadoop/share/hadoop/common/lib/ 中(从https://mvnrepository.com/artifact/javax.validation/validation-api * 下载)。

将其与文档所说的相结合:在您的 Druid 的索引任务 json 中将“mapreduce.job.classloader”设置为“true”。

你会得到它的工作:) Druid 0.9.2 和 Hadoop 2.7.3

*) 不知道为什么,我可以看到 Druid 将其类路径中的所有 jar 上传到 Hadoop(并且 validation.jar 在那里)。也许对 JVM 如何从自定义类加载器加载 javax.* 库有限制(?)

于 2016-12-12T18:11:21.143 回答
0

如 druid文档所述,您需要复制 hadoop conf 文件 core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml。

于 2016-12-12T15:18:51.753 回答