#spark on yarn 和SparkjobHistory配置和常见erro
感谢开源和各位前辈对知识的无私奉献
希望我的这篇文章,能对您有所帮助
软件版本信息:
Vmware16,Centos7,hadoop2.7.2,jdk1.8,scala-2.11.8,spark2.0.1
如果有需要的软件在下面链接里,很抱歉,centos的镜像因为太大没有办法上传到网盘里,需要劳烦您自己找一下资源
物理机配置:
10代i5,24G内存,1000g固态
虚拟机配置
5G内存,50G硬盘
Vmware:
链接:https://pan.baidu.com/s/17RlsO9ZGg1zQCHAFjmSFTg
提取码:w4a4
jdk,hadoop,spark,scala,我都压缩过后放到了一个文zip后缀的压缩文件
里
链接:https://pan.baidu.com/s/1w7TRWfBZ0GF3JodwHLwSlw
提取码:r9fn
我的建议是先在windows下解压缩,然后通过xftp或者winscp这一类的工具上传到您的虚拟机上。好的话不多说,让我们开始
您需要一个安装了scala,jdk的hadoop集群
我的建议是,将scala和jdk都安装到集群的虚拟机上,hadoop安装成完全分布式,如果不会的考虑可以去找一下对应的文章。
首先解压缩文件夹
注意:!!!一定要写对您的配置文件,单词不要写错,不要写错,不要写错,主在不在乎我不知道,但这对您来说真的会很重要
tar -zxvf spark-2.0.1-bin-hadoop2.7.tgz -C /您希望安装到的路径 # 我的是路径/opt/module # 随后我们给文件取一个好记得名字 mv spark-2.0.1-bin-hadoop2.7 /opt/module/spark-yarn
接下来我们配置对应的环境变量
sudo vim /etc/profile.d/my_env.sh 或者 sudo vim /etc/profile
内容参考这一部分,其中HADOOP_CONF_DIR您可以试一下不写,至于报不报错,由您的电脑说了算
随后source一下
如果是第一种方式编写的环境变量
source /etc/profile/即可
第二种方式:
source /etc/profile.d/my_env.sh
两种方式配置环境变量的区别是
通过第一种是所有在加载环境时您配置的环境变量对所有用户均有效
通过第二种方式配置的环境变量仅对当前用户有效
请您切换到您安装的spark的conf目录下下修改对应文件
cd $SPARK_HOME/conf # 给文件改个名 mv ./spark-env.sh.example ./spark-env.sh # 修改文件 vim ./spark-env.sh # 按下i输入以下内容,等号后面的内容请分别切换为您的jdk安装目录 export JAVA_HOME=/opt/module/jdk1.8.0_144 # 这里的等号后面的内容请切换为您的hadoop安装目录下的etc下的hadoop目录 YARN_CONF_DIR=/opt/module/hadoop-2.7.2/etc/hadoop
接着我们做spark on yarn的最后一项配置
改一下yarn的配置文件,因为我们是虚拟机,内存可能不大够,执行job时极有可能erro
我们可以通过修改yarn的配置文件来解决这个问题:目前有两种改法我推荐的是第二种
第一种方式:vim $HADOOP_HOME/etc/hadoop/yarn-site.xml
yarn.nodemanager.pmem-check-enabled false yarn.nodemanager.vmem-check-enabled false
第二种方式:vim $HAOOP_HOME/etc/hadoop/yarn-site.xml
yarn.scheduler.maximum-allocation-mb 2000 yarn.scheduler.minimum-allocation-mb 1000 yarn.nodemanager.vmem-pmem-ratio 4.1
到这里,最基本的spark on yarn配置就已经完成了
我们做一个小测试
执行一个job看看效果,就算一下π的value如何?
./bin/spark-submit # 官方给的脚本路径,不能省略,省略100%报错 --class org.apache.spark.examples.SparkPi # 类的路径,您敢省略我就敢erro --master yarn # 指定程序运行在yarn上 --driver-memory 600m # 指定Driver端的内存为600MB --executor-memory 600m # 指定一个executor的内存为600MB --deploy-mode cluster $SPARK_HOME/examples/jars/spark-examples_2.11-2.0.1.jar # jar包路径 10
出现SUCESSED说明job执行成功,注意:这里是不会直接输出计算出π的值的,如果出现您的情人error1号
stack trace:。。。。
或者2号
java.io.IOException: Failed to send RPC。。。。。
这两种类型的错误,有极大可能是您的内存方面的问题,按照上述的yarn配置的第二种方式修改一下有极大可能能解决。
首先您需要配置一下hadoop的jobhistory(日志聚集功能)并开启对应服务
vim $HADOOP/etc/hadoop/yarn-site.xmlyarn.log-aggregation-enable true yarn.log-aggregation.retain-seconds 604800 # 随后报存退出 vim $HADOOP/etc/hadoop/mapred-site.xml yarn.log.server.url http://hadoop112:19888/jobhistory/logs mapreduce.jobhistory.address hadoop112:10020 # 保存退出 mapreduce.jobhistory.webapp.address hadoop112:19888
接下来我们修改一部分配置文件,注意:你的hdfs下/spark目录一定要存在
# 不管存不存在我们都创建一下试试呗,反正不会报一堆error hadoop fs -mkdir /spark vim $SPARK_HOME/conf/spark-env.sh # 输入如下内容 SPARK_HISTORY_DIR=" -Dspark.history.ui=18080 -Dspark.history.fs.logDirector=hdfs://你的NameNode所在主机名:9000/spark -Dspark.history.retainedApplication=30"
然后我们重命名一下文件
mv $SPRK_HOME/conf/spark-default.conf.example $SPARK_HOME/conf/spark-default.conf vim $SPARK_HOME/conf/spark-default.conf # 修改掉文件中原本注释的,如果没有的就添加 # 如果我想偷懒咋办?直接输呗 # 注意:!!!,如果您不想和一堆亲爱的erro面对面的话,请您一定要把我的 # hadoop112:9000改成您的NameNodes所在主机名和对应的core-site.xml里写 # 的那个端口号 spark.eventLog.enabled true spark.eventLog.dir hdfs://hadoop112:9000/spark spark.yarn.historyServer.address=hadoop112:18080 spark.history.ui.port=18080
最后保存退出
现在基本就完成了
让我们一起在$HADOOP_HOME中分别重启hdfs,yarn,jobhistory, 在spark中开启,history,如果这里没有遇见程序员的情人erro,说明您基本成功了
相应命令
# NameNode节点开启hdfs $HADOOP_HOME/sbin/start-dfs.sh # yarn节点 开启yarn $HADOOP_HOME/sbib/start-yarn.sh # NameNode 节点 开启日志聚集 $HADOOP_HOME/sbin/mr-jobhistory-daemon.sh start historyserver $SPARK_HOME/sbin/start-history-server.sh
最后,我们再跑一个一把spark作为client的job,如果没遇到您的情人error就欧可以看到您亲爱的不是3.1415926的π了
./bin/spark-submit --class org.apache.spark.examples.SparkPi --master yarn --driver-memory 600m --executor-memory 600m --deploy-mode client $SPARK_HOME/examples/jars/spark-examples_2.11-2.0.1.jar 10
最后,创作不易,希望各位能提供一些建议,供在下参考写出更好更,适合各位的博文。有问题也欢迎留言,看到了会如果是我能力范围内的问题,会回复的。
也希望各位能驯服erro这个凶猛的对象。



