package com.alibaba.flink.performance.test;
import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.api.java.utils.ParameterTool;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.functions.source.ParallelSourceFunction;
import org.apache.flink.streaming.api.functions.source.SourceFunction;
import org.apache.flink.util.Collector;
import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;
/**
* @author Jark (wuchong.wc@alibaba-inc.com)
*/
public class StreamWordCount {
public static void main(String[] args) throws Exception {
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// env.addS
ParameterTool tool = ParameterTool.fromArgs(args);
int sourceParallel = Integer.parseInt(tool.get("s"));
int operatorParallel = Integer.parseInt(tool.get("p"));
System.out.println("sourceParallel: " + sourceParallel + ", operatorParallel: " + operatorParallel);
env.setParallelism(operatorParallel);
// get input data
DataStream<String> text = env.addSource(new WordSource()).setParallelism(sourceParallel);
DataStream<Tuple2<String, Integer>> counts =
// split up the lines in pairs (2-tuples) containing: (word,1)
text.flatMap(new LineSplitter())
// group by the tuple field "0" and sum up tuple field "1"
.keyBy(0)
.sum(1);
// execute program
// env.execute("StreamWordCount");
System.out.println(env.getExecutionPlan());
}
public static class WordSource implements ParallelSourceFunction<String> {
Random _rand = ThreadLocalRandom.current();
private volatile boolean active = true;
private static final String[] CHOICES = {
"marry had a little lamb whos fleese was white as snow",
"and every where that marry went the lamb was sure to go",
"one two three four five six seven eight nine ten",
"this is a test of the emergency broadcast system this is only a test",
"peter piper picked a peck of pickeled peppers"
};
@Override
public void run(SourceContext<String> ctx) throws Exception {
while (active) {
String sentence = CHOICES[_rand.nextInt(CHOICES.length)];
ctx.collect(sentence);
}
}
@Override
public void cancel() {
active = false;
}
}
/**
* Implements the string tokenizer that splits sentences into words as a user-defined
* FlatMapFunction. The function takes a line (String) and splits it into
* multiple pairs in the form of "(word,1)" (Tuple2<String, Integer>).
*/
public static final class LineSplitter implements FlatMapFunction<String, Tuple2<String, Integer>> {
@Override
public void flatMap(String value, Collector<Tuple2<String, Integer>> out) {
// normalize and split the line
String[] tokens = value.toLowerCase().split("\\W+");
// emit the pairs
for (String token : tokens) {
if (token.length() > 0) {
out.collect(new Tuple2<String, Integer>(token, 1));
}
}
}
}
}