spark超大数据批量写入redis

利用spark的分布式优势,一次性批量将7000多万的数据写入到redis中。

python 复制代码
# 配置spark接口
import os
import findspark
from pyspark import SparkConf
from pyspark.sql import SparkSession
os.environ["JAVA_HOME"] = "/usr/local/jdk1.8.0_192"
findspark.init("/usr/local/hadoop/spark-2.4.4-bin-hadoop2.6/")
# 设置配置信息
conf = SparkConf()
conf.set("spark.driver.memory", "16g")
conf.set("spark.executor.memory", "16g")
conf.set("spark.driver.maxResultSize","3g")
conf.set("spark.executor.maxResultSize", "3g")
conf.set("spark.ui.showConsoleProgress","false") # 取消进度条显示
spark = SparkSession.builder.appName("local_redis_spark").master("local[*]").enableHiveSupport().config(conf=conf).getOrCreate()
spark.sparkContext.setLogLevel("ERROR") # 提升日志级别
python 复制代码
import redis
# 初始化一个全局函数来获取Redis连接池
def get_redis_connection_pool():
    # 配置redis参数
    host='127.0.0.1' # 替换为redis的服务地址即可
    port=6379
    password='123456' # 密码
    db=1 # db库如果不设置 默认为0
    max_connections=10  # 设置最大连接数
    redis_pool = redis.ConnectionPool(host=host, port=port, db=db, password=password, max_connections=max_connections)  
    return redis_pool

# 清空旧数据
with redis.Redis(connection_pool=get_redis_connection_pool()) as r:
    r.flushdb() # 清空当前库的所有数据 而flushall()则情况所有库数据
python 复制代码
%%time
# 并行处理函数serv_id
def servid_pfun(sdf_data):
    # 定义redis写入函数 以连接池的方式获取链接 及时释放
    def write_to_redis(data_dict):
        with redis.Redis(connection_pool=get_redis_connection_pool()) as r:
            r.mset(data_dict)
    # 构建一个空字典 批量写入
    dat = {}
    for rw in sdf_data:
        dat[rw.serv_id] = str((rw.r_inst_id, rw.avg_value))
    # 批量写入
    write_to_redis(dat)
    
# 并行处理函数one_id
def oneid_pfun(sdf_data):
    # 定义redis写入函数 以连接池的方式获取链接 及时释放
    def write_to_redis(data_dict):
        with redis.Redis(connection_pool=get_redis_connection_pool()) as r:
            r.mset(data_dict)
    # 构建一个空字典 批量写入
    dat = {}
    for rw in sdf_data:
        dat[rw.r_inst_id] = str((rw.offer_list,rw.filter_prod_offer_inst_list,rw.fuka_serv_offer_list,rw.filter_list,rw.new_serv_id))
    # 批量写入
    write_to_redis(dat)

# 加载缓存数据
oneid_sdf = spark.sql("""select * from database.table1""")

servid_sdf = spark.sql("""select * from database.table2""")

# 设置分区数 如果批量写入的内存大小以及最大链接数有限制
# servid_num_parts = 50000
# oneid_num_parts = 10000 

# 使用repartition方法进行重新分区
# servid_sdf_part = servid_sdf.repartition(servid_num_parts)
# oneid_sdf_part = oneid_sdf.repartition(oneid_num_parts)

# 分批写入redis
servid_sdf.foreachPartition(servid_pfun)
print(f"servid字典缓存成功")
oneid_sdf.foreachPartition(oneid_pfun)
print(f"oneid字典缓存成功")
# 关闭spark
spark.stop() 
print(f"redis缓存插入成功")

执行时间可能跟资源环境有关,测试整个过程大概只需要5分钟左右,非常快速。

相关推荐
landyjzlai2 小时前
蓝迪哥玩转Ai(8)---端侧AI:RK3588 端侧大语言模型(LLM)开发实战指南
人工智能·python
我叫黑大帅3 小时前
如何通过 Python 实现招聘平台自动投递
后端·python·面试
其实防守也摸鱼4 小时前
CTF密码学综合教学指南--第九章
开发语言·网络·python·安全·网络安全·密码学·ctf
砚底藏山河4 小时前
Python量化开发:2026最佳实时股票数据API接口推荐与对比
开发语言·windows·python
研究点啥好呢5 小时前
专为求职者开发的“面馆”!!!摆脱面试焦虑!!!
python·面试·开源·reactjs·求职招聘·fastapi
DFT计算杂谈5 小时前
自动化脚本一键绘制三元化合物相图
java·运维·服务器·开发语言·前端·python·自动化
EW Frontier6 小时前
6G ISAC新范式:基于智能漏波天线的Wi‑Fi通感一体化系统设计与实测【附MATLAB+python代码】
开发语言·python·matlab·music·isac·doa·wi‑fi
姚青&6 小时前
测试技术体系
java·python
为儿打call6 小时前
SparkSQL 广播超时排查:小表但是多分区 = BroadcastTimeout
大数据·spark
后端漫漫6 小时前
Redis 客户端工具体系
数据库·redis·缓存