【发布时间】:2017-05-25 04:13:57
【问题描述】:
我想用 akka-http 构建一个 Restful API,能够从 Bigtable (HBase) 检索数据。
Bigtable 客户端 API 需要 netty-tcnative-boringssl-static 才能连接。这在我的 Intellij IDE 中运行良好,但是当我使用 sbt-assembly 构建一个胖 JAR,然后运行服务器时,我收到以下错误:
2017-01-10 12:03:41 ERROR BigtableSession:129 - Neither Jetty ALPN nor OpenSSL are available. OpenSSL unavailability cause:
java.lang.IllegalArgumentException: Failed to load any of the given libraries: [netty-tcnative-linux-x86_64, netty-tcnative-linux-x86_64-fedora, netty-tcnative]
Exception in thread "main" java.lang.ExceptionInInitializerError
at mycompany.algo.serving.model.algoServingModelLoaderTest$.loadLastModel(algoServingModelLoaderTest.scala:36)
at mycompany.algo.serving.algoServingLauncherTest$$anonfun$4.apply(algoServingLauncherTest.scala:38)
at mycompany.algo.serving.algoServingLauncherTest$$anonfun$4.apply(algoServingLauncherTest.scala:38)
at mycompany.serving.MultiPredictorEbapServing$$anonfun$loadPredictors$1.apply(MultiPredictorEbapServing.scala:25)
at mycompany.serving.MultiPredictorEbapServing$$anonfun$loadPredictors$1.apply(MultiPredictorEbapServing.scala:25)
at scala.collection.immutable.List.foreach(List.scala:381)
at mycompany.serving.MultiPredictorEbapServing.loadPredictors(MultiPredictorEbapServing.scala:25)
at mycompany.algo.serving.algoServingLauncherTest$.delayedEndpoint$mycompany$algo$serving$algoServingLauncherTest$1(algoServingLauncherTest.scala:38)
at mycompany.algo.serving.algoServingLauncherTest$delayedInit$body.apply(algoServingLauncherTest.scala:11)
at scala.Function0$class.apply$mcV$sp(Function0.scala:34)
at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12)
at scala.App$$anonfun$main$1.apply(App.scala:76)
at scala.App$$anonfun$main$1.apply(App.scala:76)
at scala.collection.immutable.List.foreach(List.scala:381)
at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:35)
at scala.App$class.main(App.scala:76)
at mycompany.algo.serving.algoServingLauncherTest$.main(algoServingLauncherTest.scala:11)
at mycompany.algo.serving.algoServingLauncherTest.main(algoServingLauncherTest.scala)
Caused by: java.lang.IllegalgotateException: Could not find an appropriate constructor for com.google.cloud.bigtable.hbase1_2.BigtableConnection
at com.google.cloud.bigtable.hbase.BigtableConfiguration.connect(BigtableConfiguration.java:88)
at com.google.cloud.bigtable.hbase.BigtableConfiguration.connect(BigtableConfiguration.java:72)
at mycompany.algo.serving.model.algoServingModel$.<init>(algoServingModel.scala:25)
at mycompany.algo.serving.model.algoServingModel$.<clinit>(algoServingModel.scala)
... 18 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 com.google.cloud.bigtable.hbase.BigtableConfiguration.connect(BigtableConfiguration.java:85)
... 21 more
Caused by: java.lang.IllegalgotateException: Neither Jetty ALPN nor OpenSSL via netty-tcnative were properly configured.
at com.google.cloud.bigtable.grpc.BigtableSession.<init>(BigtableSession.java:279)
at org.apache.hadoop.hbase.client.AbstractBigtableConnection.<init>(AbstractBigtableConnection.java:137)
at org.apache.hadoop.hbase.client.AbstractBigtableConnection.<init>(AbstractBigtableConnection.java:104)
at com.google.cloud.bigtable.hbase1_2.BigtableConnection.<init>(BigtableConnection.java:50)
... 26 more
我该怎么办?
我正在使用 Scala 2.11.8,我的 sbt 看起来像:
dependencies ++= Seq(
"com.google.cloud" % "google-cloud" % "0.7.0",
"com.google.cloud.bigtable" % "bigtable-hbase-1.2" % "0.9.4",
"io.netty" % "netty-tcnative-boringssl-static" % "1.1.33.Fork19",
"org.apache.hbase" % "hbase-server" % "1.2.1",
"org.apache.hbase" % "hbase-client" % "1.2.1",
"org.apache.hbase" % "hbase-common" % "1.2.1",
)
感谢您的帮助
编辑编辑,因为我最初虽然它是由 akka 引起的,但可以在没有 Akka 的情况下重现它
编辑我的错,原生库被我的 sbt 程序集合并策略驱逐了
编辑这适用于 Maven,问题似乎出在 sbt
解决方案 这是由 sbt-assembly 默认合并策略引起的。 我需要添加以下设置
val settings = Seq(
assemblyMergeStrategy in assembly := {
case PathList("META-INF", xs @ _*) =>
xs map {_.toLowerCase} match {
case "native" :: xs =>
MergeStrategy.singleOrError
case _ => MergeStrategy.discard
}
case "reference.conf" => MergeStrategy.concat
case x => MergeStrategy.first
}
)
【问题讨论】:
-
仅供参考,您不需要“org.apache.hbase”%“hbase-server”%“1.2.1”。我也不确定你为什么需要“com.google.cloud”%“google-cloud”%“0.7.0”。这不是云大表的要求。
-
@Solomon "com.google.cloud" 是云存储所必需的,出于本文的目的,我忘记将其删除。 spark 需要 "org.apache.hbase" % "hbase-server"。这篇文章的目的不需要
-
有没有办法用 SBT 解决这个异常?
-
我解决了这个问题,但合并策略不同。
标签: java scala hbase netty google-cloud-bigtable