Flink集成Mybatis

        最近在使用Flink写了一个流式处理项目,最后是把处理的结果写到mysql里面,虽然Flink官方提供JDBC Connector,但是毕竟JDBC太原始了,用Mybatis+Druid不香吗,经过一段时间的摸索和测试,把最后的代码以及遇到的一些问题分享一下。

相关依赖:

        pom.xml

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.3.0</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>6.0.4</version>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.2.4</version>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.16.22</version>
    <optional>true</optional>
</dependency>

Mybatis配置:

           mybatis_conf.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD SQL Map Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
        <setting name="useGeneratedKeys" value="true"/>
        <setting name="defaultExecutorType" value="REUSE"/>
        <!-- <setting name="logImpl" value="STDOUT_LOGGING"/>  打印查询语句 -->
    </settings>
    <environments default="default">
        <environment id="default">
            <transactionManager type="JDBC"/>
            <dataSource type="com.util.DruidDataSourceFactory">
                <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="....."/>
                <property name="username" value="....."/>
                <property name="password" value="....."/>
                <property name="validationQuery" value="select 'x'"/>
                <property name="testOnBorrow" value="false"/>
                <property name="testWhileIdle" value="true"/>
                <!--小于mysql服务器设置的wait_timeout,mysql默认设置是8个小时-->
                <property name="timeBetweenEvictionRunsMillis" value="3600000"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="mapper.xml"/>
    </mappers>
</configuration>

Mapper :

        mapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper">

    <insert id="updateActive" parameterType="com.pojo.IndeH5RtDau">
	      insert into .........
    </insert>

</mapper>

 代码:

import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.datasource.pooled.PooledDataSourceFactory;

public class DruidDataSourceFactory extends PooledDataSourceFactory {
    public DruidDataSourceFactory() {
        this.dataSource = new DruidDataSource();
    }
}

        

import lombok.extern.log4j.Log4j;
import org.apache.flink.streaming.api.functions.sink.RichSinkFunction;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.InputStream;

import static com.util.Utils.getResourceAsStream;

@Log4j
public class MybatisSink<T> extends RichSinkFunction<T> {

    private static SqlSessionFactory sqlSessionFactory;

    static {
        try (InputStream inputStream = getResourceAsStream("mybatis_conf.xml")) {
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        }
    }


    private String sqlId;

    public MybatisSink(String sqlId) {
        this.sqlId = sqlId;
    }


    @Override
    public void invoke(T value, Context context) {
        try (SqlSession sqlSession = sqlSessionFactory.openSession(true)) {
            sqlSession.insert(sqlId, value); 
        } catch (Exception ex) {
            log.error(ex.getMessage(), ex);
        }
    }
}
@Log4j
public class Utils {

    public static InputStream getResourceAsStream(String s) {
        return Utils.class.getClassLoader().getResourceAsStream(s);
    }
}

        在Flink代码中直接在类型DataStream<T>上调用addSink(new MybatisSink<>("com.example.mapper.updateActive"))来使用MybatisSink来操作数据库。

        这个代码并不复杂,但是有一些值得注意的地方。Mybatis的使用主要问题就在于SqlSessionFactory和SqlSession的创建与使用,SqlSessionFactory在代码中应该使用单例模式;而SqlSession是线程不安全的,应该作为局部变量,并且应该及时调用close方法关闭资源,在这个代码中直接使用最简单的静态单例模式以及try-with-resources语句来解决这两个问题。最开始我的代码是这样写的:


public class MybatisSink<T> extends RichSinkFunction<T> {

    private String sql;
    private SqlSessionFactory sqlSessionFactory;

    public MybatisSink(String sql) {
        this.sql = sql;
    }

    @Override
    public void open(Configuration parameters) throws Exception {
        sqlSessionFactory = getSqlSessionFactory();
    }

    @Override
    public void invoke(Row value, Context context) {
        try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
            
        }      
    }
}

        这样写其实是有问题的,SqlSessionFactory可能不是单例的。Flink是以多进程+多线程模式执行任务的,比如有3个Task Manager,6个Task Slot,那么一般而言就是3个进程,每个进程里面有2个线程在执行任务,每个线程叫做一个子任务(SubTask)。而每个子任务都会单独创建一个Sink的实例,按照上面这种写法每个Sink实例都会去创建一个SqlSessionFactory实例,而每创建一个SqlSessionFactory实例都会去创建一个DataSource实例,虽然这样写代码是可以运行的,但是显然是不科学的,在一个进程中所有的线程应该是共享一个线程池才对。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
用户画像,作为一种勾画目标用户、联系用户诉求与设计方向的有效工具,用户画像在各领域得到了广泛的应用。用户画像最初是在电商领域得到应用的,在大数据时代背景下,用户信息充斥在网络中,将用户的每个具体信息抽象成标签,利用这些标签将用户形象具体化,从而为用户提供有针对性的服务。还记得年底收到的支付宝年度消费账单吗?帮助客户回顾一年的消费细节,包括消费能力、消费去向、信用额度等等,再根据每位客户的消费习惯,量身定制商品推荐列表……这一活动,将数据这个量化的词以形象生动的表现手法推到了大众面前。这就是用户画像在电商领域的一个应用,随着我国电子商务的高速发展,越来越多的人注意到数据信息对于电商市场的推动作用。基于数据分析的精准营销方式,可以最大限度的挖掘并留住潜在客户,数据统计与分析为电商市场带来的突破不可估量。在大数据时代,一切皆可“量化”,看似普通的小小数字背后,蕴藏着无限商机,也正在被越来越多的企业所洞悉。如何从大数据中挖掘商机?建立用户画像和精准化分析是关键。什么是用户画像呢?用户画像是根据市场研究和数据,创建的理想中客户虚构的表示。创建用户画像,这将有助于理解现实生活中的目标受众。企业创建的人物角色画像,具体到针对他们的目标和需求,并解决他们的问题,同时,这将帮助企业更加直观的转化客户。用户画像最重要的一个步骤就是对用户标签化,我们要明确要分析用户的各种维度,才能确定如何对用户进行画像。用户画像建立步骤首先,基础数据收集,电商领域大致分为行为数据、内容偏好数据、交易数据,如浏览量、访问时长、家具偏好、回头率等等。而金融领域又有贷款信息,信用卡,各种征信信息等等。然后,当我们对用户画像所需要的基础数据收集完毕后,需要对这些资料进行分析和加工,提炼关键要素,构建可视化模型。对收集到的数据进行行为建模,抽象出用户的标签。电商领域可能是把用户的基本属性、购买能力、行为特征、兴趣爱好、心理特征、社交网络大致的标签化,而金融风控领域则是更关注用户的基本信息,风险信息,财务信息等等。随后,要利用大数据的整体架构对标签化的过程进行开发实现,对数据进行加工,将标签管理化。同时将标签计算的结果进行计算。这个过程中需要依靠Hive,Hbase等大数据技术,为了提高数据的实时性,还要用到Flink,Kafka等实时计算技术。最后,也是最关键的一步,要将我们的计算结果,数据,接口等等,形成服务。比如,图表展示,可视化展示。基于Flink+Alink构建全端亿级实时用户画像系统课程,将带领大家一步一步实现一个强大的实时用户画像系统,该系统以热门的互联网电商实际业务应用场景为案例讲解,具体包含:标签管理(支持动态标签扩展,动态标签指标)、用户预测、用户群体画像、用户行为画像、用户中心、几大内容。本课程采用全新的大数据技术栈:Flink+Alink,让你体验到全新技术栈的强大,感受时代变化的气息,通过学习完本课程可以节省你摸索的时间,节省企业成本,提高企业开发效率。本课程包含的技术: 开发工具为:IDEA、WebStorm Flink1.13.0Alink1.5.0 ClickHouseDolphinSchedulerHadoopHbaseKafkaZookeeper SpringBoot2.0.8.RELEASE SpringCloud Finchley.SR2BinlogCanal MySQL MybatisVue.js、Nodejs、ElementUI 课程亮点: 1.与企业接轨、真实工业界产品2.标签化管理模块功能,支持动态标签扩展3.动态标签指标分析和维护4.Alink算法技术框架 5.大数据热门技术Flink新版本 6.主流微服务后端系统 7.数据库实时同步解决方案 8.涵盖主流前端技术VUE+NodeJS+ElementUI 9.集成SpringCloud实现统一整合方案 10.互联网大数据企业热门技术栈 11.支持海量数据的实时画像 12.支持全端实时画像 13.全程代码实操,提供全部代码和资料 14.提供答疑和提供企业技术方案咨询 
### 回答1: Flink可以通过Flink Metrics API将指标数据导出到第三方系统,例如Prometheus和Graphite。为了收集这些指标数据并将其导入到这些系统中,可以使用Flink集成的Metrics Agent。Metrics Agent是一个独立的进程,可以在Flink任务运行时收集指标数据,并将其发送到指定的系统中。 要启用Metrics Agent,需要在flink-conf.yaml配置文件中设置以下属性: ``` metrics.reporter.<name>.class: org.apache.flink.metrics.reporter.MetricAgentReporter metrics.reporter.<name>.port: <agent-port> metrics.reporter.<name>.interval: <reporting-interval> ``` 其中,`<name>`是报告器的名称,`<agent-port>`是Metrics Agent的端口号,`<reporting-interval>`是指标数据的报告间隔时间。启用Metrics Agent后,可以使用以下命令在Metrics Agent的Web界面上查看指标数据: ``` curl http://<agent-host>:<agent-port>/metrics ``` 其中,`<agent-host>`是Metrics Agent的主机名或IP地址。 ### 回答2: Flink集成Agent是指在Apache Flink分布式流处理引擎中加入Agent进行监控和管理。Agent是一种轻量级的代理程序,可以提供对Flink应用程序的实时监控、错误处理和管理功能。 在Flink集成Agent后,可以通过Agent对Flink应用程序进行监控。Agent会收集和汇总Flink应用程序的运行状态、性能指标以及错误日志等信息,并将其展示在监控界面上供用户查看。这样,用户可以实时了解Flink应用程序的运行情况,及时发现和解决问题,提高应用程序的稳定性和性能。 此外,Agent还可以进行错误处理。当Flink应用程序发生错误或异常时,Agent可以及时通知相关人员,同时记录错误日志以便后续分析。这有助于快速定位和解决问题,减少应用程序运行中断的时间,提高系统的可用性和稳定性。 Agent还可以进行管理操作。通过Agent,可以对Flink应用程序进行启动、停止、重启等管理操作,而不需要直接登录到Flink集群的服务器上进行操作。这样,可以简化操作流程,降低管理成本,并保证操作的安全性。 总之,Flink集成Agent可以使用户更加方便地监控和管理Flink应用程序,提高应用程序的可靠性和性能,同时降低管理成本和操作复杂度。 ### 回答3: Flink集成Agent是指在Flink应用程序中使用Agent来监控和收集应用程序的性能指标和数据。Agent是一种轻量级的软件组件,可以在运行时与应用程序进行交互,并提供实时的性能监控和数据收集功能。 集成Agent可以帮助我们实时监控和分析Flink应用程序的运行状况和性能表现。Agent可以收集和监控各种指标,如CPU使用率、内存使用情况、网络传输速度等,并将这些数据汇总到统一的监控平台中进行展示和分析。通过监控和收集这些指标,我们可以及时发现应用程序中的性能瓶颈和问题,并采取相应的优化措施。 另外,集成Agent还可以帮助我们进行应用的故障诊断和调试。Agent可以记录和收集应用程序运行过程中的日志和错误信息,以便我们追溯问题的根源和解决方法。通过分析这些收集到的数据,我们可以快速定位和修复应用程序中的bug和异常。 总的来说,将Agent集成Flink应用程序中,可以提供实时的性能监控和数据收集功能,帮助我们及时发现和解决应用程序中的性能问题和异常情况。这将有助于提高应用程序的稳定性和性能表现,并提供更好的用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值