Scala流处理框架选型指南:Apache Kafka vs Akka Streams vs Apache Flink

第一章:Scala流处理技术概述

Scala作为一种融合了面向对象与函数式编程特性的语言,在现代流处理系统中扮演着关键角色。其强大的类型系统、高阶函数支持以及与Java生态的无缝集成,使其成为构建高性能、可扩展流处理应用的理想选择。随着实时数据处理需求的增长,基于Scala的流处理框架如Apache Spark Streaming、Akka Streams和FS2等被广泛采用。

核心特性与优势

  • 函数式编程支持:不可变数据结构与纯函数提升代码可测试性与并发安全性
  • Actor模型集成:通过Akka实现高并发、分布式的流消息处理
  • 响应式流兼容:支持背压机制,保障系统在高压下的稳定性

典型流处理代码示例

// 使用Akka Streams进行字符串流转换
import akka.actor.ActorSystem
import akka.stream.{ActorMaterializer, OverflowStrategy}
import akka.stream.scaladsl.Source

implicit val system = ActorSystem("stream-system")
implicit val materializer = ActorMaterializer()

Source(1 to 5)
  .map(_.toString)                    // 将整数映射为字符串
  .throttle(1, per = scala.concurrent.duration.Second) // 控制每秒输出一个元素
  .runForeach(println)                // 打印每个元素
// 输出: "1", "2", "3", "4", "5"(每秒一行)

主流框架对比

框架执行模型背压支持适用场景
Spark Streaming微批处理内置大规模批流统一处理
Akka Streams逐元素流式响应式流标准低延迟实时管道
FS2函数式流纯函数式背压资源安全的函数式应用
graph LR A[数据源] --> B{流处理器} B --> C[转换] B --> D[过滤] B --> E[聚合] C --> F[输出流] D --> F E --> F F --> G[数据库/Kafka]

第二章:Apache Kafka核心机制与应用实践

2.1 Kafka架构原理与消息模型解析

Kafka采用分布式发布-订阅消息模型,核心由生产者、消费者、Broker、Topic和ZooKeeper协同工作。每个Topic被划分为多个Partition,分布于不同Broker,实现水平扩展与高吞吐。
消息存储与分区机制
每个Partition为一个有序、不可变的消息序列,消息通过offset唯一标识。Producer将消息追加至指定Partition,Consumer按序拉取。
组件职责
Broker负责消息存储与传输
ZooKeeper管理集群元数据与协调
Producer发布消息到指定Topic
Consumer Group实现消息的并行消费
副本与容错机制
Kafka通过ISR(In-Sync Replicas)机制保障数据一致性。Leader副本处理读写请求,Follower异步同步数据。

# 查看Topic分区状态
kafka-topics.sh --describe --topic user-events --bootstrap-server localhost:9092
该命令用于查看指定Topic的分区分布、Leader位置及ISR列表,是运维排查的基础工具。

2.2 使用Kafka Streams进行轻量级流处理

Kafka Streams 是一个用于构建实时流处理应用的轻量级客户端库,直接嵌入在Java应用中,无需额外部署运行时组件。
核心概念与编程模型
它基于Kafka构建,使用简单的DSL或Processor API实现数据流的转换、聚合与连接。流处理逻辑以拓扑(Topology)形式组织,输入输出均为Kafka主题。
StreamsBuilder builder = new StreamsBuilder();
KStream<String, String> source = builder.stream("input-topic");
source.mapValues(value -> value.toUpperCase())
      .to("output-topic");

Topology topology = builder.build();
KafkaStreams streams = new KafkaStreams(topology, config);
streams.start();
上述代码定义了一个将输入消息转为大写的流处理任务。`mapValues` 对每条记录的值进行转换,最终写入输出主题。`KafkaStreams` 实例负责启动和管理流处理线程。
优势与适用场景
  • 低延迟:直接在应用内处理,避免网络开销
  • 弹性伸缩:支持多实例并行,通过消费者组机制自动负载均衡
  • 精确一次语义:借助Kafka事务机制保障处理一致性

2.3 基于Kafka Connect的数据源集成实战

在构建现代数据管道时,Kafka Connect 提供了可扩展、可靠的方式将外部系统与 Kafka 集成。通过预定义的 Source 和 Sink 连接器,可实现数据库、文件系统、云服务等数据源的自动化同步。
连接器配置示例
以 MySQL 作为数据源为例,使用 Debezium MySQL Source Connector 实现变更数据捕获(CDC):
{
  "name": "mysql-source-connector",
  "config": {
    "connector.class": "io.debezium.connector.mysql.MySqlConnector",
    "database.hostname": "localhost",
    "database.port": "3306",
    "database.user": "kafka",
    "database.password": "password",
    "database.server.id": "184054",
    "database.server.name": "dbserver1",
    "database.include.list": "inventory",
    "table.include.list": "inventory.customers",
    "database.history.kafka.bootstrap.servers": "kafka:9092",
    "database.history.kafka.topic": "schema-changes.inventory"
  }
}
上述配置中,database.server.name 定义了逻辑服务器名称,用于生成主题前缀;table.include.list 指定需监控的具体表;配合 Kafka Connect 的分布式模式,该配置提交后将自动触发 binlog 监听,实现实时数据抽取。
核心优势与部署建议
  • 无需编写代码即可接入多种数据源
  • 支持 Exactly-Once 语义保障数据一致性
  • 横向扩展能力强,适用于大规模数据集成场景

2.4 Kafka流处理中的容错与一致性保障

在Kafka流处理中,容错与一致性依赖于分布式日志的特性与精确一次(exactly-once)语义的支持。通过启用幂等生产者和事务机制,Kafka可确保消息在故障恢复后不丢失且不重复。
精确一次处理配置
props.put("enable.idempotence", true);
props.put("transactional.id", "tx-1");
producer.initTransactions();
上述配置启用幂等性防止重复发送,结合事务ID实现跨分区原子写入。调用initTransactions()后,可通过beginTransaction()commitTransaction()控制事务边界。
状态存储与恢复
Kafka Streams使用Changelog Topic持久化状态,故障时通过重放日志重建本地Store。此机制保证了状态操作的一致性与高可用。
  • 副本同步确保数据冗余
  • 消费者组再平衡支持故障转移

2.5 实时日志处理场景下的Kafka应用案例

在大规模分布式系统中,实时日志处理是保障系统可观测性的关键环节。Kafka凭借高吞吐、低延迟和可扩展的特性,成为日志收集与传输的核心组件。
架构设计模式
典型架构中,应用服务器通过Logstash或Fluentd将日志发送至Kafka主题,消费者组实现日志的并行消费,供监控、分析与存储系统使用。
  • 生产者:日志代理(如Filebeat)按Topic分类推送日志
  • Broker:Kafka集群持久化日志流,支持多副本容错
  • 消费者:Flink或Spark Streaming实时处理,写入Elasticsearch或数据湖
// Kafka生产者配置示例:发送日志消息
Properties props = new Properties();
props.put("bootstrap.servers", "kafka-broker1:9092");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("acks", "1"); // 平衡性能与可靠性
props.put("retries", 3);

Producer<String, String> producer = new KafkaProducer<>(props);
ProducerRecord<String, String> record = new ProducerRecord<>("logs-topic", logMessage);
producer.send(record);
上述代码配置了Kafka生产者,将日志写入logs-topic主题。acks=1确保 leader 写入即确认,兼顾性能与可靠性,适用于大多数日志场景。

第三章:Akka Streams响应式流处理详解

3.1 Akka Streams背压机制与流控模型

Akka Streams 的背压机制是响应式流的核心,它通过异步非阻塞的方式实现下游对上游的数据请求控制,防止数据生产过快导致系统崩溃。
背压的传递机制
当消费者处理速度低于生产者时,背压信号会沿流反向传播,上游根据反馈动态调整发送速率。这种“按需拉取”模式保障了系统的稳定性与资源利用率。
代码示例:带背压的流处理
Source(1 to 1000)
  .throttle(10, 1.second)
  .map(x => s"Processing $x")
  .runWith(Sink.foreach(println))
该代码每秒最多处理10个元素,throttle算子显式引入流控,模拟慢速消费者场景。背压在此过程中自动触发,确保内存不溢出。
  • 响应式流遵循发布-订阅协议
  • 背压基于异步拉取(pull-based)策略
  • 所有操作符默认支持背压语义

3.2 构建高并发数据处理流水线实践

在高并发场景下,构建高效的数据处理流水线是保障系统吞吐量与稳定性的关键。通过异步化、批处理与背压机制的结合,可显著提升数据流转效率。
数据同步机制
采用消息队列解耦生产者与消费者,Kafka 作为核心中间件支持百万级 QPS。以下为 Go 消费者组示例:
consumer, err := kafka.NewConsumer(&kafka.ConfigMap{
    "bootstrap.servers": "localhost:9092",
    "group.id":          "process-group",
    "auto.offset.reset": "earliest",
})
if err != nil {
    log.Fatal(err)
}
该配置确保消费者组从最早位点消费,避免数据丢失;group.id 实现负载均衡,多个实例共享分区。
批处理与限流策略
  • 每批次处理 1000 条消息,降低 I/O 频次
  • 使用令牌桶算法控制写入速率,防止下游过载
  • 引入 circuit breaker 应对临时性故障

3.3 错误恢复策略与阶段生命周期管理

在分布式任务调度系统中,错误恢复策略与阶段生命周期管理是保障系统可靠性的核心机制。每个执行阶段应具备明确的状态定义,包括待启动、运行中、暂停、失败和完成。
状态转换与重试机制
系统采用有限状态机管理阶段生命周期,支持自动重试与人工干预恢复。对于可重试错误,通过指数退避策略进行恢复尝试:
// 重试逻辑示例
func WithRetry(attempts int, delay time.Duration) error {
    var err error
    for i := 0; i < attempts; i++ {
        err = operation()
        if err == nil {
            return nil
        }
        time.Sleep(delay)
        delay *= 2 // 指数退避
    }
    return fmt.Errorf("操作失败,已重试%d次", attempts)
}
该代码实现基础的重试控制,attempts 控制最大尝试次数,delay 初始间隔,每次失败后延迟翻倍,避免服务雪崩。
恢复策略分类
  • 自动恢复:网络抖动、临时超时等瞬态故障
  • 手动恢复:数据不一致、配置错误需人工介入
  • 跳过阶段:非关键路径故障且允许降级

第四章:Apache Flink流计算引擎深度剖析

4.1 Flink运行时架构与事件时间处理机制

Flink运行时由JobManager、TaskManager和Client构成,JobManager负责协调调度,TaskManager执行具体任务,Client提交作业。核心优势之一是精确的事件时间(Event Time)处理能力。
事件时间与水位线机制
Flink通过Watermark处理乱序事件,允许延迟数据在限定范围内被正确计算:
DataStream<Event> stream = env.addSource(new EventSource());
stream.assignTimestampsAndWatermarks(
    WatermarkStrategy.forBoundedOutOfOrderness(Duration.ofSeconds(5))
        .withTimestampAssigner((event, timestamp) -> event.getTimestamp())
);
上述代码为数据流分配时间戳与水位线,其中`Duration.ofSeconds(5)`表示最大乱序容忍时间为5秒。
窗口计算与触发策略
基于事件时间的窗口可确保结果一致性:
  • 滚动窗口:固定时间间隔划分
  • 滑动窗口:支持重叠时间段分析
  • 会话窗口:基于活动间隙自动合并

4.2 状态管理与精确一次语义实现原理

在流处理系统中,状态管理是实现精确一次(Exactly-Once)语义的核心。系统通过检查点(Checkpointing)机制周期性地持久化任务状态,确保故障恢复后能回滚到一致状态。
状态后端类型
  • MemoryStateBackend:适用于测试环境,状态存储在JVM堆内存;
  • FileSystemStateBackend:支持大状态持久化到分布式文件系统;
  • RocksDBStateBackend:本地磁盘+异步上传,适合超大规模状态。
两阶段提交协议
为保障端到端精确一次,Flink与外部系统(如Kafka)协同使用两阶段提交:
// 实现TwoPhaseCommitSinkFunction
public class ExactlyOnceSink extends TwoPhaseCommitSinkFunction {
    @Override
    protected void invoke(TransactionHandle transaction, String value) {
        // 预提交阶段写入事务日志
    }

    @Override
    protected TransactionHandle beginTransaction() {
        return kafkaProducer.beginTransaction();
    }
}
上述代码中,beginTransaction开启事务,invoke进行预提交,仅当检查点成功时才触发commit,否则回滚。

4.3 基于Flink SQL的实时分析应用开发

流式数据表定义
在Flink SQL中,通过DDL语句将Kafka等消息队列定义为数据源表,实现流数据的结构化访问。例如:
CREATE TABLE user_behavior (
    user_id BIGINT,
    item_id BIGINT,
    behavior STRING,
    ts TIMESTAMP(3),
    WATERMARK FOR ts AS ts - INTERVAL '5' SECOND
) WITH (
    'connector' = 'kafka',
    'topic' = 'user_behavior_log',
    'properties.bootstrap.servers' = 'localhost:9092',
    'format' = 'json'
);
该定义声明了用户行为日志的结构,并设置水印以处理乱序事件,保障窗口计算的准确性。
实时聚合查询
利用Flink SQL的窗口函数,可对实时数据进行分钟级统计分析:
  • 滚动窗口(TUMBLE)用于固定时间区间统计
  • 滑动窗口(HOP)支持重叠时间段分析
  • 会话窗口(SESSION)识别用户行为会话
典型查询如每分钟订单量统计,便于即时监控业务动态。

4.4 大规模状态流作业的性能调优实践

在处理大规模状态流作业时,状态后端选择与资源配置直接影响系统吞吐与延迟。Flink 提供了多种状态后端配置,可根据场景灵活调整。
合理选择状态后端
对于超大规模状态,建议使用 RocksDBStateBackend,其支持异步快照和增量检查点:
env.setStateBackend(new RocksDBStateBackend("hdfs://checkpoint-dir"));
env.enableCheckpointing(10000);
该配置将状态持久化至分布式文件系统,避免 JVM 堆内存溢出,同时通过异步机制减少对主流程干扰。
并行度与资源调优
通过调整算子并行度与 TaskManager 资源配比,可显著提升处理能力。常见资源配置如下:
TaskManager 数量Slot 数堆内存 (GB)推荐场景
4816中等负载
81232高吞吐作业

第五章:框架选型对比与未来趋势

主流前端框架性能实测对比
在真实项目中,React、Vue 与 Svelte 的首屏渲染表现差异显著。以一个包含 1000 行数据的表格组件为例,其初始加载耗时如下:
框架首屏时间 (ms)包体积 (KB)重渲染延迟
React 18 + Suspense320145中等
Vue 3 + Composition API26098
Svelte 418043极低
服务端集成模式演进
现代应用趋向于将框架能力下沉至构建层。SvelteKit 和 Next.js 的编译时优化大幅减少运行时开销。以下为 Svelte 中零运行时组件的写法示例:

<script>
  let count = 0;
  const increment = () => count += 1;
</script>

<button on:click={increment}>
  点击了 {count} 次
</button>
该模式在构建阶段被完全转换为原生 DOM 操作,最终输出无框架依赖的 JavaScript。
微前端架构下的框架共存策略
在大型系统中,通过 Module Federation 实现 React 与 Vue 组件动态加载已成为标准实践。关键配置如下:
  • 使用 Webpack 5 的 ModuleFederationPlugin 暴露远程组件
  • 通过自定义事件总线实现跨框架通信
  • 统一采用 Web Components 封装公共 UI 模块
架构图示意:

Shell App → 动态加载 → [React 微应用 | Vue 微应用 | Static Widget]

状态同步通过全局 Redux Store 快照 + CustomEvent 触发

D:\software\develop\java\jdk-1.8\jdk-1.8\bin\java.exe "-javaagent:D:\software\develop\ideal\IntelliJ IDEA 2022.1.3\lib\idea_rt.jar=61865:D:\software\develop\ideal\IntelliJ IDEA 2022.1.3\bin" -Dfile.encoding=UTF-8 -classpath D:\software\develop\java\jdk-1.8\jdk-1.8\jre\lib\charsets.jar;D:\software\develop\java\jdk-1.8\jdk-1.8\jre\lib\deploy.jar;D:\software\develop\java\jdk-1.8\jdk-1.8\jre\lib\ext\access-bridge-64.jar;D:\software\develop\java\jdk-1.8\jdk-1.8\jre\lib\ext\cldrdata.jar;D:\software\develop\java\jdk-1.8\jdk-1.8\jre\lib\ext\dnsns.jar;D:\software\develop\java\jdk-1.8\jdk-1.8\jre\lib\ext\jaccess.jar;D:\software\develop\java\jdk-1.8\jdk-1.8\jre\lib\ext\jfxrt.jar;D:\software\develop\java\jdk-1.8\jdk-1.8\jre\lib\ext\localedata.jar;D:\software\develop\java\jdk-1.8\jdk-1.8\jre\lib\ext\nashorn.jar;D:\software\develop\java\jdk-1.8\jdk-1.8\jre\lib\ext\sunec.jar;D:\software\develop\java\jdk-1.8\jdk-1.8\jre\lib\ext\sunjce_provider.jar;D:\software\develop\java\jdk-1.8\jdk-1.8\jre\lib\ext\sunmscapi.jar;D:\software\develop\java\jdk-1.8\jdk-1.8\jre\lib\ext\sunpkcs11.jar;D:\software\develop\java\jdk-1.8\jdk-1.8\jre\lib\ext\zipfs.jar;D:\software\develop\java\jdk-1.8\jdk-1.8\jre\lib\javaws.jar;D:\software\develop\java\jdk-1.8\jdk-1.8\jre\lib\jce.jar;D:\software\develop\java\jdk-1.8\jdk-1.8\jre\lib\jfr.jar;D:\software\develop\java\jdk-1.8\jdk-1.8\jre\lib\jfxswt.jar;D:\software\develop\java\jdk-1.8\jdk-1.8\jre\lib\jsse.jar;D:\software\develop\java\jdk-1.8\jdk-1.8\jre\lib\management-agent.jar;D:\software\develop\java\jdk-1.8\jdk-1.8\jre\lib\plugin.jar;D:\software\develop\java\jdk-1.8\jdk-1.8\jre\lib\resources.jar;D:\software\develop\java\jdk-1.8\jdk-1.8\jre\lib\rt.jar;D:\workspace\UserBehaviorAnalysis\HotItemsAnalysis\target\classes;D:\software\develop\Apache\maven-repository\org\apache\flink\flink-table-planner-blink_2.12\1.10.1\flink-table-planner-blink_2.12-1.10.1.jar;D:\software\develop\Apache\maven-repository\org\apache\flink\flink-table-common\1.10.1\flink-table-common-1.10.1.jar;D:\software\develop\Apache\maven-repository\org\apache\flink\flink-table-api-java\1.10.1\flink-table-api-java-1.10.1.jar;D:\software\develop\Apache\maven-repository\org\apache\flink\flink-table-api-scala_2.12\1.10.1\flink-table-api-scala_2.12-1.10.1.jar;D:\software\develop\Apache\maven-repository\org\scala-lang\scala-compiler\2.12.7\scala-compiler-2.12.7.jar;D:\software\develop\Apache\maven-repository\org\scala-lang\modules\scala-xml_2.12\1.0.6\scala-xml_2.12-1.0.6.jar;D:\software\develop\Apache\maven-repository\org\apache\flink\flink-table-api-java-bridge_2.12\1.10.1\flink-table-api-java-bridge_2.12-1.10.1.jar;D:\software\develop\Apache\maven-repository\org\apache\flink\flink-table-api-scala-bridge_2.12\1.10.1\flink-table-api-scala-bridge_2.12-1.10.1.jar;D:\software\develop\Apache\maven-repository\org\apache\flink\flink-scala_2.12\1.10.1\flink-scala_2.12-1.10.1.jar;D:\software\develop\Apache\maven-repository\org\apache\flink\flink-streaming-scala_2.12\1.10.1\flink-streaming-scala_2.12-1.10.1.jar;D:\software\develop\Apache\maven-repository\org\apache\flink\flink-table-runtime-blink_2.12\1.10.1\flink-table-runtime-blink_2.12-1.10.1.jar;D:\software\develop\Apache\maven-repository\org\codehaus\janino\janino\3.0.9\janino-3.0.9.jar;D:\software\develop\Apache\maven-repository\org\codehaus\janino\commons-compiler\3.0.9\commons-compiler-3.0.9.jar;D:\software\develop\Apache\maven-repository\org\apache\calcite\avatica\avatica-core\1.15.0\avatica-core-1.15.0.jar;D:\software\develop\Apache\maven-repository\org\reflections\reflections\0.9.10\reflections-0.9.10.jar;D:\software\develop\Apache\maven-repository\org\javassist\javassist\3.19.0-GA\javassist-3.19.0-GA.jar;D:\software\develop\Apache\maven-repository\org\slf4j\slf4j-api\1.7.15\slf4j-api-1.7.15.jar;D:\software\develop\Apache\maven-repository\com\google\code\findbugs\jsr305\1.3.9\jsr305-1.3.9.jar;D:\software\develop\Apache\maven-repository\org\apache\flink\force-shading\1.10.1\force-shading-1.10.1.jar;D:\software\develop\Apache\maven-repository\org\apache\flink\flink-java\1.10.1\flink-java-1.10.1.jar;D:\software\develop\Apache\maven-repository\org\apache\flink\flink-core\1.10.1\flink-core-1.10.1.jar;D:\software\develop\Apache\maven-repository\org\apache\flink\flink-annotations\1.10.1\flink-annotations-1.10.1.jar;D:\software\develop\Apache\maven-repository\org\apache\flink\flink-metrics-core\1.10.1\flink-metrics-core-1.10.1.jar;D:\software\develop\Apache\maven-repository\com\esotericsoftware\kryo\kryo\2.24.0\kryo-2.24.0.jar;D:\software\develop\Apache\maven-repository\com\esotericsoftware\minlog\minlog\1.2\minlog-1.2.jar;D:\software\develop\Apache\maven-repository\org\objenesis\objenesis\2.1\objenesis-2.1.jar;D:\software\develop\Apache\maven-repository\commons-collections\commons-collections\3.2.2\commons-collections-3.2.2.jar;D:\software\develop\Apache\maven-repository\org\apache\commons\commons-compress\1.18\commons-compress-1.18.jar;D:\software\develop\Apache\maven-repository\org\apache\flink\flink-shaded-asm-7\7.1-9.0\flink-shaded-asm-7-7.1-9.0.jar;D:\software\develop\Apache\maven-repository\org\apache\commons\commons-lang3\3.3.2\commons-lang3-3.3.2.jar;D:\software\develop\Apache\maven-repository\org\apache\commons\commons-math3\3.5\commons-math3-3.5.jar;D:\software\develop\Apache\maven-repository\org\apache\flink\flink-streaming-java_2.12\1.10.1\flink-streaming-java_2.12-1.10.1.jar;D:\software\develop\Apache\maven-repository\org\apache\flink\flink-runtime_2.12\1.10.1\flink-runtime_2.12-1.10.1.jar;D:\software\develop\Apache\maven-repository\org\apache\flink\flink-queryable-state-client-java\1.10.1\flink-queryable-state-client-java-1.10.1.jar;D:\software\develop\Apache\maven-repository\org\apache\flink\flink-hadoop-fs\1.10.1\flink-hadoop-fs-1.10.1.jar;D:\software\develop\Apache\maven-repository\commons-io\commons-io\2.4\commons-io-2.4.jar;D:\software\develop\Apache\maven-repository\org\apache\flink\flink-shaded-netty\4.1.39.Final-9.0\flink-shaded-netty-4.1.39.Final-9.0.jar;D:\software\develop\Apache\maven-repository\org\apache\flink\flink-shaded-jackson\2.10.1-9.0\flink-shaded-jackson-2.10.1-9.0.jar;D:\software\develop\Apache\maven-repository\commons-cli\commons-cli\1.3.1\commons-cli-1.3.1.jar;D:\software\develop\Apache\maven-repository\com\typesafe\akka\akka-actor_2.12\2.5.21\akka-actor_2.12-2.5.21.jar;D:\software\develop\Apache\maven-repository\com\typesafe\config\1.3.3\config-1.3.3.jar;D:\software\develop\Apache\maven-repository\org\scala-lang\modules\scala-java8-compat_2.12\0.8.0\scala-java8-compat_2.12-0.8.0.jar;D:\software\develop\Apache\maven-repository\com\typesafe\akka\akka-stream_2.12\2.5.21\akka-stream_2.12-2.5.21.jar;D:\software\develop\Apache\maven-repository\org\reactivestreams\reactive-streams\1.0.2\reactive-streams-1.0.2.jar;D:\software\develop\Apache\maven-repository\com\typesafe\ssl-config-core_2.12\0.3.7\ssl-config-core_2.12-0.3.7.jar;D:\software\develop\Apache\maven-repository\org\scala-lang\modules\scala-parser-combinators_2.12\1.1.1\scala-parser-combinators_2.12-1.1.1.jar;D:\software\develop\Apache\maven-repository\com\typesafe\akka\akka-protobuf_2.12\2.5.21\akka-protobuf_2.12-2.5.21.jar;D:\software\develop\Apache\maven-repository\com\typesafe\akka\akka-slf4j_2.12\2.5.21\akka-slf4j_2.12-2.5.21.jar;D:\software\develop\Apache\maven-repository\org\clapper\grizzled-slf4j_2.12\1.3.2\grizzled-slf4j_2.12-1.3.2.jar;D:\software\develop\Apache\maven-repository\com\github\scopt\scopt_2.12\3.5.0\scopt_2.12-3.5.0.jar;D:\software\develop\Apache\maven-repository\org\xerial\snappy\snappy-java\1.1.4\snappy-java-1.1.4.jar;D:\software\develop\Apache\maven-repository\com\twitter\chill_2.12\0.7.6\chill_2.12-0.7.6.jar;D:\software\develop\Apache\maven-repository\com\twitter\chill-java\0.7.6\chill-java-0.7.6.jar;D:\software\develop\Apache\maven-repository\org\lz4\lz4-java\1.5.0\lz4-java-1.5.0.jar;D:\software\develop\Apache\maven-repository\org\apache\flink\flink-clients_2.12\1.10.1\flink-clients_2.12-1.10.1.jar;D:\software\develop\Apache\maven-repository\org\apache\flink\flink-optimizer_2.12\1.10.1\flink-optimizer_2.12-1.10.1.jar;D:\software\develop\Apache\maven-repository\org\apache\flink\flink-shaded-guava\18.0-9.0\flink-shaded-guava-18.0-9.0.jar;D:\software\develop\Apache\maven-repository\org\apache\kafka\kafka_2.12\2.2.0\kafka_2.12-2.2.0.jar;D:\software\develop\Apache\maven-repository\org\apache\kafka\kafka-clients\2.2.0\kafka-clients-2.2.0.jar;D:\software\develop\Apache\maven-repository\com\github\luben\zstd-jni\1.3.8-1\zstd-jni-1.3.8-1.jar;D:\software\develop\Apache\maven-repository\com\fasterxml\jackson\core\jackson-databind\2.9.8\jackson-databind-2.9.8.jar;D:\software\develop\Apache\maven-repository\com\fasterxml\jackson\core\jackson-annotations\2.9.0\jackson-annotations-2.9.0.jar;D:\software\develop\Apache\maven-repository\com\fasterxml\jackson\core\jackson-core\2.9.8\jackson-core-2.9.8.jar;D:\software\develop\Apache\maven-repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.9.8\jackson-datatype-jdk8-2.9.8.jar;D:\software\develop\Apache\maven-repository\net\sf\jopt-simple\jopt-simple\5.0.4\jopt-simple-5.0.4.jar;D:\software\develop\Apache\maven-repository\com\yammer\metrics\metrics-core\2.2.0\metrics-core-2.2.0.jar;D:\software\develop\Apache\maven-repository\org\scala-lang\scala-library\2.12.8\scala-library-2.12.8.jar;D:\software\develop\Apache\maven-repository\org\scala-lang\scala-reflect\2.12.8\scala-reflect-2.12.8.jar;D:\software\develop\Apache\maven-repository\com\typesafe\scala-logging\scala-logging_2.12\3.9.0\scala-logging_2.12-3.9.0.jar;D:\software\develop\Apache\maven-repository\com\101tec\zkclient\0.11\zkclient-0.11.jar;D:\software\develop\Apache\maven-repository\org\apache\zookeeper\zookeeper\3.4.13\zookeeper-3.4.13.jar;D:\software\develop\Apache\maven-repository\org\apache\yetus\audience-annotations\0.5.0\audience-annotations-0.5.0.jar;D:\software\develop\Apache\maven-repository\org\apache\flink\flink-connector-kafka_2.12\1.10.1\flink-connector-kafka_2.12-1.10.1.jar;D:\software\develop\Apache\maven-repository\org\apache\flink\flink-connector-kafka-base_2.12\1.10.1\flink-connector-kafka-base_2.12-1.10.1.jar com.atguigu.hotitems_analysis.HotItems SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". SLF4J: Defaulting to no-operation (NOP) logger implementation SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details. Exception in thread "main" java.util.concurrent.ExecutionException: org.apache.flink.runtime.client.JobExecutionException: Job execution failed. at java.util.concurrent.CompletableFuture.reportGet(CompletableFuture.java:357) at java.util.concurrent.CompletableFuture.get(CompletableFuture.java:1908) at org.apache.flink.streaming.api.environment.StreamExecutionEnvironment.execute(StreamExecutionEnvironment.java:1640) at org.apache.flink.streaming.api.environment.LocalStreamEnvironment.execute(LocalStreamEnvironment.java:74) at org.apache.flink.streaming.api.environment.StreamExecutionEnvironment.execute(StreamExecutionEnvironment.java:1620) at com.atguigu.hotitems_analysis.HotItems.main(HotItems.java:89) Caused by: org.apache.flink.runtime.client.JobExecutionException: Job execution failed. at org.apache.flink.runtime.jobmaster.JobResult.toJobExecutionResult(JobResult.java:147) at org.apache.flink.client.program.PerJobMiniClusterFactory$PerJobMiniClusterJobClient.lambda$getJobExecutionResult$2(PerJobMiniClusterFactory.java:175) at java.util.concurrent.CompletableFuture.uniApply(CompletableFuture.java:616) at java.util.concurrent.CompletableFuture$UniApply.tryFire(CompletableFuture.java:591) at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:488) at java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:1975) at org.apache.flink.runtime.concurrent.FutureUtils$1.onComplete(FutureUtils.java:874) at akka.dispatch.OnComplete.internal(Future.scala:264) at akka.dispatch.OnComplete.internal(Future.scala:261) at akka.dispatch.japi$CallbackBridge.apply(Future.scala:191) at akka.dispatch.japi$CallbackBridge.apply(Future.scala:188) at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:64) at org.apache.flink.runtime.concurrent.Executors$DirectExecutionContext.execute(Executors.java:74) at scala.concurrent.impl.CallbackRunnable.executeWithValue(Promise.scala:72) at scala.concurrent.impl.Promise$DefaultPromise.$anonfun$tryComplete$1(Promise.scala:288) at scala.concurrent.impl.Promise$DefaultPromise.$anonfun$tryComplete$1$adapted(Promise.scala:288) at scala.concurrent.impl.Promise$DefaultPromise.tryComplete(Promise.scala:288) at akka.pattern.PromiseActorRef.$bang(AskSupport.scala:573) at akka.pattern.PipeToSupport$PipeableFuture$$anonfun$pipeTo$1.applyOrElse(PipeToSupport.scala:22) at akka.pattern.PipeToSupport$PipeableFuture$$anonfun$pipeTo$1.applyOrElse(PipeToSupport.scala:21) at scala.concurrent.Future.$anonfun$andThen$1(Future.scala:536) at scala.concurrent.impl.Promise.liftedTree1$1(Promise.scala:33) at scala.concurrent.impl.Promise.$anonfun$transform$1(Promise.scala:33) at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:64) at akka.dispatch.BatchingExecutor$AbstractBatch.processBatch(BatchingExecutor.scala:55) at akka.dispatch.BatchingExecutor$BlockableBatch.$anonfun$run$1(BatchingExecutor.scala:91) at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:23) at scala.concurrent.BlockContext$.withBlockContext(BlockContext.scala:85) at akka.dispatch.BatchingExecutor$BlockableBatch.run(BatchingExecutor.scala:91) at akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:40) at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(ForkJoinExecutorConfigurator.scala:44) at akka.dispatch.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) at akka.dispatch.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339) at akka.dispatch.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) at akka.dispatch.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107) Caused by: org.apache.flink.runtime.JobException: Recovery is suppressed by NoRestartBackoffTimeStrategy at org.apache.flink.runtime.executiongraph.failover.flip1.ExecutionFailureHandler.handleFailure(ExecutionFailureHandler.java:110) at org.apache.flink.runtime.executiongraph.failover.flip1.ExecutionFailureHandler.getFailureHandlingResult(ExecutionFailureHandler.java:76) at org.apache.flink.runtime.scheduler.DefaultScheduler.handleTaskFailure(DefaultScheduler.java:192) at org.apache.flink.runtime.scheduler.DefaultScheduler.maybeHandleTaskFailure(DefaultScheduler.java:186) at org.apache.flink.runtime.scheduler.DefaultScheduler.updateTaskExecutionStateInternal(DefaultScheduler.java:180) at org.apache.flink.runtime.scheduler.SchedulerBase.updateTaskExecutionState(SchedulerBase.java:496) at org.apache.flink.runtime.jobmaster.JobMaster.updateTaskExecutionState(JobMaster.java:380) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.flink.runtime.rpc.akka.AkkaRpcActor.handleRpcInvocation(AkkaRpcActor.java:284) at org.apache.flink.runtime.rpc.akka.AkkaRpcActor.handleRpcMessage(AkkaRpcActor.java:199) at org.apache.flink.runtime.rpc.akka.FencedAkkaRpcActor.handleRpcMessage(FencedAkkaRpcActor.java:74) at org.apache.flink.runtime.rpc.akka.AkkaRpcActor.handleMessage(AkkaRpcActor.java:152) at akka.japi.pf.UnitCaseStatement.apply(CaseStatements.scala:26) at akka.japi.pf.UnitCaseStatement.apply(CaseStatements.scala:21) at scala.PartialFunction.applyOrElse(PartialFunction.scala:127) at scala.PartialFunction.applyOrElse$(PartialFunction.scala:126) at akka.japi.pf.UnitCaseStatement.applyOrElse(CaseStatements.scala:21) at scala.PartialFunction$OrElse.applyOrElse(PartialFunction.scala:175) at scala.PartialFunction$OrElse.applyOrElse(PartialFunction.scala:176) at scala.PartialFunction$OrElse.applyOrElse(PartialFunction.scala:176) at akka.actor.Actor.aroundReceive(Actor.scala:517) at akka.actor.Actor.aroundReceive$(Actor.scala:515) at akka.actor.AbstractActor.aroundReceive(AbstractActor.scala:225) at akka.actor.ActorCell.receiveMessage(ActorCell.scala:592) at akka.actor.ActorCell.invoke(ActorCell.scala:561) at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:258) at akka.dispatch.Mailbox.run(Mailbox.scala:225) at akka.dispatch.Mailbox.exec(Mailbox.scala:235) ... 4 more Caused by: java.lang.IllegalStateException: No entry found for connection 3 at org.apache.kafka.clients.ClusterConnectionStates.nodeState(ClusterConnectionStates.java:339) at org.apache.kafka.clients.ClusterConnectionStates.disconnected(ClusterConnectionStates.java:143) at org.apache.kafka.clients.NetworkClient.initiateConnect(NetworkClient.java:926) at org.apache.kafka.clients.NetworkClient.ready(NetworkClient.java:287) at org.apache.kafka.clients.consumer.internals.ConsumerNetworkClient.trySend(ConsumerNetworkClient.java:474) at org.apache.kafka.clients.consumer.internals.ConsumerNetworkClient.poll(ConsumerNetworkClient.java:255) at org.apache.kafka.clients.consumer.internals.ConsumerNetworkClient.poll(ConsumerNetworkClient.java:236) at org.apache.kafka.clients.consumer.internals.ConsumerNetworkClient.poll(ConsumerNetworkClient.java:215) at org.apache.kafka.clients.consumer.internals.Fetcher.getTopicMetadata(Fetcher.java:292) at org.apache.kafka.clients.consumer.KafkaConsumer.partitionsFor(KafkaConsumer.java:1803) at org.apache.kafka.clients.consumer.KafkaConsumer.partitionsFor(KafkaConsumer.java:1771) at org.apache.flink.streaming.connectors.kafka.internal.KafkaPartitionDiscoverer.getAllPartitionsForTopics(KafkaPartitionDiscoverer.java:77) at org.apache.flink.streaming.connectors.kafka.internals.AbstractPartitionDiscoverer.discoverPartitions(AbstractPartitionDiscoverer.java:131) at org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumerBase.open(FlinkKafkaConsumerBase.java:511) at org.apache.flink.api.common.functions.util.FunctionUtils.openFunction(FunctionUtils.java:36) at org.apache.flink.streaming.api.operators.AbstractUdfStreamOperator.open(AbstractUdfStreamOperator.java:102) at org.apache.flink.streaming.runtime.tasks.StreamTask.initializeStateAndOpen(StreamTask.java:990) at org.apache.flink.streaming.runtime.tasks.StreamTask.lambda$beforeInvoke$0(StreamTask.java:453) at org.apache.flink.streaming.runtime.tasks.StreamTaskActionExecutor$SynchronizedStreamTaskActionExecutor.runThrowing(StreamTaskActionExecutor.java:94) at org.apache.flink.streaming.runtime.tasks.StreamTask.beforeInvoke(StreamTask.java:448) at org.apache.flink.streaming.runtime.tasks.StreamTask.invoke(StreamTask.java:460) at org.apache.flink.runtime.taskmanager.Task.doRun(Task.java:708) at org.apache.flink.runtime.taskmanager.Task.run(Task.java:533) at java.lang.Thread.run(Thread.java:750) Process finished with exit code 1
06-23
源码地址: https://pan.quark.cn/s/d1f41682e390 miyoubiAuto 米游社每日米游币自动化Python脚本(务必使用Python3) 8更新:更换cookie的获取地址 注意:禁止在B站、贴吧、或各大论坛大肆传播! 作者已退游,项目不维护了。 如果有能力的可以pr修复。 小引一波 推荐关注几个非常可爱有趣的女孩! 欢迎B站搜索: @嘉然今天吃什么 @向晚大魔王 @乃琳Queen @贝拉kira 第三方库 食用方法 下载源码 在Global.py中设置米游社Cookie 运行myb.py 本地第一次运行时会自动生产一个文件储存cookie,请勿删除 当前仅支持单个账号! 获取Cookie方法 浏览器无痕模式打开 http://user.mihoyo.com/ ,登录账号 按,打开,找到并点击 按刷新页面,按下图复制 Cookie: How to get mys cookie 当触发时,可尝试按关闭,然后再次刷新页面,最后复制 Cookie。 也可以使用另一种方法: 复制代码 浏览器无痕模式打开 http://user.mihoyo.com/ ,登录账号 按,打开,找到并点击 控制台粘贴代码并运行,获得类似的输出信息 部分即为所需复制的 Cookie,点击确定复制 部署方法--腾讯云函数版(推荐! ) 下载项目源码和压缩包 进入项目文件夹打开命令行执行以下命令 xxxxxxx为通过上面方式或取得米游社cookie 一定要用双引号包裹!! 例如: png 复制返回内容(包括括号) 例如: QQ截图20210505031552.png 登录腾讯云函数官网 选择函数服务-新建-自定义创建 函数名称随意-地区随意-运行环境Python3....
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值