hive redis 集群模式udf 写入

前面写了一个单实例模式的redis hset写入udf,使用pipeline提高写入性能,没用连接池,因为有使用限制,就是要按唯一键mod分成许多个组然后collect_list传入一个列表,所以创建的连接很少,保证每个组里面的这个list不会太大,就没啥问题。不然在pipeline上提交的时候应该也要计数一下,每多少条sync一下,偷懒了。。。。

后面正式使用的时候是将这些用户id写入了一个redis集群,那么那个udf就不好用了,得写过一个,因为集群模式没有pipeline啊我擦。。。。

开始没想那么多,在evaluate函数里面每次都会创建一个JedisCluster实例,类似下面这种:

  @Override
    public Object evaluate(DeferredObject[] arg0) throws HiveException {
        //JedisCluster只能在方法内部创建作为局部变量使用,这个类里面会用到连接池,连接池是有状态的,无法序列化。

        try (JedisCluster jedisCluster = new JedisCluster(hostAndPort)) {
            for (int i = 0; i < paramsListInspector.getListLength(arg0[2].get()); i++) {
                Object row = paramsListInspector.getListElement(arg0[2].get(), i);
                Map<?, ?> map = paramsElementInspector.getMap(row);
                if (map.containsKey(writableKeyField)) {
                    String did = map.get(writableKeyField).toString();
                    for (Map.Entry<?, ?> entry : map.entrySet()) {
                        if (!writableKeyField.equals(entry.getKey()) && entry.getValue() != null && !"".equals(entry.getValue().toString())) {
                            jedisCluster.hset(did, entry.getKey().toString(), entry.getValue().toString());
                        }
                    }
                }
            }
            return new IntWritable(1);
        } catch (Exception e) {
            e.printStackTrace();
            throw new HiveException(e);
        }
    }
性能简直差到爆啊,因为有300多万条数据,每条都创建一个JedisCluster,而且JedisCluster和Jedis不太一样,他内部本省就是使用了pool。。。想想都很恐怖,如果执行快的话其实都没太去管这么多,关键是执行的慢的不得了,就得优化了。

首先一个优化就是想同一个map container里面所有数据都共享一个jedisCluster实例,于是抽离到单独的类中去,延迟初始化,不能定义在当前udf类中通过initialize来初始化,会无法序列化:

import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.joda.time.DateTime;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;

import java.util.concurrent.*;

public class JedisClusterUtil {

    

 

    private static GenericObjectPoolConfig initPoolConfiguration() {
        System.out.println(Thread
### Hive 的含义及用途 Hive 是一种建立在 Hadoop 上的数据仓库工具,主要用于大规模数据集的存储和查询。它提供了一种类似于 SQL 的查询语言——HiveQL (Hive Query Language),使得熟悉关系数据库的人能够轻松地操作大数据环境中的结构化数据[^1]。通过 Hive,用户无需编写复杂的 MapReduce 程序即可完成数据分析任务。 以下是 Hive 的主要特点: - **SQL 风格接口**:支持类似 SQL 的语法,方便传统数据库开发者快速上手。 - **可扩展性**:可以通过自定义函数(UDF)、映射器(Mapper)和规约器(Reducer)来扩展功能。 - **集成能力**:与 Hadoop 生态系统的其他组件无缝协作,如 Pig、Spark 和 HBase。 ```sql -- 示例 Hive 查询语句 SELECT column_name FROM table_name WHERE condition; ``` --- ### SR 的含义及用途 SR 可能指代多个概念,在 IT 领域中常见的解释如下: #### 1. SCSI Reservations (SCSI 储备) 在小型计算机系统接口(SCSI)协议中,“SR”可能代表 “SCSI Reservation”,这是一种机制,允许主机保留对特定设备的独占访问权,防止其他主机在同一时间对其进行修改或读取操作[^3]。这种技术常用于高并发场景下的资源管理,例如 SAN 存储环境中避免多台服务器同时写入同一块磁盘区域引发冲突。 #### 2. Service Request (服务请求) 在软件开发和服务运维领域,“SR”通常缩写为“Service Request”,表示客户向技术支持团队提交的服务申请单。这类工单记录了用户的反馈意见、错误报告或其他需要解决的问题,并跟踪其处理进度直至关闭状态为止。 #### 3. Session Replication (会话复制) 当提到 Web 应用程序部署于集群架构之上时,“SR”也可能意指“Session Replication”。为了提高可用性和负载均衡效果,Tomcat 或者其他应用服务器之间需同步 HTTP session 数据以便跨节点切换时不丢失用户上下文信息[^2]。Redis 经常被用来作为外部缓存媒介实现高效的 session 共享方案。 #### 4. Spanning Tree Protocol (生成树协议) 在网络通信方面,“SR”还可能是某些厂商对于 STP(Spanning Tree Protocol)变体版本的一种简称形式,旨在优化二层网络拓扑结构从而消除环路并增强冗余路径利用率。 --- ### 总结对比 | 名称 | 定义 | 主要作用 | |------|------------------------------------------------------------------------------------------|-------------------------------------------------------------------| | Hive | 构建于 Hadoop 平台上的一套开源数据仓库框架 | 提供高效的大规模数据管理和分析解决方案 | | SR | 根据不同背景分别对应 SCSI Reserve、Service Request、Session Replication 或 Spanning Tree | 各自有针对性的功能覆盖范围从硬件控制到客户服务再到网络配置等领域 | ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值