转载内容,谢谢原创。杂记。
(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