首先,要明确spark on hive和hive on spark 的区别。
--spark on hive:是spark 通过spark-sql 使用hive 语句操作hive,底层运行的还是 spark rdd。它是通过sparksql来加载hive的配置文件,获取到hive的元数据信息,这样就可以拿到hive的所有表的数据,接下来就可以用sparksql来操作hive表中的数据。
--hive on spark:是hive的执行引擎变成了spark,不再是mapreduce。这个要相对于麻烦,需要重新编译spark源码,打成jar包,将hive的执行引擎换成spark。
其次,hive的meta数据支持三种方式存储,一种远端存储,两种本地存储。远端存储比较适合生产环境。详细信息查看 hive metastore。
一、本地derby存储
这种方式是最简单的存储方式,本人只在hive-site.xml中添加如下配置:
注意:使用derby存储方式时,运行hive会在当前目录生成一个derby文件和一个metastore_db目录。这种存储方式的弊端是在同一个目录下同时只能有一个hive客户端能使用数据库,否则会提示如下错误:
hive> show tables;
FAILED: Error in metadata: javax.jdo.JDOFatalDataStoreException: Failed to start database 'metastore_db', see the next exception for details.
NestedThrowables:
java.sql.SQLException: Failed to start database 'metastore_db', see the next exception for details.
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask
二、本地mysql存储
这种方式存储需要在本地运行一个mysql服务器,并做如下配置(需要将mysql的jar包拷贝到$HIVE_HOME/lib目录下)
三、远端mysql
这种方式存储需要在远端服务器运行一个mysql服务器,并且需要在Hive服务器启动meta服务。远程mysql服务器ip:192.168.200.110,数据库hive_remote,配置如下:
注意:这里把hive的服务端和客户端都放在同一台服务器上了。服务端和客户端可以拆开,将hive-site.xml配置文件拆为如下两部分:
1)服务端配置:
2)客户端配置:
启动hive服务端程序:hive --service metastore
客户端直接使用hive命令即可
由于公司使用的是内网环境,网盘用不了,自己装的虚拟环境也不能通过yum来进行安装,下载的rpm包又缺少其他的依赖,只能选择本地derby存储。接下来,配置spark on hive(前提hdfs、yarn、hive已经搭建好了):
1、hive-site.xml配置:
2、在spark的conf中创建hive-site.xml的软连接 ln -s /xxx/xxx/hive-site.xml
3、配置spark-env.sh:
export JAVA_HOME=/opt/module/jdk1.8.0_211
export SCALA_HOME=/opt/module/scala-2.11.12
export HADOOP_HOME=/opt/module/hadoop-2.7.2
export HADOOP_CONF_DIR=/opt/module/hadoop-2.7.2/etc/hadoop
4、将spark的jars中的所有包上传到hdfs上,然后在spark-default.xml中配置路径。这样可以提高程序运行过程中寻找jar包的效率
hadoop fs -put spark/jars/* /spark_jars/
spark-default.xml中配置:
spark.yarn.jars=hdfs://hadoop110:9000/spark_jars/*
5、启动hive服务:hive --service metastore &
6、启动spark的thriftserver服务:/opt/module/spark-2.1/sbin/start-thriftserver.sh
7、启动beeline,注意:下次启动需要在同一个目录下,否则就会生成新的元数据文件。
启动多个beeline窗口也可以访问滴。哈哈哈!!!