使用Flink批处理实现WordCount

Flink作为一个非常优秀的大数据实时计算框架,在很多从事大数据开发的公司都是必备的技能,接下来我将通过Flink以批处理来实现入门案例WordCount

1:步骤一

idea新建设maven项目,并且自己配置好maven环境 

2:步骤二

在pom文件中加入下面的依赖和配置

 <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <!--Flink 版本-->
        <flink.version>1.13.0</flink.version>
        <!--JDK 版本-->
        <java.version>1.8</java.version>
        <slf4j.version>1.7.30</slf4j.version>
        <!--Scala 2.11 版本-->
        <scala.binary.version>2.12</scala.binary.version>
        <maven.compiler.source>${java.version}</maven.compiler.source>
        <maven.compiler.target>${java.version}</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-java</artifactId>
            <version>${flink.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-streaming-java_${scala.binary.version}</artifactId>
            <version>${flink.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-clients_2.11</artifactId>
            <version>${flink.version}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-to-slf4j</artifactId>
            <version>2.14.0</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.6.0</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>java</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <classpathScope>test</classpathScope>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>8</source>
                    <target>8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

3:步骤三

配置 log4j,在resources下面建一个文件log4j.properties,里面内容如下

# Output pattern : date [thread] priority category - message
log4j.rootLogger=WARN,CONSOLE,RollingFile

#CONSOLE
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n

#RollingFile
log4j.appender.RollingFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.RollingFile.File=logs/signserver.log
log4j.appender.RollingFile.layout=org.apache.log4j.PatternLayout
log4j.appender.RollingFile.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n

#Project default level
log4j.logger.com.ntko.sign=debug

4:步骤四

新建一个input目录,并且新建words.txt文件,文件中输入如下内容

hello world
hello flink
hello java

5:步骤五

 新建一个BatchWordCount类,里面代码如下

public class BatchWordCount {
    public static void main(String[] args) throws Exception {
        //1:创建执行环境
        ExecutionEnvironment executionEnvironment = ExecutionEnvironment.getExecutionEnvironment();
        //2:从文件读取数据
        DataSource<String> dataSource = executionEnvironment.readTextFile("input/words.txt");
        //将每行数据进行分词,转换成二元组类型
        FlatMapOperator<String, Tuple2<String, Long>> returns = dataSource.
                flatMap((String line, Collector<Tuple2<String, Long>> out) -> {
                    //将一行文本进行分词
                    String[] words = line.split(" ");
                    //将每个单词转换成二元组输出
                    for (String word : words) {
                        out.collect(Tuple2.of(word, 1L));
                    }
                }).returns(Types.TUPLE(Types.STRING, Types.LONG));
        //按照word进行分组
        UnsortedGrouping<Tuple2<String, Long>> tuple2UnsortedGrouping = returns.groupBy(0);
        //分组内进行聚合统计
        AggregateOperator<Tuple2<String, Long>> sum = tuple2UnsortedGrouping.sum(1);
        sum.print();
    }
}

6:步骤六

输出结果 可以看到flink单词出现了1次,world出现了1次,hello出现了三次,java出现了一次

### 回答1: 这是一个Flink批处理示例:import org.apache.flink.api.java.ExecutionEnvironment// 获取执行环境 val env = ExecutionEnvironment.getExecutionEnvironment// 读取文件 val text = env.readTextFile("hdfs:///input/input.txt")// 调用map方法,处理数据 val counts = text.flatMap{ _.toLowerCase.split("\\W+") filter { _.nonEmpty } } .map { (_, 1) } .groupBy(0) .sum(1)// 将结果输出到文件 counts.writeAsCsv("hdfs:///output/output.txt")// 执行 env.execute("Flink Batch WordCount Example") ### 回答2: package com.example.flinkdemo; import org.apache.flink.api.common.functions.FlatMapFunction; import org.apache.flink.api.java.ExecutionEnvironment; import org.apache.flink.api.java.tuple.Tuple2; import org.apache.flink.util.Collector; public class BatchWordCount { public static void main(String[] args) throws Exception { // 创建执行环境 ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment(); // 定义输入数据集 String inputPath = "path/to/input/file.txt"; DataSet<String> text = env.readTextFile(inputPath); // 转换操作:切分单词,计数为1 DataSet<Tuple2<String, Integer>> counts = text.flatMap(new Tokenizer()) .groupBy(0) .sum(1); // 输出结果 counts.print(); } // 自定义切分单词函数 public static final class Tokenizer implements FlatMapFunction<String, Tuple2<String, Integer>> { @Override public void flatMap(String value, Collector<Tuple2<String, Integer>> out) { // 切分字符串为单词 String[] words = value.toLowerCase().split(" "); // 遍历每个单词,发送到下游 for (String word : words) { if (word.length() > 0) { out.collect(new Tuple2<>(word, 1)); } } } } } 上述代码演示了一个简单的Flink批处理应用程序,用于统计文本文件中单词出现的次数。首先,从指定的输入路径读取文本文件。接下来,使用自定义的切分单词函数Tokenizer对文本进行处理,将每个单词切分出来,并和计数为1的元组一起发送给下游。最后,通过按照单词进行分组和求和操作,统计每个单词出现的次数。最终的结果通过print函数输出。 ### 回答3: Flink是一个可扩展且高性能的流处理框架,它也支持批处理作业。下面给你一个简单的Flink批处理的demo示例。 首先,你需要创建一个Flink批处理作业,该作业将处理一些数据并输出结果。我们假设你要对一个文本文件中的单词进行计数。 首先,你需要导入Flink的相关库: ```java import org.apache.flink.api.java.ExecutionEnvironment; import org.apache.flink.api.java.DataSet; import org.apache.flink.api.java.tuple.Tuple2; ``` 然后,你可以编写批处理的主要逻辑: ```java public class WordCountBatchJob { public static void main(String[] args) throws Exception { // 创建执行环境 ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment(); // 加载文本文件数据 String inputPath = "path/to/input/file"; DataSet<String> text = env.readTextFile(inputPath); // 执行单词计数逻辑 DataSet<Tuple2<String, Integer>> counts = text .flatMap((String line, Collector<Tuple2<String, Integer>> out) -> { String[] words = line.split(" "); for (String word : words) { out.collect(new Tuple2<>(word, 1)); } }) .groupBy(0) .sum(1); // 打印结果 counts.print(); } } ``` 在上述示例中,我们首先创建了一个ExecutionEnvironment对象,它是Flink批处理作业的入口。 然后,我们使用readTextFile()方法来加载文本文件的数据。你需要替换`path/to/input/file`为你实际的文本文件路径。 接下来,我们对文本中的每一行进行拆分,并将每个单词映射为`(word, 1)`的键值对。然后,我们根据单词进行分组,计算每个单词出现的次数。 最后,我们使用print()方法打印计数结果。 这是一个非常简单的Flink批处理作业demo示例。你可以根据实际需求,添加更复杂的逻辑来处理和转换数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值