软件环境:

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. mtk display 架构

    Hwc Dispatch Layers  .Layer 的区分 每个layer 都会有对应的一个BufferQueue,BufferQueue都有一个mConnectapi属性,mConnectAPI ...

  2. ScrollView双击图片定点放大

    直接先说原理吧--原理:利用了scrollview的回调函数(如下)以及scrollview自己内部的一些缩放规则(其实我也还没弄清楚具体scrollview干了什么事),只是知道了它可以怎么做-_- ...

  3. 【转】java中Thread类方法介绍

    原文: java中Thread类方法介绍 http://blog.csdn.net/seapeak007/article/details/53395609 这篇文章找时间分析一下!!!:http:// ...

  4. struct结构体在c和c++中的差别

    非常多次遇到这个struct的问题,今天在这里简单总结一下我的理解 一.struct在C 中的使用 1.单独使用struct定义结构体类型 struct Student { int id; int n ...

  5. [LeetCode][Java] N-Queens II

    题目: Follow up for N-Queens problem. Now, instead outputting board configurations, return the total n ...

  6. java梳理-反射

    本文属于面试题梳理系列:问题:java反射类的訪问私有方法与普通方法相比,须要多处理什么?  之前梳理类载入的时候,介绍到初始化的时机之中的一个:用java.lang.reflect包的方法对类进行反 ...

  7. Linux Framebuffer驱动剖析之中的一个—软件需求

    嵌入式企鹅圈将以本文作为2015年的终结篇,以回应第一篇<Linux字符设备驱动剖析>.嵌入式企鹅圈一直专注于嵌入式Linux和物联网IOT双方面的原创技术分享,稍后会公布嵌入式企鹅圈的2 ...

  8. ORACLE 11G 怎样改动 awr 的保留期限小于8天

     ORACLE 11G 怎样改动 awr 的保留期限小于8天 Oracle Database 11g 默认具备一个系统定义的Moving Window Baseline,该基线相应于 AWR 保留 ...

  9. P1830 轰炸III

    P1830 轰炸III 84通过 145提交 题目提供者wanglichao1121 标签模拟矩阵洛谷原创 难度普及/提高- 提交该题 讨论 题解 记录 最新讨论 暂时没有讨论 题目背景 一个大小为N ...

  10. java有用的启动参数

    三大类选项: 1. 标准选项: 功能是很稳定的,所有的标准选项都是以-开头,比如-version, -server等. 2. X选项:以-X开头,这类选项的功能还是很稳定,但官方的说法是它们的行为可能 ...