hi,你好!欢迎访问本站!登录
本站由简数采集腾讯云宝塔系统阿里云强势驱动
当前位置:首页 - 文章 - 后端开发 - 正文 看Cosplay古风插画小姐姐,合集图集打包下载:炫龙网 · 炫龙图库

golang 怎样处置惩罚大数据_后端开发

2019-12-28后端开发ki4网15°c
A+ A-

Golang被证实非常合适并发编程,goroutine比异步编程更易读、文雅、高效。本文提出一个合适由Golang完成的Pipeline实行模子,合适批量处置惩罚大批数据(ETL)的情形。

设想如许的运用情形: (引荐进修:go)

从数据库A(Cassandra)加载用户批评(量庞大,比方10亿条);依据每条批评的用户ID、从数据库B(MySQL)关联用户材料;挪用NLP效劳(自然语言处置惩罚),处置惩罚每条批评;将处置惩罚结果写入数据库C(ElasticSearch)。

因为运用中碰到的种种问题,归结出这些需求:
需求一:应分批处置惩罚数据,比方划定每批100条。出现问题时(比方恣意一个数据库毛病)则中断,下次程序启动时运用checkpoint从中断处恢复。
需求二:每一个流程设置合理的并发数、让数据库和NLP效劳有合理的负载(不影响别的营业的基础上,尽量占用更多资本以进步ETL机能)。比方,步骤(1)-(4)离别设置并发数1、4、8、2。

这就是一个典范的Pipeline(流水线)实行模子。把每一批数据(比方100条)看做流水线上的产物,4个步骤对应流水线上4个处置惩罚工序,每一个工序处置惩罚完毕后就把半成品交给下一个工序。每一个工序能够同时处置惩罚的产物数各不相同。

你大概起首想到启用1+4+8+2个goroutine,运用channel来通报数据。我也曾这么干,结论就是这么干会让程序员疯掉:流程并发掌握代码非常复杂,特别是你得处置惩罚非常、实行时间超越预期、可控中断等问题,你不能不到场一堆channel,直到你本身都不记得有什么用。

重用的Pipeline模块

为了更高效完成ETL事情,我将Pipeline笼统成模块。我先把代码粘贴出来,再剖析寄义。模块能够直接运用,重要运用的接口是:NewPipeline、Async、Wait。

运用这个Pipeline组件,我们的ETL程序将会简朴、高效、牢靠,让程序员从烦琐的并发流程掌握中解放出来:

package main
 
import "log"
 
func main() {
    //恢复上次实行的checkpoint,如果是第一次实行就猎取一个初始值。
    checkpoint := loadCheckpoint()
    
    //工序(1)在pipeline外实行,末了一个工序是保留checkpoint
    pipeline := NewPipeline(4, 8, 2, 1) 
    for {
        //(1)
        //加载100条数据,并修正变量checkpoint
        //data是数组,每一个元素是一条批评,以后的联表、NLP都直接修正data里的每条纪录。
        data, err := extractReviewsFromA(&checkpoint, 100) 
        if err != nil {
            log.Print(err)
            break
        }
        
        //这里有个Golang有名的坑。
        //“checkpoint”是轮回体外的变量,它在内存中只要一个实例并在轮回中不停被修正,所以不能在异步中运用它。
        //这里建立一个副本curCheckpoint,贮存本次轮回的checkpoint。
        curCheckpoint := checkpoint
        
        ok := pipeline.Async(func() error {
            //(2)
            return joinUserFromB(data)
        }, func() error {
            //(3)
            return nlp(data)
        }, func() error {
            //(4)
            return loadDataToC(data)
        }, func() error {
            //(5)保留checkpoint
            log.Print("done:", curCheckpoint)
            return saveCheckpoint(curCheckpoint)
        })
        if !ok { break }
        
        if len(data) < 100 { break } //处置惩罚完毕
    }
    err := pipeline.Wait()
    if err != nil { log.Print(err) }
}

以上就是golang 怎样处置惩罚大数据的细致内容,更多请关注ki4网别的相干文章!

  选择打赏方式
微信赞助

打赏

QQ钱包

打赏

支付宝赞助

打赏

  选择分享方式
  移步手机端
golang 怎样处置惩罚大数据_后端开发

1、打开你手机的二维码扫描APP
2、扫描左则的二维码
3、点击扫描获得的网址
4、可以在手机端阅读此文章
标签:

发表评论

选填

必填

必填

选填

请拖动滑块解锁
>>