【问题标题】:Unable to use Flink RocksDB state backend due to endianness mismatch由于字节序不匹配,无法使用 Flink RocksDB 状态后端
【发布时间】:2017-06-03 12:10:30
【问题描述】:

我的 Flink Job 从 kafka 主题中读取数据并将数据存储在 RocksDB 状态后端,以利用可查询状态。我可以在本地机器上运行作业并查询状态。但是在集群上部署时,出现以下错误:

Caused by: org.apache.flink.runtime.client.JobExecutionException: Job execution failed.
at org.apache.flink.runtime.jobmanager.JobManager$$anonfun$handleMessage$1$$anonfun$applyOrElse$6.apply$mcV$sp(JobManager.scala:900)
at org.apache.flink.runtime.jobmanager.JobManager$$anonfun$handleMessage$1$$anonfun$applyOrElse$6.apply(JobManager.scala:843)
at org.apache.flink.runtime.jobmanager.JobManager$$anonfun$handleMessage$1$$anonfun$applyOrElse$6.apply(JobManager.scala:843)
at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24)
at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24)
at akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:40)
at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:397)
at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)

Caused by: java.lang.IllegalStateException: Could not initialize keyed state backend.
at org.apache.flink.streaming.api.operators.AbstractStreamOperator.initKeyedState(AbstractStreamOperator.java:286)
at org.apache.flink.streaming.api.operators.AbstractStreamOperator.initializeState(AbstractStreamOperator.java:199)
at org.apache.flink.streaming.runtime.tasks.StreamTask.initializeOperators(StreamTask.java:666)
at org.apache.flink.streaming.runtime.tasks.StreamTask.initializeState(StreamTask.java:654)
at org.apache.flink.streaming.runtime.tasks.StreamTask.invoke(StreamTask.java:257)
at org.apache.flink.runtime.taskmanager.Task.run(Task.java:655)
at java.lang.Thread.run(Thread.java:745)

Caused by: java.lang.Exception: Could not load the native RocksDB library
at org.apache.flink.contrib.streaming.state.RocksDBStateBackend.ensureRocksDBIsLoaded(RocksDBStateBackend.java:483)
at org.apache.flink.contrib.streaming.state.RocksDBStateBackend.createKeyedStateBackend(RocksDBStateBackend.java:235)
at org.apache.flink.streaming.runtime.tasks.StreamTask.createKeyedStateBackend(StreamTask.java:785)
at org.apache.flink.streaming.api.operators.AbstractStreamOperator.initKeyedState(AbstractStreamOperator.java:277)
... 6 more

Caused by: java.lang.UnsatisfiedLinkError: /data/hadoop/tmp/rocksdb-lib-32bc6a5551b331596649309a808b287d/librocksdbjni-linux64.so: /data/hadoop/tmp/rocksdb-lib-32bc6a5551b331596649309a808b287d/librocksdbjni-linux64.so: ELF file data encoding not big-endian (Possible cause: endianness mismatch)
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1941)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1824)
at java.lang.Runtime.load0(Runtime.java:809)
at java.lang.System.load(System.java:1086)
at org.rocksdb.NativeLibraryLoader.loadLibraryFromJar(NativeLibraryLoader.java:78)
at org.rocksdb.NativeLibraryLoader.loadLibrary(NativeLibraryLoader.java:56)
at org.apache.flink.contrib.streaming.state.RocksDBStateBackend.ensureRocksDBIsLoaded(RocksDBStateBackend.java:460)

我尝试在集群级别和作业级别设置 RocksDB 状态后端。当它设置在工作级别时,我将其作为阴影依赖项提供。我也尝试在主机集群机器上编译代码。在所有情况下,我都会遇到相同的错误。

ELF file data encoding not big-endian (Possible cause: endianness mismatch)

我该如何解决这个错误?

【问题讨论】:

  • 您是否尝试在带有 ARM 处理器的服务器上运行 RocksDB?如果是这样,请参阅此线程:github.com/facebook/rocksdb/issues/678 听起来有可能让它工作。
  • @alpinegizmo 我的服务器是 IBM Power7(ppc64 架构),我使用的是 Flink 1.2。 Flink 在内部管理 RocksDB 状态后端,对吧?那么用户如何配置呢?我不熟悉它。
  • 我不是rocksdb专家,但由于rocksdb是一个本地(JNI)库,我认为你必须找到或构建一个包含为PPC编译的rocksdb的JAR,然后提供jar 文件到 Flink。我还看到最近在 RocksDB 中修复了 PPC 支持——显然 5.3.6 版在 15 天前修复了用于 PPC 的 RocksDB Java 构建。
  • 感谢@alpinegizmo 的输入。我可以通过使用你提到的补丁构建 frocksdb 来解决这个问题。

标签: apache-flink flink-streaming rocksdb


【解决方案1】:

通过以下方式解决了问题:

  1. 克隆frocksdb
  2. 应用来自this 提交的rocksdb 补丁。
  3. 在目标平台上运行make rocksdbjava
  4. 将生成的 rocksdbjni-<version-platform>.jar 添加为本地 maven 依赖项
  5. 在目标平台上构建 flink,flink-statebackend-rocksdb/pom.xml 中的 frocksdbjni 指向本地 maven jar。

注意:此补丁已在最新版本的rocksdb 中可用。将frocksdb 更新为rocksdb 的当前版本后,将不会出现此问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多