本地化级别
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
![](https://img.haomeiwen.com/i11092177/8da49c6850b98de8.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,这块不知道它内部是怎么设置的。请看下图
![](https://img.haomeiwen.com/i11092177/df16b16317d5df81.png)
再看hadoop的图
![](https://img.haomeiwen.com/i11092177/cece58b97b58d9fb.png)
此种情况之下,spark本地化失效。看下图运行级别。全部是any
![](https://img.haomeiwen.com/i11092177/74b6138860b7bd72.png)
跑完这条sql语句需要2.6*10=26min之久。
![](https://img.haomeiwen.com/i11092177/fcbd3dfcb9921dc4.png)
以上是一种效果。
现在先启动master,sbin/start-master.sh
然后手动启动worker,指定worker的名字与master
/home/dmp/spark/sbin/start-slave.sh -h dmp3 spark://dmp8:7077
此时页面worker情况
![](https://img.haomeiwen.com/i11092177/e6e9e99fbbd43d5f.png)
然后进行sql语句查询
select count(*) from tablename where time=20170211;
此时页面的运行级别
![](https://img.haomeiwen.com/i11092177/98e18bd469c22d7d.png)
此种情况下查询时间为:
![](https://img.haomeiwen.com/i11092177/865fa2f6dd84b2b6.png)
速度提高10倍。对比原来的26分钟。
这就是spark 运行级别的奥妙。
网友评论