轉載內容,謝謝原創。雜記。
(1) Yarn Cluster: Spark Driver程序將作爲一個ApplicationMaster在YARN集羣中先啓動,然後再由ApplicationMaster向RM申請資源啓動 executor以運行Task。因爲Driver程序在Yarn中運行,所以程序的運行結果不能在客戶端顯示,所以最好將結果保存在HDFS上,客戶端的終端顯示的是作爲Yarn的job的運行情況。
(2) Yarn Client: Spark Driver程序在客戶端上運行,然後向Yarn申請運行exeutor以運行Task,本地程序負責最後的結果彙總等。客戶端的Driver將應用提交給Yarn後,Yarn會先後啓動ApplicationMaster和executor,另外ApplicationMaster和executor都是裝載在container裏運行,container默認的內存是1G,ApplicationMaster分配的內存是driver- memory,executor分配的內存是executor-memory。同時,因爲Driver在客戶端,所以程序的運行結果可以在客戶端顯示,Driver以進程名爲SparkSubmit的形式存在。
Hive Support
這下面的纔是高潮,它可以從hive裏面取數據。但是hive的依賴太多了,默認Spark assembly是沒帶這些依賴的,需要我們運行SPARK_HIVE=true sbt/sbt assembly/assembly重新編譯,或者用maven的時候添加-Phive參數,它會重新編譯出來一個hive assembly的jar包,然後需要把這個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沒有成功,後來在網上查到原因如下,併成功解決:
錯誤如下:
- Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/hive/conf/HiveConf
- at java.lang.Class.forName0(Native Method)
- at java.lang.Class.forName(Class.java:247)
- at org.apache.hadoop.util.RunJar.main(RunJar.java:149)
- Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf
- at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
- at java.security.AccessController.doPrivileged(Native Method)
- at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
- at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
- at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
- 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