使用 zkcli.sh bash 通过 oozie shell 操作将 solr 配置从 hdfs 发送到 zookeeper

Sending solr configs to zookeeper from hdfs using zkcli.sh bash through oozie shell action

每次我尝试将 solr 配置发送给 zookeeper 时,我都会在下面遇到异常。

作为 confdir,我输入了这个地址:"hdfs://some_address/user/Peter/dir_with_date".

在 bash 脚本后面的 jars 中实现时,我看到有一个 Paths.get 方法,它将我的带有配置的字符串转换为没有双斜杠的字符串 ("hdfs:/some_ad...).

Exception in thread "main" java.io.IOException: Path hdfs:/some_address/user/Peter/dir_with_date does not exist
  at org.apache.solr.common.cloud.ZkConfigManager.uploadToZK(ZkConfigManager.java:56)
  at org.apache.solr.common.cloud.ZkConfigManager.uploadConfigDir(ZkConfigManager.java:120)
  at org.apache.solr.cloud.ZkCLI.main(ZkCLI.java:220)

是我做错了什么还是这些zkcli不适合从hdfs读取数据?处理这种情况的最佳方法是什么(构建自定义 jar)?

如果您查看 "ZkConfigManager::uploadToZK()" 的代码,此处显示:https://github.com/apache/incubator-ranger/blob/master/ranger_solrj/src/main/java/org/apache/solr/common/cloud/ZkConfigManager.java,您可以观察到,异常发生在:

if (!Files.exists(rootPath))
    throw new IOException("Path " + rootPath + " does not exist");

预计 Pathjava.nio.file.Path 而不是 org.apache.hadoop.fs.Pathhdfs 路径)。

由于您传递的是 hdfs 路径,因此抛出了异常。

您应该传递本地文件系统的路径(即“/some_address/user/Peter/dir_with_date”应该是本地文件路径)。

此外,查看此 wiki,其中提供了使用 zkcli 上传配置的示例:https://cwiki.apache.org/confluence/display/solr/Using+ZooKeeper+to+Manage+Configuration+Files

谢谢@Manjunath,很有帮助。这是确切的解决方案:

要通过 oozie shell 操作将 solr 配置发送给 zookeeper,您必须将 solr 配置目录复制到执行此 bash 脚本的工作人员,方法是将其添加到工作流

 <file>yourpathto/solr_config_dir#$yourpathto/solr_config_dir</file>

并且在 bash 脚本中,您是这样引用此文件夹的:

CONFIGDIR="`readlink -f solr_config_dir`"

将 CONFIGDIR 作为 confdir 参数添加到 zkcli.sh 并完成!

现在您可以使用 oozie shell 操作将您的 solr 配置发送到 zookeeper!