以下内容来源于DT大数据梦工厂:


1、数据本地性

2、RDD自定义

一、性能优化之数据本地性

数据本地性是对分布式系统是一件 最为重要的事情(之一),程序包含代码和数据2部分,单机版本一般情况下很少数据本地性的问题(因为数据在本地)。

但是由于数据本地有PROCESS_LOCAL和NODE_LOCAL之分。所以我们还是尽量的让数据处于PROCESS_LOCAL。例如PHP 现在都有一个数据缓存层。

在Spark 中数据本地性分为PROCESS_LOCAL、NODE_LOCAL、NO_PREF、RACK_LOCAL(数据可能在任何地方,包括网络环境中,例如说百度云,数据

和计算集群不再同样的集群中,此时就是ANY的一种表现)

2、对于ANY的状态下,默认情况下性能会非常低,此时强烈建议使用Tachyon;例如百度在云盘上,为了确保计算速度,就在集群之间加入了Tachyon,通过Tachyon

来从远处抓取数据,而Spark基于Tachyon来进行计算,这样就更好的满足了数据本地性。

3、如果数据是PROCESS_LOCAL,但是此时并没有空闲的Core来运行我们的Task, 此时Task就要等待,例如等待3000ms,3000ms内如果数据本地下就要

退而求其次采用NODE_LOCAL.。同样的道理NODE_LOCAL也会有等待的超时时间,以此类推。

4、如何设置Locality呢?可以统一采用Spark.locality.wait来设置(例如设置5000ms),当然可以分别设置spark.locality.wait.process、

spark.locality.wait.node、spark.locality.wait.rack等。一般设置是Locality优先级越高则可以设置越高的等待超时时间。(process需要多等一会10s, node5s,process是进程级别,node 本地数据没有就没有等待也是没有意义)

二、RDD的自定义(以Spark on HBase 为例) 主要针对外部数据源

1、第一步是定义RDD.getPartitions的实现

a) createRelation具体确定HBase的链接方式和具体访问的表

b)让通过HBase的API来获得Region的List

c)可以过滤出有效的数据

d)最后返回Region的Array[Partition]也就是说一个Partition处理一个Region的数据,为更加的数据本地下打下基础

2、第二步是RDD.getPreferreLocaltion

a)  根据Split包含的Region信息来确定Region具体在什么节点上,这样Task在调度的时候就可以优先被调度到Region所在的机器上,zuida程度

的提高数据本地性

3、第三步RDD.compute

a)  根据Split中的Region等信息调用HBase 的PAI来进行操作(主要查询)


作业:

从网络查询RDD封装访问Mysql 的具体实现

spark 访问HBase实现 (华为)github.com/HuaweiBigData/astro