【发布时间】:2016-04-09 22:11:12
【问题描述】:
所以我试图在通过 Oozie 工作流启动的 Yarn-cluster 模式下运行 Spark 作业,但遇到以下错误(下面的相关堆栈跟踪)
java.sql.SQLException: ERROR 103 (08004): Unable to establish connection.
at org.apache.phoenix.exception.SQLExceptionCode$Factory$1.newException(SQLExceptionCode.java:388)
at org.apache.phoenix.exception.SQLExceptionInfo.buildException(SQLExceptionInfo.java:145)
at org.apache.phoenix.query.ConnectionQueryServicesImpl.openConnection(ConnectionQueryServicesImpl.java:296)
at org.apache.phoenix.query.ConnectionQueryServicesImpl.access$300(ConnectionQueryServicesImpl.java:179)
at org.apache.phoenix.query.ConnectionQueryServicesImpl$12.call(ConnectionQueryServicesImpl.java:1917)
at org.apache.phoenix.query.ConnectionQueryServicesImpl$12.call(ConnectionQueryServicesImpl.java:1896)
at org.apache.phoenix.util.PhoenixContextExecutor.call(PhoenixContextExecutor.java:77)
at org.apache.phoenix.query.ConnectionQueryServicesImpl.init(ConnectionQueryServicesImpl.java:1896)
at org.apache.phoenix.jdbc.PhoenixDriver.getConnectionQueryServices(PhoenixDriver.java:180)
at org.apache.phoenix.jdbc.PhoenixEmbeddedDriver.connect(PhoenixEmbeddedDriver.java:132)
at org.apache.phoenix.jdbc.PhoenixDriver.connect(PhoenixDriver.java:151)
at java.sql.DriverManager.getConnection(DriverManager.java:664)
at java.sql.DriverManager.getConnection(DriverManager.java:208)
...
Caused by: java.io.IOException: java.lang.reflect.InvocationTargetException
at org.apache.hadoop.hbase.client.ConnectionFactory.createConnection(ConnectionFactory.java:240)
at org.apache.hadoop.hbase.client.ConnectionManager.createConnection(ConnectionManager.java:414)
at org.apache.hadoop.hbase.client.ConnectionManager.createConnectionInternal(ConnectionManager.java:323)
at org.apache.hadoop.hbase.client.HConnectionManager.createConnection(HConnectionManager.java:144)
at org.apache.phoenix.query.HConnectionFactory$HConnectionFactoryImpl.createConnection(HConnectionFactory.java:47)
at org.apache.phoenix.query.ConnectionQueryServicesImpl.openConnection(ConnectionQueryServicesImpl.java:294)
... 28 more
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
at org.apache.hadoop.hbase.client.ConnectionFactory.createConnection(ConnectionFactory.java:238)
... 33 more
Caused by: java.lang.UnsupportedOperationException: Unable to find org.apache.hadoop.hbase.ipc.controller.ClientRpcControllerFactory
at org.apache.hadoop.hbase.util.ReflectionUtils.instantiateWithCustomCtor(ReflectionUtils.java:36)
at org.apache.hadoop.hbase.ipc.RpcControllerFactory.instantiate(RpcControllerFactory.java:58)
at org.apache.hadoop.hbase.client.ConnectionManager$HConnectionImplementation.createAsyncProcess(ConnectionManager.java:2317)
at org.apache.hadoop.hbase.client.ConnectionManager$HConnectionImplementation.<init>(ConnectionManager.java:688)
at org.apache.hadoop.hbase.client.ConnectionManager$HConnectionImplementation.<init>(ConnectionManager.java:630)
... 38 more
Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hbase.ipc.controller.ClientRpcControllerFactory
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at org.apache.hadoop.hbase.util.ReflectionUtils.instantiateWithCustomCtor(ReflectionUtils.java:32)
... 42 more
一些背景资料:
- 作业在 spark 1.4.1 上运行(在 spark.conf 文件中指定了正确的 spark.yarn.jar 字段)。
- oozie.libpath 设置为我的程序的 jar 所在的 hdfs 目录。
- org.apache.hadoop.hbase.ipc.controller.ClientRpcControllerFactory,类未找到,存在于phoenix-4.5.1-HBase-1.0-client.jar中。我在我的 spark.conf 文件中的 spark.driver.extraClassPath 和 spark.executor.extraClassPath 中指定了这个 jar。我还在我的 pom 文件中添加了 phoenix-core 依赖项,因此该类也存在于我的阴影项目 jar 中。
目前的观察结果:
- 在我的 spark.conf 文件 spark.driver.userClassPathFirst 中添加一个额外字段并将其设置为 true 可以消除 classnotfound 异常。但是,它也阻止我初始化火花上下文(空指针异常)。从谷歌搜索看来,包含这个字段会弄乱类路径,所以可能不是解决方法,因为我什至无法以这种方式初始化 spark 上下文。
- 我注意到在 oozie 标准输出日志中,我没有看到 phoenix jar 的类路径。所以也许由于某种原因 spark.driver.extraClassPath 和 spark.executor.extraClassPath 实际上并没有将 jar 作为 extraClassPath 拾取?我知道我指定了正确的 jar 文件路径,因为其他作业的 spark.conf 文件具有相同的参数。
- 我找到了一种使 phoenix jar 显示在类路径中(在 oozie 标准输出日志中)的方法,方法是将 jar 复制到与我的程序 jar 所在的目录相同的目录中。无论 spark.executor.extraClassPath 是否更改为指向新的 jar 位置,这都有效。但是,classnotfound 异常仍然存在,即使我在解压缩 jar 时清楚地看到了 ClientRpcControllerFactory jar)
我尝试过的其他事情:
- 我尝试使用 sparkConf.setJars() 和 sparkContext.addJar() 方法,但仍然遇到同样的错误
- 在我的作业属性文件的 spark.driver.extraClassPath 字段中添加了 jar,但它似乎没有帮助(Spark 文档指出在客户端模式下运行时此字段是必需的,因此可能与我的案例)
任何帮助/想法/建议将不胜感激。
【问题讨论】:
-
似乎上述异常跟踪不是由 Spark Job 生成的。我没有看到它源自 Spark 类。 Oozie 工作流是否有可能也在实例化 Hbase/Phoenix 连接,并且在您的 spark 作业启动之前也是如此?
-
如果 Phoenix JAR 存在于
oozie.libpath指向的 HDFS 目录中,那么 Oozie 会告诉 YARN 将其下载到 Oozie Launcher 的容器中,在 Current Working Dir 中,它会显示在 StdOut 中(在文件列表和 CLASSPATH 中)。 -
spark.***.extraClassPath属性由 Spark 运行时管理; Oozie 和 YARN 不知道它们,因此它们对 Oozie 启动器的 StdOut 中列出的初始 CLASSPATH 没有影响。 -
请注意,Spark 1.6 提供了一系列与 YARN 下的 CLASSPATH 问题相关的错误修复。不过,并不是全部。
-
您好 Sumit,感谢您的回复。我认为您是对的,该错误不一定与这是 Spark 作业相关,因为此错误出现在我需要初始化 spark 上下文之前。所以是的,这可以被视为任何其他 classnotfound 异常。令我困惑的是,我通过 jvm 选项 -verbose:class 检查了类是否通过我的应用程序 jar 正确加载,但它抱怨找不到该类。
标签: scala hadoop apache-spark hadoop-yarn phoenix