我正在日食中运行flink,Maven已经获取了必要的罐子。我的机器有一个带有八个内核的处理器,我必须编写的流应用程序从输入中读取行并计算一些统计信息。
当我在我的机器上运行程序时,我希望flink使用CPU的所有内核作为线程代码。但是,当我观察核心时,我发现只使用了一个核心。我尝试了很多东西,并在上一次尝试中留下了以下代码,即设置环境的并行性。我也试图单独为流设置它等等。
public class SemSeMi {
public static void main(String[] args) throws Exception {
System.out.println("Starting Main!");
System.out.println(org.apache.flink.core.fs.local.LocalFileSystem
.getLocalFileSystem().getWorkingDirectory());
StreamExecutionEnvironment env = StreamExecutionEnvironment
.getExecutionEnvironment();
env.setParallelism(8);
env.socketTextStream("localhost", 9999).flatMap(new SplitterX());
env.execute("Something");
}
public static class SplitterX implements
FlatMapFunction<String, Tuple2<String, Integer>> {
@Override
public void flatMap(String sentence,
Collector<Tuple2<String, Integer>> out) throws Exception {
// Do Nothing!
}
}
}
我使用netcat为数据提供数据:
nc -lk 9999 < fileName
问题是如何使程序在本地扩展并使用所有可用的核心?
答案 0 :(得分:2)
您不必明确指定并行度。使用默认设置运行的作业会自动将并行性设置为可用核心数。
在您的情况下,源将以1
的并行性运行,因为无法分发从套接字读取。但是,对于flatMap
操作,系统将实例化8个实例。如果打开日志记录,那么您也会看到它。现在,输入数据以循环方式分发到flatMap
任务。每个flatMap
任务都由一个单独的线程执行。
我怀疑你只看到单个核心上的负载的原因是因为SplitterX
没有做任何工作。尝试使用以下代码计算每个String
中的字符数,然后将结果打印到控制台:
public static void main(String[] args) throws Exception {
System.out.println("Starting Main!");
System.out.println(org.apache.flink.core.fs.local.LocalFileSystem
.getLocalFileSystem().getWorkingDirectory());
StreamExecutionEnvironment env = StreamExecutionEnvironment
.getExecutionEnvironment();
env.socketTextStream("localhost", 9999).flatMap(new SplitterX()).print();
env.execute("Something");
}
public static class SplitterX implements
FlatMapFunction<String, Tuple2<String, Integer>> {
@Override
public void flatMap(String sentence,
Collector<Tuple2<String, Integer>> out) throws Exception {
out.collect(Tuple2.of(sentence, sentence.length()));
}
}
每行开头的数字告诉您哪个任务打印了结果。