在多核处理器上本地运行apache flink

时间:2016-01-15 15:19:27

标签: apache-flink flink-streaming

我正在日食中运行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

问题是如何使程序在本地扩展并使用所有可用的核心?

1 个答案:

答案 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()));

    }
}

每行开头的数字告诉您哪个任务打印了结果。