现有的结构是Spark从HBase中提取数据,进行计算操作。
Spark的并发是由:
可用CPU核数*Worker数量,来确定上限的,这种情况针对于单节点。
并发数还受到RDD的分区数量影响的,说回Hbase的话,就是受到Region数影响,基本与其一致;
所以如果在HbaseConf中确定的Region数量只有1个的话,那么会出现Spark单线程执行的情况;
这个时候可以考虑使用coalesce方法来进行分区动作,但是这个方法需要注意的是,如果当前的分区数小于你期望的分区,单纯的使用coalesce加分区数的方法并没有什么用,需要强制进行shuffle动作。
即coalesce(numPart,true)
此方式可有效进行分区动作,但是意味着大量的shuffle动作;
其实我理解可以Spark生成任务时,在外部进行任务拆分,例如按天,或者按年等;相较于在内部进行分区动作,可能不会出现shuffle的情况。
但是,如果你单个节点的并发数并不是很高的情况下,那么任务被派发到其它节点执行,而数据还是需要从另外节点来获取,其实跟shuffle的动作相差并不是太大,这个可以自行考虑;
分区的数量可以设定为集群任务的最高值。
以上仅为个人浅见,欢迎大家讨论。