软件环境:

linux系统: CentOS6.7
Hadoop版本: 2.6.5
zookeeper版本: 3.4.8

##主机配置:
######一共m1, m2, m3这五部机, 每部主机的用户名都为centos
```
192.168.179.201: m1
192.168.179.202: m2
192.168.179.203: m3

m1: Zookeeper, Namenode, DataNode, ResourceManager, NodeManager, Master, Worker

m2: Zookeeper, Namenode, DataNode, ResourceManager, NodeManager, Worker

m3: Zookeeper, DataNode, NodeManager, Worker



####参考资料:

spark源码编译教程

http://blog.csdn.net/yanran1991326/article/details/46506595

Hive on Spark搭建教程以及遇到的坑指南

http://www.cnblogs.com/breg/p/5552342.html(可作为遇到坑时查看使用)

http://www.cnblogs.com/linbingdong/p/5806329.html(建议参照该教程)

官方参考配置文件

https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties#ConfigurationProperties-Spark

Hive On Spark官网资料:

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

关于Hive on Spark的讨论和进度(官方):

https://issues.apache.org/jira/browse/HIVE-7292



####说明:
要使用Hive on Spark,所用的Spark版本必须不包含Hive的相关jar包,Hive官网上指出:`Note that you must have a version of Spark which does not include the Hive jars.`
在spark官网下载的编译的Spark都是有集成Hive的,因此需要自己下载源码来编译,并且编译的时候不指定Hive ---
<br>
<br>
##一.安装Maven: (Linux下, 若使用Spark源码包自带的编译工具,则可跳过此步)
####参考资料

Maven教程:

http://wiki.jikexueyuan.com/project/maven/

1. 下载Maven安装包

2. 解压Maven到指定位置

3. 编辑/etc/profile文件

vi /etc/profile

export M2_HOME=/home/centos/soft/maven

PATH=$PATH:$M2_HOME/bin

source /etc/profile


4. 检验是否安装成功

mvn -v


5. 设置maven内存大小
#####Linux下:

vi /etc/profile

export MAVEN_OPTS=-Xmx2g -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=512m

#####Windows下:

新建变量: MAVEN_OPTS

将变量MAVEN_OPTS的值设置成: -Xmx2g -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=512m



---
<br>
<br>
<br>
<br>
##二.编译spark源码:
####参考资料:

spark源码下载官方地址:

http://spark.apache.org/downloads.html

spark源码编译官方指南:

http://spark.apache.org/docs/1.5.0/building-spark.html

spark源码编译教程:

http://blog.csdn.net/yanran1991326/article/details/46506595

Hive On Spark遇坑指南:

http://www.cnblogs.com/linbingdong/p/5806329.html



---
####1. 编译指令:
(切记不可用`-Phive`参数; 推荐使用第一种方案, 因为第二种方案亲测编译成功后各种缺包报错)
**方案一:maven编译: (Linux下,推荐使用这种方法)**
如果想生成一个用scala2.1.2编译的spark 部署包,则要先执行`change-scala-version.sh`文件,执行指令如下:

./dev/change-scala-version.sh 2.10 (若要指定scala的编译版本时, 必须先执行该指令)

mvn -Phadoop-2.6 -Pyarn -Dhadoop.version=2.6.5 -Dyarn.version=2.6.5 -Dscala-2.10 -DskipTests clean package

指令参数使用介绍:

–Phadoop-$系列: 打包时所用的Hadoop系列号,不加此参数时hadoop为pom.xml的默认系列。

-Dhadoop.version=$版本号 打包时所用的Hadoop版本号,不加此参数时不可从HDFS上读取数据。

–Pyarn 是否支持Hadoop YARN,不加参数时为不支持yarn。

-Dyarn.version=$版本号 是否支持Hadoop YARN,不加参数时为不支持yarn调度。

–Phive 是否在Spark SQL中支持hive,不加此参数时为不支持hive。(若要使用Hive on Spark功能时, 不能添加次参数)

-Dscala-$版本号 打包时所用的Scala系列号,不加此参数时Scala版本为pom.xml的默认版本, 在使用此函数之前必须先执行./dev/change-scala-version.sh 2.10指令,否则无效

-DskipTests 是否在编译的过程中略过测试,加此参数时为略过。


<br>
**方案二:使用spark源码包中自带的`make-distribution`编译工具**
编译Spark源码(若需要用到parquet功能,则带上`parquet-provided`参数)
(1)Spark2.0版本之前(hadoop版本可随实际情况修改)

./make-distribution.sh --name "hadoop2-without-hive" --tgz "-Pyarn,hadoop-provided,hadoop-2.4,parquet-provided"

(2)Spark2.0版本之后(hadoop版本可随实际情况修改)

./dev/make-distribution.sh --name "hadoop2-without-hive" --tgz "-Pyarn,hadoop-provided,hadoop-2.7,parquet-provided"



---
<br>
<br>
####2. 编译完成
**方案一:使用Maven方式编译:**
编译成功后的Spark引用包的存放位置:

$Spark源码目录/assembly/target/scala-2.10/spark-assembly-1.6.3-hadoop2.6.5.jar

该包的只是一个资源包, 应把tgz解压安装的`$SPARK_HOME/lib`目录下的`assembly`删除, 然后将该包放入到`$SPARK_HOME/lib`目录下

**方案二:使用`make-distribution.sh`方式编译:**
编译成功后的Spark安装包的存放位置:

$Spark源码目录/spark-1.6.0-bin-hadoop2-without-hive-src.tgz

该包是一个安装包, 用tar解压出安装即可, 不推荐使用

---
<br>
<br>
####3.更新说明
更新之前有个`BUG`, 就是在此之前编译的Spark部署包并不能操作Hive中`Paruqet`, 个人猜测的原因是: 因为我之前推荐的是`Maven`来编译`Spark`部署包, 但是在编译的包里并没有支持`Parquet`的`JAR`包,所以当操作`Parquet`表时就会报错, 在此进行`BUG`修复, 若不使用`parquet`存储格式, 则可继续用以前的方式编译,并无大碍
想要使用`Parquet`储存方式, 本人目前掌握的方法是:
使用spark源码包中自带的`make-distribution`编译工具, 编译指令为:

./dev/make-distribution.sh --name "hadoop2-without-hive" --tgz "-Pyarn,hadoop-provided,hadoop-2.6,parquet-provided"

####编译建议:
在此假设你编译成功, 如果编译不成功除了对内存溢出或者报了很明显的错误之外, 其他错误的处理办法都是不断的重试,重试,再重试,不断的输入编译指令进行编译,就能编译成功了,编译时间长短不定,建议编译成功之后别把spark的源码目录删除, 因为只要没删除以后编译相同版本的就会容易很多 ---
在之前说过, 用`make-distribution.sh`编译的`Spark`部署包是会报错的, 那么下面对报错进行解决:
**问题1:**
启动spark集群时报错,启动Master节点,报错信息为:

Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/Logger

at java.lang.Class.getDeclaredMethods0(Native Method)

at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)

at java.lang.Class.privateGetMethodRecursive(Class.java:3048)

at java.lang.Class.getMethod0(Class.java:3018)

at java.lang.Class.getMethod(Class.java:1784)

at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544)

at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526)

Caused by: java.lang.ClassNotFoundException: org.slf4j.Logger

at java.net.URLClassLoader.findClass(URLClassLoader.java:381)

at java.lang.ClassLoader.loadClass(ClassLoader.java:424)

at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)

at java.lang.ClassLoader.loadClass(ClassLoader.java:357)

... 7 more


####解决方案:
将`/home/centos/soft/hadoop/share/hadoop/common/lib`目录下的`slf4j-api-1.7.5.jar`文件,`slf4j-log4j12-1.7.5.jar`文件和`commons-logging-1.1.3.jar`文件拷贝到`/home/centos/soft/spark/lib`目录下 ---
**问题2:**
启动spark集群时报错,启动Master节点,报错信息为:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/conf/Configuration

at java.lang.Class.getDeclaredMethods0(Native Method)

at java.lang.Class.privateGetDeclaredMethods(Class.java:2570)

at java.lang.Class.getMethod0(Class.java:2813)

at java.lang.Class.getMethod(Class.java:1663)

at sun.launcher.LauncherHelper.getMainMethod(LauncherHelper.java:494)

at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:486)

Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.conf.Configuration

at java.net.URLClassLoader$1.run(URLClassLoader.java:366)

at java.net.URLClassLoader$1.run(URLClassLoader.java:355)

at java.security.AccessController.doPrivileged(Native Method)

at java.net.URLClassLoader.findClass(URLClassLoader.java:354)

at java.lang.ClassLoader.loadClass(ClassLoader.java:425)

at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)

at java.lang.ClassLoader.loadClass(ClassLoader.java:358)

... 6 more



####解决方案:

官网参考:

https://spark.apache.org/docs/latest/hadoop-provided.html#apache-hadoop

编辑`spark-env.sh`文件,添加下列该项:

vi $SPARK_HOME/conf/spark-env.sh

export SPARK_DIST_CLASSPATH=$(/home/centos/soft/hadoop/bin/hadoop classpath)



---
<br>
<br>
####三.配置YARN
若Hive on Spark使用YARN作为调度器,则配置YARN,否则,跳过此步骤,不进行配置.

官方参考资料:

https://hadoop.apache.org/docs/r2.4.1/hadoop-yarn/hadoop-yarn-site/CapacityScheduler.html

https://hadoop.apache.org/docs/r2.7.1/hadoop-yarn/hadoop-yarn-site/FairScheduler.html



---
<br>
<br>
<br>
<br>
##四.配置Hive
####1.导包到`HIVE_HOME/lib`目录下
(1)在Hive-2.2.0版本之前

将$SPARK_HOME/lib目录下assembly的jar包链接到HIVE_HOME/lib目录下


(2)在Hive-2.2.0版本之后,
yarn模式:

将scala-library, spark-core, spark-network-common包链接到HIVE_HOME/lib目录下

本地模式:

chill-java, chill, jackson-module-paranamer, jackson-module-scala, ersey-container-servlet-core, jersey-server, json4s-ast, kryo-shaded, minlog, scala-xml, spark-launcher, spark-network-shuffle, park-unsafe, xbean-asm5-shaded包链接到HIVE_HOME/lib目录下



---
<br>
####2.上传JAR包到HDFS上
(1)在Hive-2.2.0版本之前,
将`$HIVE_HOME/lib`目录下assembly的包上传到HDFS上,并在`hive-site.xml`文件中配置assembly包位置:

spark.yarn.jar
hdfs://ns1/spark-assembly.jar

```

(2)在Hive-2.2.0版本之后,

将$SPARK_HOME/lib目录下的所有包上传到HDFS上,并在hive-site.xml文件中配置以下配置项:

<property>
<name>spark.yarn.jars</name>
<value>hdfs://ns1/spark-jars/*</value>
</property>



####3.综上所述:
Hive的配置项为以下配置, 编辑`hive-site.xml`文件 (以下配置是Spark2.2.0之前的YARN模式下的配置)
```

spark.master
yarn-cluster
YARN Model

spark.master
spark://m1:7077
Standalone Model

spark.home
/home/centos/soft/spark/

hive.execution.engine
spark

spark.enentLog.enabled
true

spark.enentLog.dir
/home/centos/soft/spark/logs/enentLogDir

spark.serializer
org.apache.spark.serializer.KryoSerializer

spark.executor.extraJavaOptions
-XX:+PrintGCDetails -Dkey=value -Dnumbers="one two three"

spark.executor.cores
1

spark.executor.instances
1

spark.executor.memory
512m

spark.driver.memory
512m

yarn.nodemanager.resource.memory-mb
512

spark.yarn.executor.memoryOverhead
75

spark.yarn.driver.memoryOverhead
75

spark.yarn.jar
hdfs://ns1/Jar/spark-assembly-1.6.0-hadoop2.6.0.jar

hive.spark.client.channel.log.level
DEBUG

hive.spark.client.rpc.server.address
m1

spark.driver.extraJavaOptions
-XX:PermSize=128M -XX:MaxPermSize=512M

hive.optimize.index.filter
true

hive.optimize.index.groupby
true

```






##三.配置Spark
####举例说明:
1. 当在YARN模式下运行Spark时,我们通常建议将`spark.executor.cores`设置为`5,6或7`(在spark-default.conf中设置),这取决于典型节点可以被整除。例如,如果`yarn.nodemanager.resource.cpu-vcores`是`19`,那么`6`是一个更好的选择(所有执行器只能有相同数量的内核,这里如果我们选择`5`,那么每个执行器只有`3`个内核;如果我们选择`7`,则只使用`2`个执行器,并且将浪费`5`个核心)。如果它是`20`,那么`5`是一个更好的选择(因为这样你会得到`4`个执行者,没有核心被浪费)。

  1. 对于spark.executor.memory,我们建议计算yarn.nodemanager.resource.memory-mb *(spark.executor.cores / yarn.nodemanager.resource.cpu-vcores),然后在spark.executor.memory和spark之间分割yarn.executor.memoryOverhead。根据我们的实验,我们建议将spark.yarn.executor.memoryOverhead设置为总内存的15-20%

  2. 在确定了每个执行器接收到多少内存之后,您需要决定将多少个执行器分配给查询。在GA发行Spark动态执行器分配将被支持。然而对于这个测试,只能使用静态资源分配。基于每个节点中的物理内存和spark.executor.memoryspark.yarn.executor.memoryOverhead的配置,您将需要选择实例数并设置spark.executor.instances

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

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




####配置项解析:
```
spark.executor.cores Between 5-7, See tuning details section
spark.executor.memory yarn.nodemanager.resource.memory-mb * (spark.executor.cores / yarn.nodemanager.resource.cpu-vcores)
spark.yarn.executor.memoryOverhead 15-20% of spark.executor.memory
spark.executor.instances Depends on spark.executor.memory + spark.yarn.executor.memoryOverhead, see tuning details section.
```

配置项范例:

在spark-default.conf文件下配置以下配置项:

spark.executor.cores=1
spark.executor.memory=512m
spark.yarn.executor.memoryOverhead=75
spark.executor.instances=1





##四.配置HPL/SQL
将HPL/SQL存储过程调用的计算引擎改为Spark, 编辑`hplsql-site.xml`文件, 修改下列配置项(因本人使用`Hive On Spark`, 所以在下列配置项中将`mr`改为`spark`, 根据实际情况而定)
```

hplsql.conn.init.hiveconn

set mapred.job.queue.name=default;
set hive.execution.engine=spark;
use default;

Statements for execute after connection to the database

hplsql.conn.init.hive2conn

set mapred.job.queue.name=default;
set hive.execution.engine=spark;
use default;

Statements for execute after connection to the database

```






##五.测试
重启`metastore`, `spark-master`, `spark-slaves`服务, 进入Hive测试
```
sh $SPARK_HOME/bin/stop-master.sh
sh $SPARK_HOME/bin/stop-slaves.sh
sh $SPARK_HOME/bin/start-master.sh
sh $SPARK_HOME/bin/start-slaves.sh
sh $HIVE_HOME/bin/hive --service metastore
sh $HIVE_HOME/bin/hive --service hiveserver2
```

sh  $HIVE_HOME/bin/hive
select count(*) from bill_auth;





##六.官方推荐配置项:
```
mapreduce.input.fileinputformat.split.maxsize=750000000
hive.vectorized.execution.enabled=true
hive.cbo.enable=true
hive.optimize.reducededuplication.min.reducer=4
hive.optimize.reducededuplication=true
hive.orc.splits.include.file.footer=false
hive.merge.mapfiles=true
hive.merge.sparkfiles=false
hive.merge.smallfiles.avgsize=16000000
hive.merge.size.per.task=256000000
hive.merge.orcfile.stripe.level=true
hive.auto.convert.join=true
hive.auto.convert.join.noconditionaltask=true
hive.auto.convert.join.noconditionaltask.size=894435328
hive.optimize.bucketmapjoin.sortedmerge=false
hive.map.aggr.hash.percentmemory=0.5
hive.map.aggr=true
hive.optimize.sort.dynamic.partition=false
hive.stats.autogather=true
hive.stats.fetch.column.stats=true
hive.vectorized.execution.reduce.enabled=false
hive.vectorized.groupby.checkinterval=4096
hive.vectorized.groupby.flush.percent=0.1
hive.compute.query.using.stats=true
hive.limit.pushdown.memory.usage=0.4
hive.optimize.index.filter=true
hive.exec.reducers.bytes.per.reducer=67108864
hive.smbjoin.cache.rows=10000
hive.exec.orc.default.stripe.size=67108864
hive.fetch.task.conversion=more
hive.fetch.task.conversion.threshold=1073741824
hive.fetch.task.aggr=false
mapreduce.input.fileinputformat.list-status.num-threads=5
spark.kryo.referenceTracking=false
spark.kryo.classesToRegister=org.apache.hadoop.hive.ql.io.HiveKey,org.apache.hadoop.io.BytesWritable,org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch
```


Hive扩展功能(七)--Hive On Spark的更多相关文章

  1. Hive扩展功能(九)--Hive的行级更新操作(Update)

    软件环境: linux系统: CentOS6.7 Hadoop版本: 2.6.5 zookeeper版本: 3.4.8 主机配置: 一共m1, m2, m3这三部机, 每部主机的用户名都为centos ...

  2. Hive(十三)【Hive on Spark 部署搭建】

    Hive on Spark 官网详情:https://cwiki.apache.org//confluence/display/Hive/Hive+on+Spark:+Getting+Started ...

  3. hive(七)hive-运行方式、GUI接口、权限管理

    1.Hive运行方式: 命令行方式cli:控制台模式 脚本运行方式(实际生产环境中用最多) JDBC方式:hiveserver2 web GUI接口 (hwi.hue等)   1.1Hive在CLI模 ...

  4. HADOOP docker(七):hive权限管理

    1. hive权限简介1.1 hive中的用户与组1.2 使用场景1.3 权限模型1.3 hive的超级用户2. 授权管理2.1 开启权限管理2.2 实现超级用户2.3 实现hiveserver2用户 ...

  5. Hive扩展功能(四)--HiveServer2服务

    软件环境: linux系统: CentOS6.7 Hadoop版本: 2.6.5 zookeeper版本: 3.4.8 主机配置: 一共m1, m2, m3这五部机, 每部主机的用户名都为centos ...

  6. Hive扩展功能(三)--使用UDF函数将Hive中的数据插入MySQL中

    软件环境: linux系统: CentOS6.7 Hadoop版本: 2.6.5 zookeeper版本: 3.4.8 主机配置: 一共m1, m2, m3这五部机, 每部主机的用户名都为centos ...

  7. Hive扩展功能(一)--Parquet

    软件环境: linux系统: CentOS6.7 Hadoop版本: 2.6.5 zookeeper版本: 3.4.8 主机配置: 一共m1, m2, m3这五部机, 每部主机的用户名都为centos ...

  8. Hive(七)Hive参数操作和运行方式

    Hive参数操作和运行方式 1.Hive参数操作 1.hive参数介绍 ​ hive当中的参数.变量都是以命名空间开头的,详情如下表所示: 命名空间 读写权限 含义 hiveconf 可读写 hive ...

  9. 2 hive的使用 + hive的常用语法

    本博文的主要内容有: .hive的常用语法 .内部表 .外部表 .内部表,被drop掉,会发生什么? .外部表,被drop掉,会发生什么? .内部表和外部表的,保存的路径在哪? .用于创建一些临时表存 ...

随机推荐

  1. Holedox Eating HDU4302 模拟

    Problem Description Holedox is a small animal which can be considered as one point. It lives in a st ...

  2. java的异常(Exception)信息的详细记录

    下面的三个方法都是获取异常的详细信息,或许的异常详细信息以字符串的形式返回,保持栈堆载的风格 方法一: public static String getExceptionAllinformation( ...

  3. 走进windows编程的世界-----画图相关

    Windows画图 1 图形绘制      1.1 图形绘制的方式      获取到画图句柄-设备描写叙述表(DC),使用对应的画图的API,在设备上绘制图形.          1.2 颜色     ...

  4. jquery注冊文本框获取焦点清空,失去焦点赋值

    在我们开发过程中特别是用户注冊时会有一个效果.就是文本框获取焦点清空提示,假设用户没有输入信息失去焦点赋值上我们的提示语 <html> <head> <meta http ...

  5. Linux下Java线程具体监控和其dump的分析使用----分析Java性能瓶颈[张振华-Jack]

    作者:张振华(Jack) 这里对linux下.sun(oracle) JDK的线程资源占用问题的查找步骤做一个小结: linux环境下,当发现java进程占用CPU资源非常高,且又要想更进一步查出哪一 ...

  6. git-svn for mac

    熟练使用 git ,新公司用的是 svn,这就尴尬了,为了这个习惯问题,我还是毅然坚持使用 git,但是又不与公司的 svn 冲突,所以就找到了 git 的 git-svn 插件. 在 mac 上使用 ...

  7. 浅析js的函数的按值传递参数

    js的函数传参的方式是按值传递,正常情况下,改变函数参数的值,并不会对函数外部的变量造成影响.例如: 'use strict';var list = [1, 2, 3]; list.forEach(f ...

  8. SoapUI项目书写自我规范

    -->Assertions 判断某个节点存在(_input_name, _button_name) -->Resource 文件夹命名 值去掉红色部分信息 https://mercury- ...

  9. git reset --hard 回滚以后 以后怎么再回去?

    恢复的过程很简单: 通过git log -g命令来找到需要恢复的信息对应的commitid,可以通过提交的时间和日期来辨别,找到执行reset --hard之前的那个commit对应的commitid ...

  10. ubuntu安装go语言

    1.下载安装包 2.解压 sudo tar -zvxf go1.10.linux-amd64.tar.gz -C /usr/local 3.配置 sudo vim /etc/profile 添加 #s ...