雜記:hive報錯以及spark中hive應用

轉載內容,謝謝原創。雜記。

(1) Yarn Cluster: Spark Driver程序將作爲一個ApplicationMasterYARN集羣中先啓動,然後再由ApplicationMasterRM申請資源啓動 executor以運行Task。因爲Driver程序在Yarn中運行,所以程序的運行結果不能在客戶端顯示,所以最好將結果保存在HDFS上,客戶端的終端顯示的是作爲Yarnjob的運行情況。

(2) Yarn Client: Spark Driver程序在客戶端上運行,然後向Yarn申請運行exeutor以運行Task,本地程序負責最後的結果彙總等。客戶端的Driver將應用提交Yarn後,Yarn會先後啓動ApplicationMasterexecutor,另外ApplicationMasterexecutor是裝載在container裏運行,container默認的內存是1GApplicationMaster分配的內存是driver- memoryexecutor分配的內存是executor-memory。同時,因爲Driver在客戶端,所以程序的運行結果可以在客戶端顯示,Driver以進程名爲SparkSubmit的形式存在。

Hive Support

 這下面的纔是高潮,它可以從hive裏面取數據。但是hive的依賴太多了,默認Spark assembly是沒帶這些依賴的,需要我們運行SPARK_HIVE=true sbt/sbt assembly/assembly重新編譯,或者用maven的時候添加-Phive參數,它會重新編譯出來一個hive assemblyjar包,然後需要把這個jar包放到所有的節點上。另外還需要把hive-site.xml放到conf目錄下。沒進行hive部署的話,下面的例子也可以用LocalHiveContext來代替HiveContext。

val sc: SparkContext// 已經存在的SparkContext

val hiveContext =new org.apache.spark.sql.hive.HiveContext(sc)

 

//引入這個Context,然後就會給所有的sql語句進行隱式轉換

import hiveContext._

 

hql("CREATE TABLE IF NOT EXISTS src (key INT, value STRING)")

hql("LOAD DATA LOCAL INPATH 'examples/src/main/resources/kv1.txt' INTO TABLE src")

 

//使用HiveQL查詢

hql("FROM src SELECT key, value").collect().foreach(println)

這個功能看起來還挺像樣,前面兩個看起來就像渣一樣,沒勁兒,不知道爲什麼不自帶那些依賴,還要我們再編譯一下,但是我下的那個版本運行的時候提示我已經編譯包括了hive

 

在安裝過程中,第一次啓動Hive沒有成功,後來在網上查到原因如下,併成功解決:
錯誤如下:

  1. Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/hive/conf/HiveConf   
  2.         at java.lang.Class.forName0(Native Method)   
  3.         at java.lang.Class.forName(Class.java:247)   
  4.         at org.apache.hadoop.util.RunJar.main(RunJar.java:149)   
  5. Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf   
  6.         at java.net.URLClassLoader$1.run(URLClassLoader.java:200)   
  7.         at java.security.AccessController.doPrivileged(Native Method)   
  8.         at java.net.URLClassLoader.findClass(URLClassLoader.java:188)   
  9.         at java.lang.ClassLoader.loadClass(ClassLoader.java:307)   
  10.         at java.lang.ClassLoader.loadClass(ClassLoader.java:252)   
  11.         at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)  

解決方法是,安裝Hadoop時,修改Hadoop目錄下/conf/hadoop-env.sh時,添加HADOOP_CLASSPATH變量覆蓋了原有的變量,改成如下的形式即可:
HADOOP_CLASSPATH=$HADOOP_CLASSPATH:....
紅色爲添加部分。問題解決。

Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.metastore.HiveMetaStoreClient

原因:啓動起來hive-metastore這個服務,然後可以show database以及show tables

mysql –u root –p登錄下mysql

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章