日志文件是如何传到数据库的

本文介绍如何使用Spark Streaming将实时数据流处理结果存储到MySQL数据库中,通过调整RDD分区数来优化数据库写入效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    def dbfunc(records):
        db = pymysql.connect("localhost","root","root","spark")
        cursor = db.cursor()
 
        def doinsert(p):
            sql = "insert into wordcount(word,count) values ('%s', '%s')" % (str(p[0]), str(p[1]))
            try:
                cursor.execute(sql)                
                db.commit()
            except:                    
                db.rollback()
 
        for item in records:
            doinsert(item)
 
    def func(rdd):
        repartitionedRDD = rdd.repartition(3)
        repartitionedRDD.foreachPartition(dbfunc)
 
    running_counts.foreachRDD(func)

running_counts :看作日志文件

函数之间的依次调用: 对每一个元素,用func 进行处理,func处理过程中,对每一个RDD再调用dbfunc进行处理,将其保存到mysql数据库

也就是说,这里定义了一个内部函数dbfunc,它的功能是,接收records,然后把records保存到MySQL中。到这里,你可能会有疑问?为什么不是把stateDstream中的每个RDD直接拿去保存到MySQL中,还要调用rdd.repartition(3)对这些RDD重新设置分区数为3呢?这是因为,每次保存RDD到MySQL中,都需要启动数据库连接,如果RDD分区数量太大,那么就会带来多次数据库连接开销,为了减少开销,就有必要把RDD的分区数量控制在较小的范围内,所以,这里就把RDD的分区数量重新设置为3。然后,对于每个RDD分区,就调用repartitionedRDD.foreachPartition(dbfunc),把每个分区的数据通过dbfunc保存到MySQL中,这时,传递给dbfunc的输入参数就是Iterator[(String,Int)]类型的records。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值