Làm thế nào tôi có thể yêu cầu hive cung cấp lỗi chi tiết hơn?


8

Khi tôi chạy hive, nó hiển thị lỗi sau

[hadoop@a74f90aecdad tmp]$ hive
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/hive/lib/log4j-slf4j-impl-2.10.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V
    at org.apache.hadoop.conf.Configuration.set(Configuration.java:1357)
    at org.apache.hadoop.conf.Configuration.set(Configuration.java:1338)
    at org.apache.hadoop.mapred.JobConf.setJar(JobConf.java:536)
    at org.apache.hadoop.mapred.JobConf.setJarByClass(JobConf.java:554)
    at org.apache.hadoop.mapred.JobConf.<init>(JobConf.java:448)
    at org.apache.hadoop.hive.conf.HiveConf.initialize(HiveConf.java:5141)
    at org.apache.hadoop.hive.conf.HiveConf.<init>(HiveConf.java:5099)
    at org.apache.hadoop.hive.common.LogUtils.initHiveLog4jCommon(LogUtils.java:97)
    at org.apache.hadoop.hive.common.LogUtils.initHiveLog4j(LogUtils.java:81)
    at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:699)
    at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:683)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.hadoop.util.RunJar.run(RunJar.java:323)
    at org.apache.hadoop.util.RunJar.main(RunJar.java:236)

Nó có nghĩa là gì? Có thể hiển thị thêm chi tiết?


com.google.common.gợi ý rằng bạn có một phiên bản không khớp với JAR "ổi" hoặc "protobuf". Có thể một JAR cũ hơn đã có mặt đầu tiên trong CLASSPATH, với phiên bản cũ hơn mà lớp Preconditionskhông có phương thức checkArgument(String,Object).
Samson Scharfrichter

Chỉnh sửa> Hive không kiểm soát được vấn đề đó, đó là lỗi cấp thấp bên trong trình liên kết động JVM - và JVM có thể cung cấp cho bạn nhiều "chi tiết" hơn thế. Nó chỉ đơn giản nói rằng nó đã tìm thấy một lớp com.google.common.base.Preconditionstrong JAR có trong CLASSPATH của nó (giả sử Hive không sử dụng ClassLoader tùy chỉnh ghi đè CLASSPATH) nhưng lớp đó không có phương thức chính xác mà nó có trong thời gian biên dịch.
Samson Scharfrichter

Cố gắng hiểu cách CLASSPATH được tạo tự động cho hivemáy khách béo kế thừa - ví dụ: theo chuỗi các tập lệnh shell gọi tập lệnh shell gọi tập lệnh shell, cho đến khi bạn tìm thấy lệnh thực tếjava -cp <CLASSPATH> etc etc
Samson Scharfrichter

Câu trả lời:


17

Lỗi này xuất hiện, khi một chương trình được biên dịch bằng một phiên bản Jar và được thực thi trên phiên bản khác (thường là cũ) của cùng một Jar. Trong Kịch bản này, hầu hết có thể có xung đột trong phiên bản tệp ổi Jar giữa Hadoop và Hive.

Bước 1 : Chuyển đến HADOOP_INSTALLATION_DIR / share / hadoop / common / lib và kiểm tra phiên bản guava.jar

Bước 2 : Bây giờ, hãy truy cập HIVE_INSTALLATION_DIR / lib và so sánh phiên bản tệp ổi của tổ ong với hadoop. Nếu chúng không giống nhau, hãy xóa phiên bản cũ hơn trong số chúng và sao chép phiên bản mới hơn trong cả hai.


1
Đường dẫn chính xác cho thư viện trong thư mục cài đặt hadoop là HADOOP_INSTALLATION_DIR / share / hadoop / common / lib
Shubhashish Mishra

1
@ShubhashishMishra Vâng, Cảm ơn đã sửa lỗi cho tôi. Tôi sẽ chỉnh sửa nó.
Abhiped

3
Tôi đang sử dụng hadoop 3.2.1 (với guava-27.0-jre.jar listablefuture-9999.0-blank-to-tránh-xung-với-guava.jar) và hive 3.1.2 (với guava-19.0.jar), tôi thay thế guava-19.0.jar bằng guava-27.0-jre.jar, nhưng nó vẫn không hoạt động, Ngoại lệ trong luồng "chính" java.lang.R nbException: com.ctc.wstx.exc.WstxParsingException: Nhân vật mở rộng bất hợp pháp mã 0x8 tại [row, col, system-id]: [3215,96, "file: /usr/src/hive/conf/hive-site.xml"]
Edye Chan

1
@EdyeChan Tôi có hầu hết các phiên bản giống như bạn - hadoop 3.2.1 (với guava-27.0-jre.jar) - hive 2.3.6 (với guava-14.0.1.jar) Tôi đã sao chép guava-27.0-jre.jar từ HADOOP_INSTALLATION_DIR / share / hadoop / common / lib thành HIVE_INSTALLATION_DIR / lib và nó đã GIẢI QUYẾT VẤN ĐỀ.
Scirocco

Tôi đã thay đổi pom.xml mã nguồn hive với phiên bản ổi mà hadoop đang sử dụng và xây dựng lại giống nhau. nó làm việc cho tôi <guava.version> 27.0-jre </guava.version>
ASe

10

Tóm tắt câu trả lời của tôi từ một câu hỏi tương tự trên Super User: https://superuser.com/a/1501841/115371

Lõi Hadoop đã cập nhật phiên bản Guava của nó trong HADOOP-15960 , được phát hành trong Hadoop 3.0.4, 3.1.3 và 3.2.1.

Hive 3.1.2 cung cấp phiên bản Guava không tương thích của riêng nó, không chỉ trong lib/guava-*.jar, mà còn hive-exec-*.jar, một "JAR béo" đóng gói lại một số thư viện bên ngoài. Các dịch vụ Hive / CLI không chạy mà không hive-exec-*.jarcó nghĩa là chúng ta không thể xóa guava-*.jarđể giải quyết vấn đề tương thích.

Hiện tại, các tùy chọn duy nhất là:

  • Xây dựng tổ ong từ nguồn mới nhất, bao gồm HIVE-22126 để khắc phục sự hive-exec-*.jarcố hoặc
  • Sử dụng Hadoop 3.0.3, 3.2.0 hoặc 3.1.2, các bản phát hành cuối cùng trước HADOOP-15960. Nhưng lưu ý rằng Guava JAR được vận chuyển trong các phiên bản Hadoop này có một lỗ hổng đã biết : CVE-2018-10237 .

Trên thực tế, bản vá của HIVE-22126 là không chính xác. Cần phải sửa nhiều hơn.
Eugene Chung
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.