spark 环境搭建及几种模式测试
spark安装部署spark安装前的环境准备
需要安装jdk、scala、hadoop作为前提环境。
1、安装jdk1.7
先卸载自带的jdk,防止自带的jdk和安装的出现冲突。而且自带的版本较低不能满足现在软件对jdk的要求。
使用如下命令:
rpm –qa | grep java 用来查询有多少几个版本的java,我的电脑为例表示装了两个java
需要卸载1.7的jdk,1.6系统使用,不允许卸载
rpm -e java-1.7.0。45-2.4.3.3.el6.x86_64
安装jdk1.7
在用户的环境变量中添加jdk目录即可
使用如下命令vi ~/.bash_profile
本地图片,请重新上传
添加如下信息
export JAVA_HOME=/usr/jdk1.7.0_25
export PATH= JAVA_HOME/bin:$PATH
使配置文件生效source ~/.bash_profile
使用java -version检查jdk的版本号是否和自己安装的一致
本地图片,请重新上传
2、安装scala
在用户下的环境变量中添加scala的目录即可
export SCALA_HOME=/usr/scala-2.10.4
export PATH= JAVA_HOME/bin: SCALA_HOME/bin
本地图片,请重新上传
4 安装hadoop2.6
1、添加java主目录位置,hadoop的底层是使用java开发,所以hadoop框架和程序的运行需要能够找到java的环境。在hadoop的如下三个文件配置即可。
vi hadoop-env.sh
先把之前的java的环境变量去掉,重新写自己安装的jdk
export JAVA_HOME=/usr/jdk1.7.0_25/
本地图片,请重新上传
vi mapred-env.sh,直接修改把原来等号之后的去掉,填上自己的环境变量
export JAVA_HOME=/usr/jdk1.7.0_25/
本地图片,请重新上传
vi yarn-env.sh 修改yarn的java的环境变量
export JAVA_HOME=/usr/jdk1.7.0_25/
本地图片,请重新上传
同时添加hadoop的环境变量到linux的用户的环境变量中,但是hadoop和其他不同需要配置bin和sbin目录
export JAVA_HOME=/usr/jdk1.7.0_25
export HADOOP_HOME=/usr/hadoop-2.6.0
export SCALA_HOME=/usr/scala-2.10.4
export PATH= JAVA_HOME/bin: SCALA_HOME/bin: HADOOP_HOME/sbin
本地图片,请重新上传
配置hadoop的core-site.xml文件
vi /usr/hadoop-2.6.0/etc/hadoop/core-site.xml
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/hadoop-2.6.0/data/tmp</value>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
3,配置hadoop的hdfs-site.xml文件
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
4,配置hadoop的mapred-site.xml文件
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
5,配置hadoop的yarn-site.xml文件
<property>
<name>yarn.resourcemanager.hostname</name>
<value>dandu</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
6,配置hadoop的slaves配置
vi /usr/hadoop-2.6.0/etc/hadoop/slaves
dandu//主机名:nodemanager和datanode地址
Hadoop的单机模式配置完成。下面就可以格式化并且开启hadoop了。
7,格式化namenode
bin/hdfs namenode -format
本地图片,请重新上传
8、开启hadoop集群
已经配置了环境变量直接使用start-all.sh命令即可,在开启的过程中需要多次的输入密码,因为没有做SSH互信机制。确定全部进程开启完毕后,使用命令JPS查看,出现6个进程,如图:
本地图片,请重新上传
可以使用hadoop fs -mkdir ….创建文件夹。并且使用hadoop fs -ls /查看
本地图片,请重新上传
3,spark几种模式的安装部署
1 spark本地模式的安装
最简单的模式,不需要安装spark即可使用,但是是单机模式,只能作为测试或者学习临时使用。
1,直接运行
bin/spark-shell
本地图片,请重新上传
2、spark的webAPP端查看,直接打开网页,输入开启的spark的主机名加默认端口号4040即可
本地图片,请重新上传
3,在linux中新建文件me.txt,编写内容,使用spark来加载文件
val test = sc.textFile(“README.md”)
本地图片,请重新上传
表示已经加载成功
4、使用count,进行单词
test.count()
本地图片,请重新上传
res1: Long=1表示文件只有一行内容。
5,使用first来读取文件的第一行内容。
test.first()
本地图片,请重新上传
6,使用filter过滤文件的内容。
val lines = test.filter(line => line.contains(“ag”))
本地图片,请重新上传
已经统计完成但是没有输出结果。可以进行统计一下总共有多少
本地图片,请重新上传
也可以把两次内容写在一起test.filter(line => line.contains(“ag”)).count()
本地图片,请重新上传
相对复杂计算,如下表示首先把加载的文件使用map算子,在算子内使用匿名函数把数据按照空格切分,在使用size求出分割后的单词字母数量。Map的内容做完后交给reduce算子,在reduce内使用匿名函数进行判断大小,最终结果得到文章内的单词最大值
test.map(line => line.split(” “).size).reduce((a, b) => if (a > b) a else b)
本地图片,请重新上传
继续使用Math的运算,如下表示:首先导入java的Math包,把数据首先给map处理,map内使用匿名函数,把数据按照空格进行分割,并使用size统计字母数,map处理完后给reduce,reduce内有一个匿名函数,匿名函数使用了Math的max来求最大最小值。
import java.lang.Math
test.map(line => line.split(” “).size).reduce((a, b) => Math.max(a, b))
本地图片,请重新上传
继续做hadoop的wordcount,hadoop使用了六十行左右的代码,完成了一个单词统计,在spark里大大超出了我们的想象,只需要一行代码即可完成。
如下表示:定义一个常量wordCounts,把加载的test交给flatMap处理,flatMap内有一个匿名函数,匿名函数内表示把test的内容按照空格进行分割,所有处理好后交给map处理,map内有一个匿名函数,匿名函数表示把妹一个单词都变成单词和1的形式,然后交给reduceByKey(按照key进行统计),内有一个匿名函数,匿名函数表示进来的所有的数进行累加。
val wordCounts = test.flatMap(line => line.split(” “)).map(word => (word, 1)).reduceByKey((a, b) => a + b)
本地图片,请重新上传
已经计算完成,但是没有输出结果,需要如下算子进行输出。
wordCounts.collect()
本地图片,请重新上传
2 spark standalone模式的安装
本地图片,请重新上传
1,配置spark-env.sh
HADOOP_CONF_DIR=/usr/hadoop-2.6.0/etc/hadoop
JAVA_HOME=/usr/jdk1.7.0_25/
SCALA_HOME=/usr/scala-2.10.4/
SPARK_MASTER_IP=dandu
SPARK_MASTER_PORT=7077
SPARK_MASTER_WEBUI_PORT=8080
SPARK_WORKER_CORES=1
SPARK_WORKER_MEMORY=1500m
SPARK_WORKER_PORT=7078
SPARK_WORKER_WEBUI_PORT=8081
SPARK_WORKER_INSTANCES=1
2,配置spark-defaults.conf
spark.master spark://dandu:7077
3,配置slaves
dandu
4,使用如下命令启动spark,启动完成后使用jps查看进程,可以看到多了两个进程Master和Worker
sbin/start-master.sh
sbin/start-slaves.sh
本地图片,请重新上传
使用 bin/spark-shell –master spark://dandu:7077开启shell窗口,或者# bin/spark-shell –master local
本地图片,请重新上传
5,命令测试
使用如下命令测试,计算PI的值
/bin/spark-submit –class org.apache.spark.examples.SparkPi –master local examples/jars/spark-examples_2.11-2.1.2.jar
经过运算得到如下结果
本地图片,请重新上传
val wordcount = sc.textFile(“file:///testSpark/me.txt”).flatMap(x=>x.split(” “)).map(x=>(x,1)).reduceByKey((a,b)=>a+b).collect()
本地图片,请重新上传
如下命令皆可使用集群测试。
val word1 = textFile.flatMap(x=>x.split(” “)).map(x=>(x,1)).reduceByKey((a,b)=>a+b).sortByKey(true).collect()
val word2 = textFile.flatMap(x=>x.split(” “)).map(x=>(x,1)).reduceByKey((a,b)=>a+b).map(x=>(x._2,x._1)).sortByKey(false).collect()
sc.textFile(“hdfs://spark.learn.com:8020/user/cyhp/spark/wc.input”).flatMap(.split(” “)).map((,1)).reduceByKey(_ + _).collect
注意:遇到如下问题的解决方式
本地图片,请重新上传
1、集群的主机名和/etc/hosts能够对应
2、确保防火墙关闭
确保有足够大的内存,如果内存不够,spark-env.sh的配置项SPARK_WORKER_MEMORY=1500m就不能够满足executor执行的使用。
在集群运行的时候可以登录网页查看执行的详细情况
此时http://dandu:8080/可以登录web浏览器访问,如下:
本地图片,请重新上传
5.7 spark-shell运行在YARN上
HADOOP_CONF_DIR=/usr/hadoop-2.6.0/etc/hadoop/
export SPARK_EXECUTOR_MEMORY=1024M
export YARN_CONF_DIR=/usr/hadoop-2.6.0/etc/hadoop
JAVA_HOME=/usr/jdk1.7.0_25/
SCALA_HOME=/usr/scala-2.10.4/
SPARK_MASTER_IP=dandu
SPARK_MASTER_PORT=7077
SPARK_MASTER_WEBUI_PORT=8080
SPARK_WORKER_CORES=1
SPARK_WORKER_MEMORY=1500m
SPARK_WORKER_PORT=7078
SPARK_WORKER_WEBUI_PORT=8081
SPARK_WORKER_INSTANCES=1
(1)运行在yarn-client上
执行命令spark-shell –master yarn –deploy-mode client,稍等片刻即可看到如下输出。
[root@node1 ~]# spark-shell –master yarn –deploy-mode client
本地图片,请重新上传
说明:从上面的spark-shell日志中看到spark-shell –master yarn-client命令从Spark2.0开始废弃了,换成spark-shell –master yarn –deploy-mode client。
(2)虽然已经开启但是明显存在问题
由于是在虚拟机上运行,虚拟内存可能超过了设定的数值。在执行命令spark-shell –master yarn-client时可能报错,异常信息如下。
本地图片,请重新上传
以上为开启过程中产生的问题
解决办法1:
先停止YARN服务,然后修改yarn-site.xml,增加如下内容
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
<property>
<name>yarn.nodemanager.vmem-pmem-ratio</name>
<value>4</value>
将新的yarn-site.xml文件分发到其他Hadoop节点对应的目录下,最后在重新启动YARN。
再执行spark-shell –master yarn-client命令时,就不会报上面异常了。
解决办法2:
如果以上办法没有解决该问题,那么增大spark-env.sh的executor和worker的内存
下图为内存分别增大后的效果,没有出现任何警告或者异常,问题的原因是这是JVM申请的memory不够导致无法启动SparkContext,
想要了解更多请加QQ:773640911