Java 火花:从卡夫卡那里得到非常重要的信息

Java 火花:从卡夫卡那里得到非常重要的信息,java,apache-spark,apache-kafka,Java,Apache Spark,Apache Kafka,我正试图用卡夫卡的火花来接收非常重要的信息。 但spark似乎对可以阅读的信息的大小有一个限制。 我在kafka配置中进行了更改,以便能够使用和发送大消息,但这还不够(我认为这与spark有关,而不是与kafka有关),因为在使用kafka.consumer脚本时,显示消息内容没有任何问题 也许这与spark.streaming.kafka.consumer.cache.maxCapacity有关,但我不知道如何在基于spark java的程序中设置它 多谢各位 更新 我用它来连接卡夫卡,通常a

我正试图用卡夫卡的火花来接收非常重要的信息。 但spark似乎对可以阅读的信息的大小有一个限制。 我在kafka配置中进行了更改,以便能够使用和发送大消息,但这还不够(我认为这与spark有关,而不是与kafka有关),因为在使用kafka.consumer脚本时,显示消息内容没有任何问题

也许这与spark.streaming.kafka.consumer.cache.maxCapacity有关,但我不知道如何在基于spark java的程序中设置它

多谢各位

更新

我用它来连接卡夫卡,通常args[0]是zookeeper地址,args[1]是groupID

if (args.length < 4) {
        System.err.println("Usage: Stream Car data <zkQuorum> <group> <topics> <numThreads>");
        System.exit(1);
    }

    SparkConf sparkConf = new SparkConf().setAppName("stream cars data");

    final JavaSparkContext jSC = new JavaSparkContext(sparkConf);
    // Creer le contexte avec une taille de batch de 2 secondes
    JavaStreamingContext jssc = new JavaStreamingContext(jSC,new Duration(2000));

    int numThreads = Integer.parseInt(args[3]);

    Map<String, Integer> topicMap = new HashMap<>();
    String[] topics = args[2].split(",");

    for (String topic: topics) {
        topicMap.put(topic, numThreads);
    }

    JavaPairReceiverInputDStream<String, String> messages =
            KafkaUtils.createStream(jssc, args[0], args[1], topicMap);

    JavaDStream<String> data = messages.map(Tuple2::_2);

根据您使用的卡夫卡版本,您需要在卡夫卡配置文件中的
consumer.properties
文件中设置可用(或要创建)的以下使用者配置

对于0.8.X或更低版本

fetch.message.max.bytes
对于卡夫卡版本0.9.0或更高版本,设置

fetch.max.bytes 
根据您的应用程序选择适当的值

例如,
fetch.max.bytes=10485760


请参阅和。

因此我找到了解决问题的方法,事实上,正如我在评论中所说,配置文件中的文件只是示例,在说明服务器时没有考虑它们。因此,消费者的所有配置,包括
fetch.message.max.bytes
都需要在消费者代码中完成

我就是这样做的:

if (args.length < 4) {
        System.err.println("Usage: Stream Car data <zkQuorum> <group> <topics> <numThreads>");
        System.exit(1);
    }

    SparkConf sparkConf = new SparkConf().setAppName("stream cars data");

    final JavaSparkContext jSC = new JavaSparkContext(sparkConf);
    // Creer le contexte avec une taille de batch de 2 secondes
    JavaStreamingContext jssc = new JavaStreamingContext(jSC,new Duration(2000));

    int numThreads = Integer.parseInt(args[3]);

    Map<String, Integer> topicMap = new HashMap<>();
    String[] topics = args[2].split(",");

    for (String topic: topics) {
        topicMap.put(topic, numThreads);
    }



    Set<String> topicsSet = new HashSet<>(Arrays.asList(topics));
    Map<String, String> kafkaParams = new HashMap<>();
    kafkaParams.put("metadata.broker.list", args[0]);
    kafkaParams.put("group.id", args[1]);
    kafkaParams.put("zookeeper.connect", args[0]);
    kafkaParams.put("fetch.message.max.bytes", "1100000000");



    JavaPairReceiverInputDStream<String, String> messages=KafkaUtils.createStream(jssc,
            String.class,
            String.class,
            StringDecoder.class,
            StringDecoder.class,
            kafkaParams,
            topicMap,MEMORY_ONLY() );


    JavaDStream<String> data = messages.map(Tuple2::_2);
if(args.length<4){
System.err.println(“用法:流式车辆数据”);
系统出口(1);
}
SparkConf SparkConf=新的SparkConf().setAppName(“流式车辆数据”);
最终JavaSparkContext jSC=新的JavaSparkContext(sparkConf);
//Creer le contexte avec不需要2秒的批次
JavaStreamingContext jssc=新的JavaStreamingContext(jSC,新的持续时间(2000));
int numThreads=Integer.parseInt(args[3]);
Map topicMap=newhashmap();
字符串[]主题=args[2]。拆分(“,”;
for(字符串主题:主题){
put(主题,numThreads);
}
Set-topicsSet=newhashset(Arrays.asList(topics));
Map kafkaParams=新HashMap();
kafkaParams.put(“metadata.broker.list”,args[0]);
kafkaParams.put(“group.id”,args[1]);
kafkaParams.put(“zookeeper.connect”,args[0]);
kafkaParams.put(“fetch.message.max.bytes”,“1100000000”);
JavaPairReceiverInputStream消息=KafkaUtils.createStream(jssc,
String.class,
String.class,
StringDecoder.class,
StringDecoder.class,
卡夫卡帕拉姆斯,
topicMap,仅限内存();
JavaDStream data=messages.map(Tuple2::2);

您能否提供任何错误日志,帮助您声明“spark对可读取邮件的大小有限制”?此外,您是否使用spark streaming或结构化streaming从卡夫卡接收数据?您所说的spark streaming或结构化streaming是什么意思?我已经发布了代码,您可以从中找到答案。感谢您的帮助,请检查解决方案是否为您解决了问题!我已经定好了。但是我认为在配置文件中没有考虑这个文件。根据这个,这些文件只是示例
if (args.length < 4) {
        System.err.println("Usage: Stream Car data <zkQuorum> <group> <topics> <numThreads>");
        System.exit(1);
    }

    SparkConf sparkConf = new SparkConf().setAppName("stream cars data");

    final JavaSparkContext jSC = new JavaSparkContext(sparkConf);
    // Creer le contexte avec une taille de batch de 2 secondes
    JavaStreamingContext jssc = new JavaStreamingContext(jSC,new Duration(2000));

    int numThreads = Integer.parseInt(args[3]);

    Map<String, Integer> topicMap = new HashMap<>();
    String[] topics = args[2].split(",");

    for (String topic: topics) {
        topicMap.put(topic, numThreads);
    }



    Set<String> topicsSet = new HashSet<>(Arrays.asList(topics));
    Map<String, String> kafkaParams = new HashMap<>();
    kafkaParams.put("metadata.broker.list", args[0]);
    kafkaParams.put("group.id", args[1]);
    kafkaParams.put("zookeeper.connect", args[0]);
    kafkaParams.put("fetch.message.max.bytes", "1100000000");



    JavaPairReceiverInputDStream<String, String> messages=KafkaUtils.createStream(jssc,
            String.class,
            String.class,
            StringDecoder.class,
            StringDecoder.class,
            kafkaParams,
            topicMap,MEMORY_ONLY() );


    JavaDStream<String> data = messages.map(Tuple2::_2);