用flink来进行词频统计

flink 作为第三代大数据计算框架可以实现数据的流处理和批处理
目前是阿里的开源项目
来看看怎么通过flink进行最简单的词频统计吧

编写词频统计Java代码

  • 批处理词频统计代码
package com.chengyuyang.wordcount;
import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.java.ExecutionEnvironment;
import org.apache.flink.api.java.operators.AggregateOperator;
import org.apache.flink.api.java.operators.DataSource;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.util.Collector;

public class BatchWordCount {
public static void main(String[] args)
{   // 创建flink 执行环境
ExecutionEnvironment executionEnvironment = ExecutionEnvironment.getExecutionEnvironment();
// 文件路径
String inputFile = "C:\\Users\\15318\\Desktop\\Flink\\flink理论学习\\src\\main\\resources\\123.txt";
// 读取到执行环境内
DataSource<String> inputDataSource = executionEnvironment.readTextFile(inputFile);
// 词频统计: 先分次 再分组 再聚合
AggregateOperator<Tuple2<String, Integer>> sum = inputDataSource.flatMap(new FlatMapFunction<String, Tuple2<String, Integer>>() {
@Override
public void flatMap(String value, Collector<Tuple2<String, Integer>> collector) throws Exception {
String[] tokens = value.toLowerCase().split(" ");
for (String token : tokens) {
if (token.length() > 0)
collector.collect(new Tuple2<>(token, 1));
}

}
}).groupBy(0).sum(1);
try {
sum.print();
} catch (Exception e) {
e.printStackTrace();
}

  }
}
  • 流处理词频统计代码
package com.chengyuyang.wordcount;

import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.util.Collector;

public class StreamWordCount {

    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        DataStreamSource<String> text = env.socketTextStream("192.168.216.111", 9999);
        SingleOutputStreamOperator<Tuple2<String, Integer>> sum = text.flatMap(new FlatMapFunction<String, Tuple2<String, Integer>>() {
            @Override
            public void flatMap(String value, Collector<Tuple2<String, Integer>> collector) throws Exception {
                for (String token : value.split(" ")) {
                    collector.collect(new Tuple2<String, Integer>(token, 1));
                }
            }
        }).keyBy(0).sum(1);
        sum.print().setParallelism(1);    //并行度为1 (1个线程)
        env.execute("Window WordCount");

    }
}

创建maven项目 打包

image.png

上传到 flink集群进行测试

  • 开启HA 模式flink集群
    image.png

用用可视化界面操作

上传jar包上去

image.png

进行简单的配置

image.png

用于是用nc端口监控模拟流数据所有就没有必要设置并行度了

开启job!

image.png

去虚拟机发几条数据看看

image.png

看看job的运行情况

image.png

七条数据已经全部接受

查看统计结果

去哪个地方看呢
TaskManger or JobManger
如果把这个任务比做出工地施工
那么JobManger就是负责设计图纸和调动各个部门
TaskManger就是现场实操了
image.png
结果就这三个TaskManger其中之一

查看结果

image.png

不错,拿下!


批处理词频统计就不做展示了(处理流式数据才是王道)

用命令行进行操作

一个大神级的程序员应该是对着一片白或一片黑的屏幕啪啪啪在这敲来敲去
而不是对着可视化界面点点点。。。

  • 开启job
./bin/flink run jars/streaming/FlinkTutorial-1.0-SNAPSHOT.jar --port 9999
  • 提交批job作业(到/home/out/fl00)
flink run /usr/local/flink-1.10.1/jars/batch/FlinkTutorial-1.0-SNAPSHOT.jar --input /home/words --output /home/out/fl00

本文转载于我的个人博客用flink来进行词频统计
遵循 CC 4.0 BY-SA 版权协议
欢迎关注我的个人博客:Sakura的个人博客

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
首先,我们需要将 `reduceByKeyAndWindow` 的结果转换为可以写入文本文件和 MySQL 数据库的格式,比如一个包含单词和频率的元组列表。假设我们已经完成了这个转换,下面是将结果写入文本文件和 MySQL 数据库的示例代码: ```python # 导入必要的库 import mysql.connector import os # 将结果写入文本文件 def write_to_file(result, filename): with open(filename, 'w') as f: for word, freq in result: f.write(f'{word}:{freq}\n') # 将结果写入 MySQL 数据库 def write_to_mysql(result, db_config): # 连接数据库 conn = mysql.connector.connect(**db_config) cursor = conn.cursor() # 创建表 cursor.execute('CREATE TABLE IF NOT EXISTS wordfreq (word VARCHAR(255), freq INT)') # 清空表 cursor.execute('TRUNCATE TABLE wordfreq') # 插入数据 for word, freq in result: cursor.execute('INSERT INTO wordfreq (word, freq) VALUES (%s, %s)', (word, freq)) # 提交事务并关闭连接 conn.commit() cursor.close() conn.close() # 示例代码 if __name__ == '__main__': # 假设结果已经转换为列表形式,并存储在变量 result 中 result = [('hello', 3), ('world', 2), ('python', 1)] # 将结果写入文本文件 write_to_file(result, 'wordfreq.txt') # 将结果写入 MySQL 数据库 db_config = { 'host': 'localhost', 'user': 'root', 'password': 'password', 'database': 'test' } write_to_mysql(result, db_config) ``` 请注意,这只是一个示例代码,实际应用需要根据具体情况进行修改。此外,为了将结果写入 MySQL 数据库,我们需要安装 `mysql-connector` 库。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值