1、partitionBy( ) 优化
有一张用户表 是 [UserID、UserAPP] 表一
还有一张表是每天都生成的表[UserId、UserDownloadAPP] 表二
表一和表二的 key值相同。 两张表需要进行不断的join,实时更新这张表1的数据。
不使用partition 时:
val sc = new SparkContext(...)
val userData = sc.sequenceFile[UserID,UserAPP]("hdfs://...").persist()
//周期性进行join
def processNewLogs(logFileName:String){
val events = sc.quenceFile[UserId、UserDownloadAPP](logFileName)
val joined = userData.join(events)
val offTopocVisits = joined.filter{
case (userId,(UserId、UserDownloadAPP)) => !userInfo.topics.cotains(linkInfo.topic)
}.count
}
每次调用该函数时,都会进行网络传输跨节点混洗,进行hash分区。可以提前进行hash分区,将指标持久化。这样可以
可以使得userData 不在进行混洗,分区。
注:必须要持久化!否则瞎折腾!!!
val sc = new SparkContext(...)
val userData = sc.sequenceFile[UserID,UserAPP]("hdfs://...")
.partitionBy(new HashPartitioner(100))
.persist()
在python中,直接传入分区数量即可(rdd.partitionBy(100))
spark 和数据库的连接器
mysql的 JDBC
Cassandra
Hbase
Elasticsearch