Hive on Spark

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hive on Spark相关的知识,希望对你有一定的参考价值。

参考技术A 版本: 2.3.3

Hive on Spark为Hive提供了 Apache Spark 作为执行引擎。
set hive.execution.engine=spark;

Hive 1.1+以上版本提供Hive on Spark 。它在“ spark ”和“spark2”分支中仍处于发展阶段,并且定期合并到Hive的“主”分支中。
参见 HIVE-7292 及其子任务和相关问题。

Hive on Spark仅用特定版本的Spark进行测试,因此给定版本的Hive只能保证与Spark的特定版本兼容。Spark的其他版本可能与给定版本的Hive一起使用,但不能保证。以下是Hive版本及其相应兼容Spark版本的列表。

按照说明安装Spark:

YARN模式: http : //spark.apache.org/docs/latest/running-on-yarn.html
独立模式: https : //spark.apache.org/docs/latest/spark-standalone.html

Hive on Spark 默认支持 Spark on YARN 模式。

对于安装执行以下任务:

在Spark 2.0.0之前:

从Spark 2.0.0起:

由Spark 2.3.0起:

公平调度程序 是必需的,而不是 容量调度 程序 。这在YARN集群中公平地分配了相同份额的资源。

有关配置Hive和远程Spark驱动程序的其他属性,请参阅 Hive配置属性 的 Spark部分 。

设置执行程序的内存大小要比简单地设置为尽可能大要复杂。有几件事情需要考虑:

以下设置需要针对群集进行调整,这些设置也可能适用于在Spark之外的Hive上提交Spark作业:

在Spark on YARN 时, 我们通常建议将spark.executor.cores设置 为5,6或7,具体取决于可以被节点整除。例如,如果 yarn.nodemanager.resource.cpu-vcores是19,那么6是更好的选择(所有执行者只能拥有相同数量的内核,如果我们选择5,那么每个执行者只能获得3个内核;如果我们选择了7,那么只有2个执行者被使用,5个核心将被浪费)。如果是20,那么5是更好的选择(因为这样你会得到4个执行者,并且没有核心被浪费)。

对于 spark.executor.memory ,我们推荐计算 yarn.nodemanager.resource.memory-mb *(spark.executor.cores / yarn.nodemanager.resource.cpu-vcores), 然后拆分spark.executor.memory和。根据我们的实验,我们建议设置 为总内存的15-20%左右。 spark.yarn.executor.memoryOverhead``spark.yarn.executor.memoryOverhead

在决定每个执行程序接收多少内存之后,您需要决定将多少执行程序分配给查询。在GA版本中,将支持Spark动态执行程序分配。但是,对于这个测试版,只能使用静态资源分配。根据每个节点的物理内存的配置 spark.executor.memory 和 spark.yarn.executor.memoryOverhead ,你需要选择实例和组的数量 spark.executor.instances 。

现在是一个真实世界的例子 假设每个节点具有12个虚拟内核的10个节点具有64GB的内存,例如, yarn.nodemanager.resource.cpu-vcores=12 。一个节点将被用作主节点,因此集群将有9个从节点。我们将配置 spark.executor.cores 为6.鉴于64GB的内存 yarn.nodemanager.resource.memory-mb 将为50GB。我们将确定每个执行程序的内存量如下:50GB *(6/12)= 25GB。我们将分配20% spark.yarn.executor.memoryOverhead ,或5120和80% spark.executor.memory ,或20GB。

在这个9节点集群上,每个主机都有两个执行者。因此,我们可以配置 spark.executor.instances 2到18之间的某个值。值为18将利用整个群集。

https://cwiki.apache.org/confluence/display/Hive/Hive+on+Spark%3A+Getting+Started

有关这些设置的详细信息,请参阅 HIVE-9153 。

有关其他属性,请参阅 配置页面的Spark部分 。

Hive on Spark

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、  创建一张表

  1. >create table  test(id int, name string)ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘\t‘ STORED AS TEXTFILE;  
  2. ‘\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/  

以上是关于Hive on Spark的主要内容,如果未能解决你的问题,请参考以下文章

SparkSQL远程访问CDH集群Hive数据表

sparkspark sql

SparkSpark对数据的读入和写出操作

SparkSpark SQL 物化视图技术原理与实践

Spark

黑猴子的家:Spark on hive 与 hive on spark 的区别