flink访问达梦数据库

背景

使用flink消费kafka中事件,计算规则以及维度数据保存在达梦数据库中,将计算结果存放在MemFireDB中。

达梦数据库

达梦数据库管理系统是达梦公司推出的具有完全自主知识产权的高性能数据库管理系统,简称DM。

安装达梦数据库驱动

将达梦的jdbc驱动安装到maven local仓库中

start cmd /k "%mvn% install:install-file -Dfile=Dm7JdbcDriver17.jar -DgroupId=com.dm -DartifactId=Dm7JdbcDriver -Dversion=1.7 -Dpackaging=jar"

引入maven依赖

        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-jdbc_2.12</artifactId>
            <version>1.7.2</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>com.dm</groupId>
            <artifactId>Dm7JdbcDriver</artifactId>
            <version>1.7</version>
            <scope>compile</scope>
        </dependency>

通过jdbc进行连接

public class DmRichMapFunction<IN, OUT> extends RichFlatMapFunction<IN, OUT> {
    private static final Logger logger = LoggerFactory.getLogger(DmRichMapFunction.class);
    private static final String dmjdbcString = "dm.jdbc.driver.DmDriver";
    protected Connection connect = null;

    public void loadJdbcDriver() throws SQLException {
        try {
            System.out.println("Loading JDBC Driver...");
// 加载 JDBC 驱动程序
//DriverManager.registerDriver(new dm.jdbc.driver.DmDriver());
            Class.forName(dmjdbcString);
        } catch (ClassNotFoundException e) {
            throw new SQLException("Load JDBC Driver Error1: " + e.getMessage());
        } catch (Exception ex) {
            throw new SQLException("Load JDBC Driver Error : "
                    + ex.getMessage());
        }
    }


    @Override
    public void open(Configuration parameters) throws Exception {
        super.open(parameters);
        ParameterTool parameterTool = (ParameterTool)
                getRuntimeContext().getExecutionConfig().getGlobalJobParameters();
        String user = parameterTool.get("u", "");
        String passwd = parameterTool.get("p", "");
        String address = parameterTool.get("a", "localhost:3306");
        String url = "jdbc:dm://" + address;

        logInfo("url:" + url + ",user:" + user );
        loadJdbcDriver();
        connect = DriverManager.getConnection(url, user, passwd);
    }

    @Override
    public void close() throws Exception {

        if (connect != null) {
            connect.close();
        }
        super.close();
    }


    @Override
    public void flatMap(IN value, Collector<OUT> out) throws Exception {

    }
}

过程中遇到的问题

  • 默认的flink-java中是未引入jdbc的支持,需要单独引入flink-jdbc
  • 开始想通过withParameters(configuration)方法传递数据库相关参数到FlatMapFunction中,后面发现该方法只在DataSet上使用而不可以在DataStream上使用。最后采用getConfig().setGlobalJobParameters方法传递配置参数。
environment.getConfig().setGlobalJobParameters(parameterTool);
ParameterTool parameterTool = (ParameterTool)
                getRuntimeContext().getExecutionConfig().getGlobalJobParameters();

数据分析小白入门指南

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flink 批处理中将数据写入数据库可以通过 Flink 的 `OutputFormat` 接口来实现。下面是一个简单的示例,假设有一个数据集 `DataSet<Tuple2<String, Integer>>`,其中每个元素是一个字符串和一个整数,需要将其写入到 MySQL 数据库中: 1. 首先需要引入对应的依赖,例如: ```xml <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.25</version> </dependency> ``` 2. 然后定义一个实现了 `OutputFormat` 接口的类,例如: ```java public class MySQLOutputFormat implements OutputFormat<Tuple2<String, Integer>> { private Connection connection; private PreparedStatement statement; @Override public void configure(Configuration configuration) { // 获取数据库连接等配置信息 String jdbcUrl = configuration.getString("jdbc.url", "jdbc:mysql://localhost:3306/test"); String username = configuration.getString("jdbc.username", "root"); String password = configuration.getString("jdbc.password", "root"); try { connection = DriverManager.getConnection(jdbcUrl, username, password); statement = connection.prepareStatement("INSERT INTO table_name (col1, col2) VALUES (?, ?)"); } catch (SQLException e) { e.printStackTrace(); } } @Override public void open(int i, int i1) throws IOException { // 打开连接,并设置事务等配置信息 try { connection.setAutoCommit(false); } catch (SQLException e) { e.printStackTrace(); } } @Override public void writeRecord(Tuple2<String, Integer> tuple2) throws IOException { // 将数据写入 PreparedStatement 中 try { statement.setString(1, tuple2.f0); statement.setInt(2, tuple2.f1); statement.addBatch(); } catch (SQLException e) { e.printStackTrace(); } } @Override public void close() throws IOException { // 执行批量写入,并提交事务 try { statement.executeBatch(); connection.commit(); } catch (SQLException e) { e.printStackTrace(); } finally { // 关闭连接等资源 try { if (statement != null) { statement.close(); } if (connection != null) { connection.close(); } } catch (SQLException e) { e.printStackTrace(); } } } } ``` 3. 最后在 Flink 程序中使用该类进行数据写入,例如: ```java DataSet<Tuple2<String, Integer>> dataSet = ... // 获取数据集 Configuration config = new Configuration(); config.setString("jdbc.url", "jdbc:mysql://localhost:3306/test"); config.setString("jdbc.username", "root"); config.setString("jdbc.password", "root"); dataSet.output(new MySQLOutputFormat()).configure(config); env.execute(); ``` 以上是一个简单的示例,需要根据具体情况进行适当的调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值