spark运行级别问题详解

本地化级别

PROCESS_LOCAL
进程本地化,代码和数据在同一个进程中,也就是在同一个executor中;计算数据的task由executor执行,数据在executor的BlockManager中;性能最好

NODE_LOCAL

节点本地化,代码和数据在同一个节点中;比如说,数据作为一个HDFS block块,就在节点上,而task在节点上某个executor中运行;或者是,数据和task在一个节点上的不同executor中;数据需要在进程间进行传输

NO_PREF

对于task来说,数据从哪里获取都一样,没有好坏之分

RACK_LOCAL

机架本地化,数据和task在一个机架的两个节点上;数据需要通过网络在节点之间进行传输

ANY

数据和task可能在集群中的任何地方,而且不在一个机架中,性能最差。

我们多数优化最高做到NODE_LOCAL级别。为了达到这一级别,走以下步骤。

1,判断hdfs本地化是否生效

使用命令hadoop checknative -a


1.png

如上图1.png所示,已经正确载入本地化

2,spark配置

在spark-env.sh文件里配置变量
export LD_LIBRARY_PATH=/home/dmp/hadoop/lib/native/:$LD_LIBRARY_PATH
在spark-default.conf里配置
spark.locality.wait 10
是对于运行级别检查的时间设置,单位是秒

3,启动spark,查看日志

Unable to load native-hadoop library for your platform
或者可以使用spark-shell脚本来查看配置项的问题
也是看此日志是否出现。

4,使用beeline进行测试

beeline -u jdbc:hive2://host:10000 -n root
select count(*) from tablename where time=20170211;
查看页面spark运行级别。

问题发现与解决方式(spark 对于hostname与ip解析有区别)

使用spark sbin下面的脚本start-all.sh启动之后,页面显示的master是hostname,但是对于worker来说,显示的却是ip,其实它应该像hadoop一样,去显示hostname,这块不知道它内部是怎么设置的。请看下图


2.png

再看hadoop的图


3.png

此种情况之下,spark本地化失效。看下图运行级别。全部是any


4.png

跑完这条sql语句需要2.6*10=26min之久。


55.png

以上是一种效果。
现在先启动master,sbin/start-master.sh
然后手动启动worker,指定worker的名字与master
/home/dmp/spark/sbin/start-slave.sh -h dmp3 spark://dmp8:7077
此时页面worker情况


5.png

然后进行sql语句查询
select count(*) from tablename where time=20170211;
此时页面的运行级别


6.png

此种情况下查询时间为:


7.png

速度提高10倍。对比原来的26分钟。
这就是spark 运行级别的奥妙。

你可能感兴趣的:(spark运行级别问题详解)