報錯java.lang.NoSuchFieldError: METASTORE_CLIENT_SOCKET_LIFETIME升級報錯Required field 'client_protocol' is unset! 終級解決方案


一、問題描述

 最近碰到一個令人郁悶的問題,因為客戶的CDH版本比較低,hive1.1.0版本,而我們現在使用的spark版本都比較近搞,這樣就會造成,如果我使用hive1.1.0版本就會報錯:

java.lang.NoSuchFieldError: METASTORE_CLIENT_SOCKET_LIFETIME

 網上查詢之后,原因是高版本的hive-exc1.2.1驅動中有這個字段,但是hive1.1.0版本中沒有,二者對不上,建議將hive驅動版本升級到1.1.0;而我將版本升級到hive1.2.1之后,就會報錯:

Required field 'client_protocol' is unset!”

 網上查詢之后,說是hive客戶端驅動版本和hive服務器版本不一致;需要將驅動版本設置成hive1.1.0,郁悶中...

 二、問題解決

  經同事提醒,這個版本不一致,是否可以CDH平台的版本驗證參數關閉,於是乎,講過查詢版本驗證參數為:hive.metastore.schema.verification。再查看CDH平台中此參數設置,發現原來默認的false被改成了true;將該參數恢復默認。spark調試通過。

三、補充一些hive的參數配置

關於MetaStore:metastore是個獨立的關系數據庫,用來持久化schema和系統元數據。

hive.metastore.local:控制hive是否連接一個遠程metastore服務器還是開啟一個本地客戶端jvm,默認是true,Hive0.10已經取消了該配置項;

javax.jdo.option.ConnectionURL:JDBC連接字符串,默認jdbc:derby:;databaseName=metastore_db;create=true;

javax.jdo.option.ConnectionDriverName:JDBC的driver,默認org.apache.derby.jdbc.EmbeddedDriver

javax.jdo.PersisteneManagerFactoryClass:實現JDO PersistenceManagerFactory的類名,默認org.datanucleus.jdo.JDOPersistenceManagerFactory;

javax.jdo.option.DetachAllOnCommit:事務提交后detach所有提交的對象,默認是true;

javax.jdo.option.NonTransactionalRead:是否允許非事務的讀,默認是true;

javax.jdo.option.ConnectionUserName:username,默認APP;

javax.jdo.option.ConnectionPassword:password,默認mine;

javax.jdo.option.Multithreaded:是否支持並發訪問metastore,默認是true;

datanucleus.connectionPoolingType:使用連接池來訪問JDBC metastore,默認是DBCP;

datanucleus.validateTables:檢查是否存在表的schema,默認是false;

datanucleus.validateColumns:檢查是否存在列的schema,默認false;

datanucleus.validateConstraints:檢查是否存在constraint的schema,默認false;

datanucleus.stroeManagerType:元數據存儲類型,默認rdbms;

datanucleus.autoCreateSchema:在不存在時是否自動創建必要的schema,默認是true;

datanucleus.aotuStartMechanismMode:如果元數據表不正確,拋出異常,默認是checked;

datanucleus.transactionIsolation:默認的事務隔離級別,默認是read-committed;

datanucleus.cache.level2:使用二級緩存,默認是false;

datanucleus.cache.level2.type:二級緩存的類型,有兩種,SOFT:軟引用,WEAK:弱引用,默認是SOFT;

datanucleus.identifierFactory:id工廠生產表和列名的名字,默認是datanucleus;

datanucleus.plugin.pluginRegistryBundleCheck:當plugin被發現並且重復時的行為,默認是LOG;

hive.metastroe.warehouse.dir:數據倉庫的位置,默認是/user/hive/warehouse;

hive.metastore.execute.setugi:非安全模式,設置為true會令metastore以客戶端的用戶和組權限執行DFS操作,默認是false,這個屬性需要服務端和客戶端同時設置;

hive.metastore.event.listeners:metastore的事件監聽器列表,逗號隔開,默認是空;

hive.metastore.partition.inherit.table.properties:當新建分區時自動繼承的key列表,默認是空;

hive.metastore.end.function.listeners:metastore函數執行結束時的監聽器列表,默認是空;

hive.metastore.event.expiry.duration:事件表中事件的過期時間,默認是0;

hive.metastore.event.clean.freq:metastore中清理過期事件的定時器的運行周期,默認是0;

hive.metastore.connect.retries:創建metastore連接時的重試次數,默認是5;

hive.metastore.client.connect.retry.delay:客戶端在連續的重試連接等待的時間,默認1;

hive.metastore.client.socket.timeout:客戶端socket超時時間,默認20秒;

hive.metastore.rawstore.impl:原始metastore的存儲實現類,默認是org.apache.hadoop.hive.metastore.ObjectStore;

hive.metastore.batch.retrieve.max:在一個batch獲取中,能從metastore里取出的最大記錄數,默認是300;

hive.metastore.ds.connection.url.hook:查找JDO連接url時hook的名字,默認是javax.jdo.option.ConnectionURL;

hive.metastore.ds.retry.attempts:當出現連接錯誤時重試連接的次數,默認是1次;

hive.metastore.ds.retry.interval:metastore重試連接的間隔時間,默認1000毫秒;

hive.metastore.server.min.threads:在thrift服務池中最小的工作線程數,默認是200;

hive.metastore.server.max.threads:最大線程數,默認是100000;

hive.metastore.server.tcp.keepalive:metastore的server是否開啟長連接,長連可以預防半連接的積累,默認是true;

hive.metastore.sasl.enabled:metastore thrift接口的安全策略,開啟則用SASL加密接口,客戶端必須要用Kerberos機制鑒權,默認是不開啟false;

hive.metastore.kerberos.keytab.file:在開啟sasl后kerberos的keytab文件存放路徑,默認是空;

hive.metastore.kerberos.principal:kerberos的principal,_HOST部分會動態替換,默認是hive-metastore/_HOST@EXAMPLE.COM

hive.metastore.cache.pinobjtypes:在cache中支持的metastore的對象類型,由逗號分隔,默認是Table,StorageDescriptor,SerDeInfo,Partition,Database,Type,FieldSchema,Order;

hive.metastore.authorization.storage.checks:在做類似drop partition操作時,metastore是否要認證權限,默認是false;

hive.metastore.schema.verification:強制metastore的schema一致性,開啟的話會校驗在metastore中存儲的信息的版本和hive的jar包中的版本一致性,並且關閉自動schema遷移,用戶必須手動的升級hive並且遷移schema,關閉的話只會在版本不一致時給出警告,默認是false不開啟;

 


免責聲明!

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



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