【问题标题】:Java - Accumulo init exception on OSX Mavericks - log4j loggerJava - OSX Mavericks 上的 Accumulo 初始化异常 - log4j 记录器
【发布时间】:2014-05-10 16:28:35
【问题描述】:

我正在尝试让 Accumulo 在 OSX Mavericks 上工作。我有 Java 1.8,以及通过 Homebrew 安装的最新 Zookeeper 和 Hadoop。这两个似乎都工作正常。

我下载了 Accumulo 的二进制文件,并在 accumulo/conf/accumulo-env.sh 中编辑了这些行:

test -z "$HADOOP_PREFIX"      && export HADOOP_PREFIX=/usr/local/Cellar/hadoop/2.4.0
test -z "$HADOOP_CONF_DIR"     && export HADOOP_CONF_DIR="$HADOOP_PREFIX/libexec/etc/hadoop"
test -z "$JAVA_HOME"             && export JAVA_HOME=$(/usr/libexec/java_home)
test -z "$ZOOKEEPER_HOME"        && export ZOOKEEPER_HOME=/usr/local/Cellar/zookeeper/3.4.6

但是,当我运行 bin/accumulo init 时,我得到:

$ bin/accumulo init
Uncaught exception: java.lang.NoClassDefFoundError: org/apache/log4j/Logger
java.lang.NoClassDefFoundError: org/apache/log4j/Logger
    at org.apache.accumulo.start.classloader.AccumuloClassLoader.<clinit>(AccumuloClassLoader.java:78)
    at org.apache.accumulo.start.Main.main(Main.java:39)
Caused by: java.lang.ClassNotFoundException: org.apache.log4j.Logger
    at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 2 more

我找不到任何有用的搜索结果。我不确定什么配置不当会导致这样的错误,所以我不确定从哪里开始。

我没有对 Zookeeper 或 Hadoop 的配置进行任何更改,因此 Hadoop 处于其基本的独立模式,我已通过他们的一个示例确认该模式正在工作。 Zookeeper 使用 zkServer 正确启动/停止。所以我猜问题出在我的 Accumulo 配置中。不幸的是,他们的 README 对我的情况根本没有帮助,基本上只是告诉我,我下载的 Accumulo 二进制文件应该开箱即用。

我尝试使用设置和取消设置的环境变量 JAVA_HOME 运行它,并在 accumulo-env.sh 中明确定义。

感谢您为我指明正确方向的任何事情。我的最终目标是真正修补 GeoMesa,这取决于 Accumulo 的工作。

【问题讨论】:

    标签: java macos exception logging accumulo


    【解决方案1】:

    在配置 Accumulo 时,您是否编辑了 conf/accumulo-site.xml

    我假设您使用的是 Accumulo 1.5.1,看起来您使用的是 Hadoop 2.4.0。在conf/accumulo-site.xml 内部,您需要向general.classpaths 属性添加一些路径,以获取Hadoop 使用的所有JAR。

    这是您的 general.classpaths 属性应该如下所示:

    <property>
      <name>general.classpaths</name>
      <!--
         Add the following for Hadoop2, actual needs depend on Hadoop installation details. 
         This list may be excessive, but this should cause no issues. Append these values
         after the $HADOOP_PREFIX entries
    
         $HADOOP_PREFIX/share/hadoop/common/.*.jar,
         $HADOOP_PREFIX/share/hadoop/common/lib/.*.jar,
         $HADOOP_PREFIX/share/hadoop/hdfs/.*.jar,
         $HADOOP_PREFIX/share/hadoop/mapreduce/.*.jar,
         $HADOOP_PREFIX/share/hadoop/yarn/.*.jar,
         /usr/lib/hadoop/.*.jar,
         /usr/lib/hadoop/lib/.*.jar,
         /usr/lib/hadoop-hdfs/.*.jar,
         /usr/lib/hadoop-mapreduce/.*.jar,
         /usr/lib/hadoop-yarn/.*.jar,
      -->
      <value>
        $ACCUMULO_HOME/server/target/classes/,
        $ACCUMULO_HOME/lib/accumulo-server.jar,
        $ACCUMULO_HOME/core/target/classes/,
        $ACCUMULO_HOME/lib/accumulo-core.jar,
        $ACCUMULO_HOME/start/target/classes/,
        $ACCUMULO_HOME/lib/accumulo-start.jar,
        $ACCUMULO_HOME/fate/target/classes/,
        $ACCUMULO_HOME/lib/accumulo-fate.jar,
        $ACCUMULO_HOME/proxy/target/classes/,
        $ACCUMULO_HOME/lib/accumulo-proxy.jar,
        $ACCUMULO_HOME/lib/[^.].*.jar,
        $ZOOKEEPER_HOME/zookeeper[^.].*.jar,
        $HADOOP_CONF_DIR,
        $HADOOP_PREFIX/[^.].*.jar,
        $HADOOP_PREFIX/lib/[^.].*.jar,
    
        <!-- Added for Hadoop 2 -->
        /usr/lib/hadoop/.*.jar,
        /usr/lib/hadoop/lib/.*.jar,
        /usr/lib/hadoop-hdfs/.*.jar,
        /usr/lib/hadoop-mapreduce/.*.jar,
        /usr/lib/hadoop-yarn/.*.jar,
      </value>
      <description>Classpaths that accumulo checks for updates and class files.
        When using the Security Manager, please remove the ".../target/classes/" values.
      </description>
    </property>
    

    配置完这个,log4j应该可以找到了。

    【讨论】:

    • 事实证明,我的问题可能是我自己的错。我对 HADOOP_PREFIX 的设置应该是 HADOOP_PREFIX=/usr/local/Cellar/hadoop/2.4.0/libexec,但我已经省略了 libexec 部分。我在 HADOOP_CONF_DIR 条目中通过将 libexec 添加到那里的路径来解决这个问题。但是答案确实直接帮助我解决了这个问题,因为我通过安装 Accumulo 1.5.1(我一直在尝试使用 1.6)并在干净的配置文件中看到注释掉的配置提示找到了它。感谢您的回复!
    • 很高兴听到这有帮助!
    猜你喜欢
    • 2014-10-14
    • 2015-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-23
    • 1970-01-01
    相关资源
    最近更新 更多