【原】Spark数据本地性
2016-01-11 19:57
232 查看
Spark数据本地性
分布式计算系统的精粹在于移动计算而非移动数据,但是在实际的计算过程中,总存在着移动数据的情况,除非是在集群的所有节点上都保存数据的副本。移动数据,将数据从一个节点移动到另一个节点进行计算,不但消耗了网络IO,也消耗了磁盘IO,降低了整个计算的效率。为了提高数据的本地性,除了优化算法(也就是修改spark内存,难度有点高),就是合理设置数据的副本。设置数据的副本,这需要通过配置参数并长期观察运行状态才能获取的一个经验值。Spark中的数据本地性有三种:
PROCESS_LOCAL是指读取缓存在本地节点的数据
NODE_LOCAL是指读取本地节点硬盘数据
ANY是指读取非本地节点数据
通常读取数据PROCESS_LOCAL>NODE_LOCAL>ANY,尽量使数据以PROCESS_LOCAL或NODE_LOCAL方式读取。其中PROCESS_LOCAL还和cache有关,如果RDD经常用的话将该RDD cache到内存中,注意,由于cache是lazy的,所以必须通过一个action的触发,才能真正的将该RDD cache到内存中。
最近在做一个文本匹配的实验,发现处理的数据Locality Level都是ANY级别的,从而导致数据在网络上传输,造成效率低下,后来发现:
Spark中 Worker Id和Address中都使用的IP地址作为Worker的标识,而HDFS集群中一般都以hostname作为slave的标识,这样,Spark从 HDFS中获取文件的保存位置对应的是hostname,而Spark自己的Worker标识为IP地址,两者不同,因此没有将任务的Locality Level标记为NODE_LOCAL,而是ANY。
解决方法:在Standalone模式下,单独启动各个Worker节点,命令如下所示:
$SPARK_HOME/sbin/start-slave.sh -h <hostname> <masterURI>
例如:start-slave.sh -h slave1 spark://master1:7077
假设我在slave1上启动Worker节点,master1是主节点
hostname是Worker所在的hostname即slave1,启动masterURL是”spark://master1:7070”
相关文章推荐
- 【OpenSource】源码--Web Bench 1.5
- codeforces 615C Running Track
- iOS动画之iOS UIBezierPath类 介绍
- 重拾编程之路--数据结构--中缀表示法转换成后缀表示法
- JS自动识别浏览器
- 总结:Ubuntu上安装JDK和Eclipse
- 虚拟机VMware3种网络模式(桥接、nat、Host-only)的工作原理
- UI组件之TextView及其子类(三)ToggleButton和Switch
- 【原】Arrays.binarySearch() 的用法
- 《天天酷跑》游戏后台结构体标准化探 转
- 天线的主要性能参数
- Exercise1.1.29 等值键
- 欢迎使用CSDN-markdown编辑器
- Linux下Makefile文件详解
- 百度GPSutil
- 10.安装zabbix agent
- 关于程序猿的思考问题
- Leetcode——Contains Duplicate
- 屏幕扩展
- PHP的N个Tip