Apache flink Flink的简单hello world示例

Apache flink Flink的简单hello world示例,apache-flink,Apache Flink,我正在寻找使用ApacheFlink进行hello world体验的最简单示例 假设我刚刚在一个干净的盒子上安装了flink,我需要做什么才能“让它有所作为”。我意识到这是相当模糊的,这里有一些例子 终端上的三个python示例: python -c "print('hello world')" python hello_world.py python python -c "print(1+1)" 当然,流媒体应用程序有点复杂,但这里有一些类似于我之前为

我正在寻找使用ApacheFlink进行hello world体验的最简单示例

假设我刚刚在一个干净的盒子上安装了flink,我需要做什么才能“让它有所作为”。我意识到这是相当模糊的,这里有一些例子

终端上的三个python示例:

python -c "print('hello world')"
python hello_world.py
python python -c "print(1+1)"
当然,流媒体应用程序有点复杂,但这里有一些类似于我之前为spark streaming所做的事情:

如您所见,这些示例具有一些很好的特性:

  • 它们是最小的
  • 对其他工具/资源的依赖性最小
  • 逻辑可以简单地调整(例如不同的数字或不同的分隔符)
  • 因此,我的问题是:

    对Flink来说,最简单的hello world示例是什么
    到目前为止,我发现有50行代码需要编译

    如果由于第3点的原因无法避免这种情况,那么满足第1点和第2点并使用(仅)默认情况下提供的罐子或从信誉良好的来源容易获得的罐子也可以。好的,这样如何:

    public static void main(String[] args) throws Exception {
      final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
    
      env.fromElements(1, 2, 3, 4, 5)
        .map(i -> 2 * i)
        .print();
    
      env.execute();
    }
    

    在大多数大数据和相关框架中,我们以Hello World为例给出了单词计数程序。下面是Flink中单词计数的代码:

    final ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
        DataSet<String> text = env.fromCollection(Arrays.asList("This is line one. This is my line number 2. Third line is here".split(". ")));
    
        DataSet<Tuple2<String, Integer>> wordCounts = text
            .flatMap(new FlatMapFunction<String, Tuple2<String, Integer>>() {
              @Override
              public void flatMap(String line, Collector<Tuple2<String, Integer>> out) throws Exception {
                for (String word : line.split(" ")) {
                  out.collect(new Tuple2<>(word, 1));
                }
              }
            })
            .groupBy(0)
            .sum(1);
    
    wordCounts.print();
    
    final ExecutionEnvironment env=ExecutionEnvironment.getExecutionEnvironment();
    DataSet text=env.fromCollection(Arrays.asList(“这是第一行,这是我的第二行,第三行在这里”).split(“.”);
    数据集字数=文本
    .flatMap(新的flatMap函数(){
    @凌驾
    公共void flatMap(字符串行、收集器输出)引发异常{
    for(字符串字:line.split(“”){
    out.collect(新的Tuple2(word,1));
    }
    }
    })
    .groupBy(0)
    .总数(1);
    wordCounts.print();
    
    读取文件

    final ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
        env.setParallelism(1);
    
        //The path of the file, as a URI
        //(e.g., "file:///some/local/file" or "hdfs://host:port/file/path").
        DataSet<String> text = env.readTextFile("/path/to/file");
    
        DataSet<Tuple2<String, Integer>> wordCounts = text
            .flatMap(new FlatMapFunction<String, Tuple2<String, Integer>>() {
              @Override
              public void flatMap(String line, Collector<Tuple2<String, Integer>> out) throws Exception {
                for (String word : line.split(" ")) {
                  out.collect(new Tuple2<String, Integer>(word, 1));
                }
              }
            })
            .groupBy(0)
            .sum(1);
    
        wordCounts.print();
    
    final ExecutionEnvironment env=ExecutionEnvironment.getExecutionEnvironment();
    环境(一);
    //文件的路径,作为URI
    //(例如,”file:///some/local/file“或”hdfs://host:port/file/path").
    DataSet text=env.readTextFile(“/path/to/file”);
    数据集字数=文本
    .flatMap(新的flatMap函数(){
    @凌驾
    公共void flatMap(字符串行、收集器输出)引发异常{
    for(字符串字:line.split(“”){
    out.collect(新的Tuple2(word,1));
    }
    }
    })
    .groupBy(0)
    .总数(1);
    wordCounts.print();
    
    不要使用try-catch处理在wordCounts.print()上引发的异常,而是将throw添加到方法签名

    将以下依赖项添加到pom.xml

    <dependency>
          <groupId>org.apache.flink</groupId>
          <artifactId>flink-java</artifactId>
          <version>1.8.0</version>
    </dependency> 
    
    
    org.apache.flink
    

    Flink流媒体文档和示例:

    使用标准资源的最小步骤 我不确定这是否是最终的答案,但我发现flink通常会附带一些示例,这些示例允许以最小的努力进行一些简单的交互

    下面是一个可能的hello world示例,其中包含flink 1.9.1附带的基于默认字数的标准资源:

  • 确保flink群集已启动,并且flink目录中有三个终端处于打开状态

  • 在终端1中,打开与右端口的连接

  • nc-L9000

  • 在下一行的同一终端中,键入一些文本并按enter键
  • Hello World

  • 在终端2中,启动标准字数逻辑
  • /bin/flink运行示例/streaming/SocketWindowWordCount.jar——端口9000

  • 在端子3中,检查计数结果
  • tail-f log/flink-*-taskexecutor-*.out

    您现在应该看到:

    Hello : 1
    World : 1
    

    就是这样,从这里您可以在terminal 1中键入更多内容,当您再次检查日志时,您将看到更新的字数


    如果您之前已经这样做过一次,并且希望重新开始,那么可以使用
    rm log/flink-*-taskexecutor-*.out来清除日志(假设是沙箱环境)。为什么要进行否决,是否不清楚?--一个hello world的例子肯定足够相关了?!如果出现问题,请重新措辞标题。经典字数有什么问题?@MIkCode可能是对的,与读取文件或从Seq创建数据流相关的经典字数应该是最简单的。@MIkCode不确定经典是什么,但我发现的最后两件事是需要编译的50-125行代码。我明白这可能是正确理解的必要条件,但我正在寻找一种解决方法。例如,使用标准材料?将在我接受(并检查)之前给其他人一个回答的机会,但这已经得到了支持,因为这比我目前所能找到的任何东西都更符合事物的精神:-)很好,很短,但是对于流媒体,我理想地从外部世界获得字符串(终端、文件)。从“外部”获取字符串是否容易?为了让上面的工作正常进行,我必须做三个额外的更改(1)Add
    org.apache.log4j.BasicConfigurator.configure()
    作为上述程序(2)的第1行,添加
    groupId>log4jlog4j1.2.17
    ,最后添加另一个依赖项(3)
    org.apache.flinkflink-clients#2.121.8.0