記一個 protobuf 的 jar 包沖突


嘗試使用 spark 以 bulkload 的方式寫 HBase 時,遇到一個問題,錯誤堆棧如下

19/02/02 09:00:43 ERROR Utils: Aborting task
java.lang.NoSuchMethodError: org.apache.hadoop.hbase.util.ByteStringer.wrap([B)L/com/google/protobuf/ByteString;
	at org.apache.hadoop.hbase.io.hfile.HFile$FileInfo.write(HFile.java:709)
	at org.apache.hadoop.hbase.io.hfile.AbstractHFileWriter.writeFileInfo(AbstractHFileWriter.java:184)
	at org.apache.hadoop.hbase.io.hfile.HFileWriterV2.close(HFileWriterV2.java:346)
	at org.apache.hadoop.hbase.regionserver.StoreFile$Writer.close(StoreFile.java:996)
	at org.apache.hadoop.hbase.mapreduce.HFileOutputFormat2$1.close(HFileOutputFormat2.java:269)
	at org.apache.hadoop.hbase.mapreduce.HFileOutputFormat2$1.close(HFileOutputFormat2.java:277)
	at org.apache.spark.internal.io.HadoopMapReduceWriteConfigUtil.closeWriter(SparkHadoopWriter.scala:357)
	at org.apache.spark.internal.io.SparkHadoopWriter$$anonfun$4.apply(SparkHadoopWriter.scala:133)
	at org.apache.spark.internal.io.SparkHadoopWriter$$anonfun$4.apply(SparkHadoopWriter.scala:123)
	at org.apache.spark.util.Utils$.tryWithSafeFinallyAndFailureCallbacks(Utils.scala:1414)
	at org.apache.spark.internal.io.SparkHadoopWriter$.org$apache$spark$internal$io$SparkHadoopWriter$$executeTask(SparkHadoopWriter.scala:135)
	at org.apache.spark.internal.io.SparkHadoopWriter$$anonfun$3.apply(SparkHadoopWriter.scala:79)
	at org.apache.spark.internal.io.SparkHadoopWriter$$anonfun$3.apply(SparkHadoopWriter.scala:78)
	at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:87)
	at org.apache.spark.scheduler.Task.run(Task.scala:109)
	at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:345)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)

一開始以為是找不到 com.google.protobuf.ByteString,怎么都沒想明白。后來找同事討論,確定問題是找不到 return 為 com.google.protobuf.ByteString 的 org.apache.hadoop.hbase.util.ByteStringer.wrap 的函數

 

原因如下:

同時引用了 org.apache.hbase:hbase-shaded-client 和 org.apache.hbase:hbase-protocol,其中都有類 org.apache.hadoop.hbase.util.ByteStringer 和 方法 wrap,但是返回值分別為 org.apache.hadoop.hbase.shaded.com.google.protobuf.ByteString 和 com.google.protobuf.ByteString。前者被打進 jar 包,於是有了之前的錯誤。

更進一步,發生這個錯誤的原因,是在引用 hbase 依賴的時候,同時引用了 shaded 和非 shaded,這是錯誤的。於是改成都使用 shaded 的 hbase 依賴。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM