hive on spark大体与SparkSQL结构类似,只是SQL引擎不同,但是计算引擎都是spark!
这里说的Hive on Spark是Hive跑在Spark上,用的是Spark执行引擎,而不是MapReduce。
sparksql和hive on spark时间差不多,但都比hive on mapreduce快很多,官方数据认为spark会比传统mapreduce快10-100倍。
1、mysql在本地的情况
依赖环境
JDK:1.8 Hadoop 2.7.4 spark版本2.1.1 centos:7.3
hadoop001(master) 主机: 192.168.119.51
hadoop002(slave1) 从机: 192.168.119.52
hadoop003(slave2) 从机: 192.168.119.53
一台物理机(windows10 64位),安装三台虚拟机(master ,slave1 ,slave2)。
安装
Mysql,Hive都安装在master这台机器上。首先在master上面安装Mysql5.7(参考其他资料安装)。
下载解压
下载apache-hive-2.3.2-bin.tar.gz,通过rz命令上传到master。解压文件,tar -zxvf apache-hive-2.3.2-bin.tar.gz。修改文件夹名称,mv apache-hive-2.3.2-bin hive。
环境变量
如果是对所有的用户都生效就修改vi /etc/profile 文件
如果只针对当前用户生效就修改 vi ~/.bahsrc 文件
sudo vi /etc/profile
#hive
export PATH=${HIVE_HOME}/bin:$PATH
export HIVE_HOME=/home/hadoop/app/hive/
使环境变量生效,运行 source /etc/profile使/etc/profile文件生效
Hive 配置 Hadoop HDFS
在conf目录下,拷贝模板进行配置:
mv hive-default.xml.template hive-site.xml
mv hive-env.sh.template hive-env.sh
在目录$HIVE_HOME/bin下面,修改文件hive-env.sh,增加以下内容:
export HADOOP_HOME=/home/hadoop/app/hadoop
export HIVE_CONF_DIR=/home/hadoop/app/hive/conf
export HIVE_AUX_JARS_PATH=/home/hadoop/app/hive/lib
修改hive-site.xml文件,修改内容如下:
<configuration> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://192.168.119.51:3306/hive_db?createDatabaseIfNotExist=true</value> <description>JDBC connect string for a JDBC metastore</description> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> <description>Driver class name for a JDBC metastore</description> </property> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>hive</value> <description>username to use against metastore database</description> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>hive</value> <description>password to use against metastore database</description> </property> </configuration>
防止hive启动报错:system:java.io.tmpdir等
解决方法:
在hive-site.xml中添加
<property> <name>system:java.io.tmpdir</name> <value>/home/hadoop/app/hive/tmpdir</value> </property> <property> <name>system:user.name</name> <value>hive</value> </property>
hive-site配置内的其他内容可以不用动。
运行进入mysql,添加hive用户,并授权。
mysql> create user ‘hive’@’%’ identified by ‘hive’;
mysql> grant all on *.* to ‘hive’@localhost identified by ‘hive’;
mysql> flush privileges;
拷贝一个mysql的连接jar包到lib目录下,我用的是 mysql-connector-java-5.1.42.jar
这样就可以开始初始化了,先启动hadoop,然后在hive的bin目录下执行命令:
./schematool -initSchema -dbType mysql
如果看到如下,表示初始化成功
Starting metastore schema initialization to 2.3.0
Initialization script hive-schema-2.3.0.mysql.sql
Initialization script completed
schemaTool completed
配置hive on spark
将hadoop的配置文件core-site.xml和hive的配置文件hive-site.xml拷贝到spark的conf目录下,并将mysql-connector-java-5.1.42.jar拷贝到spark的jars目录下。
进入spark的bin目录,运行如下命令:
hadoop@hadoop001 bin]$ ./spark-sql \
> –master spark://hadoop001:7077 \
> –executor-memory 1g \
> –total-executor-cores 2 \
> –driver-class-path /home/hadoop/app/hive/lib/mysql-connector-java-5.1.42-bin.jar;
(mysql-connector-java-5.1.42.jar拷贝到spark的jars目录后–driver该条命令可以省略)
进入spark-sql。
测试spark-sql
首先在本地新建一个叫person.txt的文件,内容如下:
1,zhangsan,18 2,lisi,20 3,wangwu,22 4,zhaoliu,24
spark-sql>show databases;
可以看到有一个默认的数据库名字叫default。(就是配置中的初始化的hive_db数据库)
使用默认数据库
spark-sql>use default;
新建person数据表
spark-sql>create table person(id int,name string,age int) row format delimited fields terminated by “,”;
加载本地数据信息
spark-sql>load data local inpath “/home/hadoop/files/person.txt” into table person;
查询表信息
spark-sql>select * from person order by age desc;
可以得到测试数据:
4,zhaoliu,24 3,wangwu,22 2,lisi,20 1,zhangsan,18
说明hive on spark 安装成功。
2、mysql在远程的情况
依赖环境
JDK:1.8 Hadoop 2.7.4 spark版本2.1.1 centos:7.3
hadoop001(master) 主机: 192.168.119.51
hadoop002(slave1) 从机: 192.168.119.52
hadoop003(slave2) 从机: 192.168.119.53
一台物理机(windows10 64位),安装三台虚拟机(master ,slave1 ,slave2)。
Mysql在远程的情况是Mysql安装在物理机(windows10)上面。Hive要安装在master上面。
关键的区别在于Hive的hive-site.xml配置中的IP地址要修改成物理机的地址。
由于物理机与虚拟机之间使用的连接是:VMware Virtual Ethernet Adapter for VMnet8
IPv4 地址: 192.168.119.1,所以将hive-site.xml修改如下:
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://192.168.119.1:3306/hive_db?createDatabaseIfNotExist=true</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
<description>username to use against metastore database</description>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>hive</value>
<description>password to use against metastore database</description>
</property>
</configuration>
关键点说明:要保证虚拟机的hive与物理机的mysql正确连接一定要注意以下几点:
1、关闭物理机的防火墙!!!关闭物理机的防火墙!!!关闭物理机的防火墙!!!重要的事情说三遍!
有些时候配置都正确,ping物理机也能通,但是就是连不通,报一些连接失败的信息,其实是防火墙在作怪。
2、在物理机mysql执行命令:
mysql> create user ‘hive’@’%’ identified by ‘hive’;
mysql> grant all on *.* to ‘hive’@localhost identified by ‘hive’;
mysql> flush privileges;
创建hive用户,授权可以远程访问。
3、在物理机Mysql新建hive_db数据库后,执行命令:
alter database hive character set latin1;
因为物理机默认是UTF-8的编码,而centos默认的编码是latin1。
4、修改hive-site.xml配置之后,对hive进行初始化
./schematool -initSchema -dbType mysql
其他步骤和Mysql本地的配置安装步骤相同,就不再赘述。