一、准备
- jdk、hadoop、Hive、mysql和spark。为避免兼容问题,本人全部采用cdh版本,对应cdh5.15.0,不过貌似spark版本有点低,不过无所谓,毕竟只是实验。
- 由于本人之前搭建过kylin环境,因此hadoop和hive环境已经配置妥当,都是yarn管理下的伪分布式集群。
- 安装scala,mac下通过brew安装:
brew install scala
,网速慢可以使用代理或国内源。 - hadoop、hive、spark的基本概念,原理,运行方式可做一个初步了解,方便以后问题排查。
二、配置SPARK
在/etc/profile或~/.bash_profile(假设你没有使用zsh之类的shell)中加入SPARK_HOME环境变量,并将bin路径添加到PATH中。
1
2export SPARK_HOME=/Users/xxx/spark-1.6.0-cdh5.15.0
export PATH=$PATH:$SPARK_HOME/bin在spark下的config目录中找到spark-env.sh和spark-defaults.conf(如果没有就自己创建),然后添加如下配置:
spark-env.sh
1
2
3
4
5
6
7
8
9
10
11!/usr/bin/env bash
export SCALA_HOME=/usr/local/Cellar/scala/2.12.7 #注意scala版本
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home
export HADOOP_HOME=/Users/xxx/hadoop-2.6.0-cdh5.15.0
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop #hadoop配置文件目录
export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop #yarn配置文件目录(和hadoop配置在一起)
export SPARK_MASTER_IP=localhost #master节点IP,本地搭建使用localhost
export SPARK_MASTER_HOST=localhost #master机器名称,本地搭建可使用localhost代替
export SPARK_EXECUTOR_MEMORY=512m #每个executor可分配的内存,可根据机器实际情况设置为512m到1g
export SPARK_DRIVER_MEMORY=512m #driver可分配的内存,可根据机器实际情况设置为512m到1g
export SPARK_DIST_CLASSPATH=$(${HADOOP_HOME}/bin/hadoop classpath) #saprk运行依赖hadoop的库spark-defaults.conf
1
2
3
4
5
6
7
8spark.master yarn
spark.home /Users/xxx/spark-1.6.0-cdh5.15.0
spark.eventLog.enabled true
spark.eventLog.dir hdfs://localhost:8001/spark_history
spark.serializer org.apache.spark.serializer.KryoSerializer
spark.executor.memory 512m
spark.driver.memory 512m
spark.executor.extraJavaOptions -XX:+PrintGCDetails -Dkey=value -Dnumbers="one two three"注意:这里将spark托管到yarn上,所以spark.master配置为yarn,日志目录必须是hdfs路径下的 已经存在的目录,如果不存在请手动创建
hdfs dfs -mkdir /spark_history
,这个目录也是后面的spark history服务依赖的目录。
三、配置Hive
将spark-defaults.conf中的配置同步到hive配置中,在hive下的conf目录下找到hive-site.xml,增加如下内容:
hive-site.xml1
2
3
4
5
6
7<!-- 注意:hive.execution.engine在这里设置表示hive默认使用spark引擎,
也可以不在这里设置,进入hive cli或客户端后使用set hive.execution.engine=spark
启用spark引擎,但这种方式只针对当前会话有效。-->
<property>
<name>hive.execution.engine</name>
<value>spark</value>
</property>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<property>
<name>spark.home</name>
<value>/Users/xxx/spark-1.6.0-cdh5.15.0</value>
</property>
<property>
<name>spark.master</name>
<value>yarn</value>
</property>
<property>
<name>spark.executor.memory</name>
<value>512m</value>
</property>
<property>
<name>spark.driver.memory</name>
<value>512m</value>
</property>
<property>
<name>spark.serializer</name>
<value>org.apache.spark.serializer.KryoSerializer</value>
</property>
<property>
<name>spark.enentLog.enabled</name>
<value>true</value>
</property>
<property>
<name>spark.enentLog.dir</name>
<value>hdfs://localhost:8001/spark_history</value>
</property>
<property>
<name>spark.executor.extraJavaOptions</name>
<value>-XX:+PrintGCDetails -Dkey=value -Dnumbers="one two three"</value>
</property>注意:这里的配置务必和spark-defaults.conf中的一致,尤其是
spark.executor.memory
和spark.driver.memory
,自己配置时填错了这两项,结果一堆莫名其妙的异常。
四、配置yarn
配置yarn,在hadoop的etc/hadoop目录下找到yarn-site.xml,增加(修改)如下内容:
yarn-site.xml1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20<!-- yarn资源调度器:公平调度 -->
<property>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
</property>
<!-- NM的web监控地址,主要是端口设置 -->
<property>
<name>yarn.nodemanager.webapp.address</name>
<value>0.0.0.0:8042</value>
</property>
<!-- NM可分派的内存量,单机的话看机器剩余内存量配置 -->
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>8192</value>
</property>
<!-- NM可分配的虚拟CPU数,单机的话配置为CPU核数-2或-1 -->
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>6</value>
</property>
五、其他配置
CDH版本的Hive与Spark没有联系,需要我们手动将spark lib中的
spark-assembly-1.6.0-cdh5.15.0-hadoop2.6.0-cdh5.15.0.jar
拷贝到hive lib下,hive才能与spark建立联系。使用spark自带的example进行测试诊断(cd到spark bin目下):
./spark-submit --master yarn --class org.apache.spark.examples.SparkPi ../lib/spark-examples-1.6.0-cdh5.15.0-hadoop2.6.0-cdh5.15.0.jar 10
,具体example jar路径及文件名自行查看。运行起来后有一个异常解决一个异常,直到跑出结果为止,测试中发现以下问题:没有jackson模块:CDH版本没带jackson的相关包,去maven官网下载(三个都要下载),放到
{HADOOP_HOME}/share/hadoop/common/lib
下,至于为什么放在这儿而不是spark lib,这是因为我们在前面配置了SPARK_DIST_CLASSPATH
(看不明白就在shell中echo一下),它会加入到spark类路径下,这个路径就包含上面的{HADOOP_HOME}/share/hadoop/common/lib
,而且它下面还有jackson的其他包,顺理成章就放这儿了。jackson版本问题:Jackson内部抛异常,上网查发现是版本问题,于是按热心网友推荐采用2.4.4的版本,问题解决!
无限ACCEPT:spark-env.sh中
SPARK_MASTER_IP
和SPARK_MASTER_HOST
需要配置为自己机器的hostname或者localhost。如果机器内存较小,导致分配资源缓慢,可适当调整一下
${HADOOP_HOME}/etc/hadoop/capacity-scheduler.xml
中的yarn.scheduler.capacity.maximum-am-resource-percent
,可以由0.1调整为0.5,它表示yarn所管理的资源中,最多可以有多少资源可以用来运行application master,即控制当前激活状态的应用,默认是10%,可适当调大比例。
终极测试: