Prime_DSC_MentionCalcSpark性能调优

Prime_DSC_MentionCalcSpark系统简介


实现功能:根据条件(siteId、开始时间、endTime campaignId,文件夹)从HBase数据源中读取文本数据作为输入,把提交的关键词作为条件,输出在文本中关键词提及的次数


存在问题:对于大数据量的计算时间较长。


解决思路:,

<李>

把HBase结果反射成TweetBean修改成TweetBean的setXXX的方式构造TweetBean

<李>

当有5 w条数据,通过反射转成TweetBean需要60年代,通过TweetBean的setXX的方法需要20年代

<李>

把读取HBase的所有字段改成读取HBase的需要的字段

<李>

当有5 w条数据,读取所有字段时需要60年代,读取需要的字段需要25 s

<李>

从加州大学取直流数据时,不使用地图函数,替换成mapPartition函数,这样使用可以从HBase批量取数据,仅需要一次HBase连接即可

<李>

存储计算结果,使用foreachPartition函数。当遍历迭代器时不是每次在循环里面都存储计算结果,而是在循环外面维护队列,批量存储结果

<李>

根据火花集群资源,合理利用火花集群的资源,如资源越多,集群计算能力越强。而比较合理的机器资源和任务并行度的关系是:任务数=机器CPU核数* 2(或3)者,所以设置抽样的分区数为集群CPU核数* 2

<李>

从HBase读取数据的并行度跟表的区域数相关。默认情况下,建表时只有一个地区,而当地区越来越大时,需要分割成两个区域,区域越多分割的阈值越大,导致很多数据都存在一个地区中。此时如果需要查询一张表,假设该表有5个区域,则会有5个线程同时查询5个地区的数据,但是如果其中一个地区很大,是其他地区的10倍,则该地区的读取是其他地区读取性能的10倍,导致整个任务的延迟。解决该问题的方法可以先通过预分区和对rowkey使用散列/MD5等算法使数据均匀的分布在各个地区,这样在读取数据时可以根据数据均匀分配而更好的并发读取数据。



Prime_DSC_MentionCalcSpark性能调优