Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache kafka 在kafka群集节点之间分发数据套接字_Apache Kafka_Kafka Consumer Api_Flink Streaming_Kafka Producer Api - Fatal编程技术网

Apache kafka 在kafka群集节点之间分发数据套接字

Apache kafka 在kafka群集节点之间分发数据套接字,apache-kafka,kafka-consumer-api,flink-streaming,kafka-producer-api,Apache Kafka,Kafka Consumer Api,Flink Streaming,Kafka Producer Api,我想从套接字中获取数据,并将其放到卡夫卡主题中,这样我的flink程序就可以从该主题中读取数据并对其进行处理。我可以在一个节点上完成。但我想要一个kafka集群,它至少有三个不同的节点不同的IP地址,并从套接字轮询数据以在节点之间分发。我不知道如何做到这一点,也不知道如何更改此代码。我的简单程序如下所示: public class WordCount { public static void main(String[] args) throws Exception { kafk

我想从套接字中获取数据,并将其放到卡夫卡主题中,这样我的flink程序就可以从该主题中读取数据并对其进行处理。我可以在一个节点上完成。但我想要一个kafka集群,它至少有三个不同的节点不同的IP地址,并从套接字轮询数据以在节点之间分发。我不知道如何做到这一点,也不知道如何更改此代码。我的简单程序如下所示:

public class WordCount {

   public static void main(String[] args) throws Exception {

    kafka_test objKafka=new kafka_test();
  // Checking input parameters
    final ParameterTool params = ParameterTool.fromArgs(args);
    int myport = 9999;
    String hostname = "localhost";
 // set up the execution environment
    final StreamExecutionEnvironment env = 
  StreamExecutionEnvironment.getExecutionEnvironment();


 // make parameters available in the web interface
    env.getConfig().setGlobalJobParameters(params);

    DataStream<String> stream = env.socketTextStream(hostname,myport);

    stream.addSink(objKafka.createStringProducer("testFlink", 
    "localhost:9092"));

    DataStream<String> text = 
    env.addSource(objKafka.createStringConsumerForTopic("testFlink", 
    "localhost:9092", "test"));
    DataStream<Tuple2<String, Long>> counts = text
     .flatMap(new FlatMapFunction<String, Tuple2<String, Long>>() {
                @Override
public void flatMap(String value, Collector<Tuple2<String, Long>> out) 
   {
          // normalize and split the line
             String[] words = value.toLowerCase().split("\\W+");

                    // emit the pairs
             for (String word : words) {
                  if (!word.isEmpty()) {
                     out.collect(new Tuple2<String, Long>(word, 1L));
                        }
                    }
                }
            })
            .keyBy(0)
            .timeWindow(Time.seconds(5))
            .sum(1);
          // emit result
        if (params.has("output")) {
           counts.writeAsText(params.get("output"));
          } else {
          System.out.println("Printing result to stdout. Use --output 
          to specify output path.");
          counts.print();
         }
    // execute program
    env.execute("Streaming WordCount");

    }//main
   }

  public class kafka_test {
  public FlinkKafkaConsumer<String> createStringConsumerForTopic(
        String topic, String kafkaAddress, String kafkaGroup) {
  //        ************************** KAFKA Properties ******        
     Properties props = new Properties();
    props.setProperty("bootstrap.servers", kafkaAddress);
    props.setProperty("group.id", kafkaGroup);
    FlinkKafkaConsumer<String> myconsumer = new FlinkKafkaConsumer<>(
            topic, new SimpleStringSchema(), props);
    myconsumer.setStartFromLatest();     

    return myconsumer;
  }

  public FlinkKafkaProducer<String> createStringProducer(
        String topic, String kafkaAddress) {

        return new FlinkKafkaProducer<>(kafkaAddress,
            topic, new SimpleStringSchema());
     }
  }
您能指导我如何在不同的kafka节点之间广播套接字流数据吗


任何帮助都将不胜感激

我认为你的代码是正确的。卡夫卡将负责数据的分发。如何在Kafka代理之间分发数据将取决于主题配置

检查答案以更好地理解卡夫卡主题和分区

假设你有3个卡夫卡经纪人。然后,如果您使用3个副本和3个分区创建主题

> bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 3 --partitions 3 --topic my-topic
这将导致您的主题将有3个分区,每个分区将在集群中存储3次。有了3个代理,您将在每个代理上存储1个分区和2个副本

然后你只需要创建你的卡夫卡水槽

FlinkKafkaProducer011<String> myProducer = new FlinkKafkaProducer011<String>(
        "broker1:9092,broker2:9092,broker3:9092",
        "my-topic",
        new SimpleStringSchema());

stream.addSink(myProducer);

亲爱的@belbo谢谢你的回答。但是假设我有三个具有不同IP地址的代理。那么,数据是如何在代理之间分布的呢?请你告诉我,如果我必须使用你的代码,这是上面所有的经纪人?不是在经纪人。您有两个集群。卡夫卡集群-这将由多个代理组成,每个代理具有不同的IP。然后是Flink群集—由具有不同IP的多个节点/服务器组成。我上面粘贴的代码是为您的Flink作业编写的,它将在Flink集群上运行。此作业将创建卡夫卡制作人,其IP为卡夫卡经纪人broker1:9092、broker2:9092、broker3:9092,并将在这些卡夫卡经纪人之间分发数据。亲爱的@belbo,很抱歉打扰您。事实上,我使用这个命令cat file.CSV | nc-lk 9999将我的数据从一个CSV文件传输到套接字9999。如果我将数据发送到所有代理IP的端口9999,则每个代理都可能获得相同的数据。如何将所有数据分发给三个代理?你能告诉我Flink master node是否为我做了这些吗?感谢您的帮助。您希望在Flink节点之间分发数据,而不是在Kafka代理之间分发数据。我有点困惑,因为nc-lk意味着您将监听数据,而不是发送数据。无论如何,要实现您所需要的,我想,您需要在netcat和Flink节点之间放置某种负载平衡器,负责在Flink实例之间分发数据,或者编写一个shell脚本,负责将不同的文件行发送到不同的Flink节点。但对于生产使用,我建议使用更健壮的工具—可能是ApacheNIFI或其他工具。您不必做任何事情来在Kafka代理之间分发数据。卡夫卡制作人,这是你弗林克工作的一部分,会处理好的。数据的分发方式取决于您将要编写的主题的分区数量。