Hive On Spark
一、概述
Hive 是一种数据仓库,即是一种sql翻译器,hive可以将sql翻译成mapreduce程序在hadoop中去执行,默认支持原生的Mapreduce引擎。从hive1.1版本以后开始支持Spark。可以将sql翻译成RDD在spark里面执行。Hive支持的spark是那种spark-without-hive,即没有编译支持hive包的spark。
二、安装版本及软件
需要安装:scala-2.12、jdk1.8、hive-2.1.1、spark-1.6.3-bin-hadoop2.4-without-hive、hadoop-2.x.本例用的hadoop-2.7.3
三、安装前的准备
1、下载软件
1)下载scala-2.12
https://downloads.lightbend.com/scala/2.12.3/scala-2.12.3.tgz
2)下载hive-2.1.1
http://mirror.bit.edu.cn/apache/hive/stable-2/apache-hive-2.1.1-bin.tar.gz
3)下载spark-1.6.3-bin-hadoop2.4-without-hive
http://mirror.bit.edu.cn/apache/spark/spark-1.6.3/spark-1.6.3-bin-hadoop2.4-without-hive.tgz
4)下载hadoop-2.7.3
https://hadoop.apache.org/releases.html
四、 安装
创建一个目录,将所有的包都解压到该目录下,统一配置。
做完上述步骤后,按如下方式添加环境变量:
# cat /etc/profile
export JAVA_HOME=/usr/local/java
export PATH=$JAVA_HOME/bin:/usr/local/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export SCALA_HOME=/usr/share/scala/
export HADOOP_HOME=/da/hadoop-2.7.3/
export PATH="$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH"
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop
export SPARK_HOME=/da/spark-1.6.3-bin-hadoop2.4-without-hive
export PATH="$SPARK_HOME/bin:$PATH"
export CLASSPATH=.:${JAVA_HOME}/lib:${SCALA_HOME}/lib:${HIVE_HOME}/lib:$CLASSPATH
# source /etc/profile
1、 hadoop安装和启动
1) 设置免密码登录
# ssh-keygen –t rsa
一路回车
会在当前用户的家目录下的.shh目录下生成密钥和公钥(id_rsa、id_rsa.pub)
在.ssh目录下创建authorithed.keys文件,将id_rsa.pub文件内容copy到authorithed.keys里面:
#cat id_rsa.pub >authorithed.keys
并修改权限为600:
#chmod 600 authorithed.keys
2) 创建需要用到的目录
#mkdir /da/Hadoop/{tmp,var,dfs}
#mkdir /da/Hadoop/dfs/{name,data}
3) 修改配置文件
!修改core-site.xml
<property>
<name>hadoop.tmp.dir</name>
<value>/da/hadoop/tmp</value>
</property>
<property>
<name>fs.default.name</name>
<value>hdfs://192.168.1.11:9000</value>
</property>
!修改hadoop-env.sh
将export JAVA_HOME=${JAVA_HOME} 修改为:
export JAVA_HOME=/usr/local/java
!修改hdfs-site.xml
<property>
<name>dfs.name.dir</name>
<value>/da/hadoop/dfs/name</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>/da/hadoop/dfs/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
!在该版本中,有一个名为mapred-site.xml.template的文件,复制该文件,然后改名为mapred-site.xml,并进行修改:
# cp mapred-site.xml.template mapred-site.xml
# cat mapred-site.xml
<property>
<name>mapred.job.tracker</name>
<value>192.168.1.11:49001</value>
</property>
<property>
<name>mapred.local.dir</name>
<value>/da/hadoop/var</value>
</property>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
!修改yarn-site.xml
<property>
<name>yarn.resourcemanager.hostname</name>
<value>192.168.1.11</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>${yarn.resourcemanager.hostname}:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>${yarn.resourcemanager.hostname}:8030</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>${yarn.resourcemanager.hostname}:8088</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.https.address</name>
<value>${yarn.resourcemanager.hostname}:8090</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>${yarn.resourcemanager.hostname}:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>${yarn.resourcemanager.hostname}:8033</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>8182</value>
</property>
<property>
<name>yarn.nodemanager.vmem-pmem-ratio</name>
<value>3.1</value>
</property>
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>2048</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
# 内存越大越好,这里只是做测试。
2、启动hadoop
如果是第一次启动hadoop,在启动之前需要先进行初始化。
# hadoop namenode –format
!!!初始化操作只进行一次
接下来进入到sbin目录下:
# ./start-all.sh
!!可以直接访问如下地址:
http://ip:50070、http://ip:50090、http://ip:8088
2、 安装配置spark
修改conf文件夹下的如下文件:
!#cp spark-env.sh.template spark-env.sh
export SCALA_HOME=/usr/share/scala/
export JAVA_HOME=/usr/local/java
export HADOOP_HOME=/da/hadoop-2.7.3/
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export SPARK_HOME=/da/spark-1.6.3-bin-hadoop2.4-without-hive
export SPARK_MASTER_IP=192.168.1.11
export SPARK_EXECUTOR_MEMORY=2048m
!#cp spark-defaults.conf.template spark-defaults.conf
spark.master spark://192.168.1.11:7077
spark.eventLog.enabled true
spark.eventLog.dir hdfs://192.168.1.11:8021/directory
spark.serializer org.apache.spark.serializer.KryoSerializer
spark.driver.memory 2048M
spark.executor.extraJavaOptions -XX:+PrintGCDetails -Dkey=value -Dnumbers="one two three"
1) 在HDFS上创建目录
因为上面的配置中让spark将eventLog存到HDFS的directory目录下,所以需要执行hadoop命令,在HDFS上创建directory目录,创建目录命令是:
#hadoop fs -mkdir -p /directory
#hadoop fs -chmod 777 /directory
2) 启动spark
到sbin目录下:
# ./start-all.sh
!!!可以访问如下地址:
http://ip:8080
3、 配置hive
1) 创建HDFS目录
hive的文件存储在hadoop提供的HDFS分布式文件系统里,需要调用hadoop命令,在hdfs上创建几个目录。
#hadoop fs -mkdir -p /da/hive/warehouse
#hadoop fs -chmod 777 /da/hive/warehouse
#hadoop fs -mkdir -p /tmp/hive
#hadoop fs -chmod 777 /tmp/hive
2) 修改配置文件
!#cp hive-env.sh.template hive-env.sh
export HADOOP_HOME=/da/hadoop-2.7.3/
export HIVE_CONF_DIR=/da/apache-hive-2.1.1-bin/conf
export HIVE_AUX_JARS_PATH=/da/apache-hive-2.1.1-bin/lib
!#cp hive-default.xml.template hive-site.xml
<property>
<name>hive.execution.engine</name>
<value>spark</value>
</property>
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://192.168.1.11:3306/hive?createDatabaseIfNotExist=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>1qaz*@WSX</value>
</property>
<property>
<name>hive.enable.spark.execution.engine</name>
<value>true</value>
</property>
<property>
<name>spark.home</name>
<value>/da/spark-1.6.3-bin-hadoop2.4-without-hive</value>
</property>
<property>
<name>spark.master</name>
<value>spark://192.168.1.11:7077</value>
</property>
<property>
<name>spark.submit.deployMode</name>
<value>client</value>
</property>
<property>
<name>spark.serializer</name>
<value>org.apache.spark.serializer.KryoSerializer</value>
</property>
<property>
<name>spark.eventLog.enabled</name>
<value>true</value>
</property>
<property>
<name>spark.eventLog.dir</name>
<value>hdfs://192.168.1.11:9000/directory</value>
</property>
<property>
<name>spark.executor.memory</name>
<value>2048m</value>
</property>
3) 将mysql驱动包copy到hive的llib目录下:
!自己去网上下载mysql-connector-java-5.1.43-bin.jar
# cp mysql-connector-java-5.1.43-bin.jar /da/apache-hive-2.1.1-bin /lib
4) 将/da/spark-1.6.3-bin-hadoop2.4-without-hive/lib目录下的spark-assembly-1.6.3-hadoop2.4.0.jar包拷贝到/da/apache-hive-2.1.1-bin/lib目录下。
# cp /da/spark-1.6.3-bin-hadoop2.4-without-hive/lib/spark-assembly-1.6.3-hadoop2.4.0.jar /da/apache-hive-2.1.1-bin/lib
4、 初始化hive元数据库
进入到hive的bin目录下:
# ./schematool -initSchema -dbType mysql
5、 启动hive,进入hive的bin目录
#./hive
6、 创建一张表
- >create table test(id int, name string)ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘\t‘ STORED AS TEXTFILE;
- ‘\t‘表示此表的内容是以制表符分割的,所以不能使用空格,否则不识别数据。
添加一些数据到表test里面
#vim /da/test.txt
1 test1
2 test2
3 test3
>load data local inpath‘/da/test.txt‘ into table test;
7、 对hive on spark进行测试
>select count(*) from test;
如果该命令能够正确执行,证明部署成功。
如果Hive On Spark运行成功,可以在spark的UI界面上查看, Hive中成功调用了Spark集群来执行任务。访问下面的地址:http://ip:8080/