Flink配置Yarn日志聚合、配置历史日志。

这篇具有很好参考价值的文章主要介绍了Flink配置Yarn日志聚合、配置历史日志。。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Flink配置Yarn日志聚合、配置历史日志

对于已经结束的yarn应用,flink进程已经退出无法提供webui服务。所以需要通过JobHistoryServer查看保留在yarn上的日志。
下面就给大家分享一下我在配置方面的经历吧。

1.yarn配置聚合日志

编辑:yarn-site.xml

说明: 开启后任务执行 “完毕” 后,才会上传日志至hdfs

查询:yarn logs -applicationId application_1546250639760_0055

配置

<!--
        配置20220402-开启日志聚合-开始
        说明:开启后任务执行 “完毕” 后,才会上传日志至hdfs
        查询命令:yarn logs -applicationId application_1546250639760_0055
    -->
    <property>
        <name>yarn.log-aggregation.retain-seconds</name>
        <value>10080</value>
        <description>日志存储时间</description>
    </property>
    <property>
        <name>yarn.log-aggregation-enable</name>
        <value>true</value>
        <description>是否启用日志聚集功能</description>
    </property>
    <property>
        <name>yarn.nodemanager.remote-app-log-dir</name>
        <value>/yarn</value>
        <description>当应用程序运行结束后,日志被转移到的HDFS目录(启用日志聚集功能时有效),如此便可通过appmaster UI查看作业的运行日志。</description>
    </property>
    <property>
        <name>yarn.nodemanager.remote-app-log-dir-suffix</name>
        <value>logs</value>
        <description>远程日志目录子目录名称(启用日志聚集功能时有效)</description>
    </property>
    <!-- 配置20220402-开启日志聚合-结束 -->
实验1:hadoop自带的wordcount实验。
#词频统计

#1.先vim创建一个文件,里面随便写点东西
#2.put到hafs上
#2.执行命令
hadoop jar  \
/usr/local/BigData/hadoop-3.0.0/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.0.0.jar wordcount \
/test1 \
/test2/o2 

现象:正常。

1.配置之前:运行 yarn log xxxxxxxx 看不到运行成长产生的日志。

1.1运行:

[hdfs@bigdata1 hadoop]$ hadoop jar  /usr/local/BigData/hadoop-3.0.0/share/hadoop/mapreduce/hadoop-mapred                                                                                                                uce-examples-3.0.0.jar wordcount /test1 /test2/o3
2022-04-02 01:33:47,691 INFO client.RMProxy: Connecting to ResourceManager at bigdata1/192.168.72.31:803                                                                                                                2
2022-04-02 01:33:48,229 INFO mapreduce.JobResourceUploader: Disabling Erasure Coding for path: /tmp/hado                                                                                                                op-yarn/staging/hdfs/.staging/job_1648877577075_0001
2022-04-02 01:33:48,445 INFO input.FileInputFormat: Total input files to process : 1
2022-04-02 01:33:48,519 INFO mapreduce.JobSubmitter: number of splits:1
2022-04-02 01:33:48,556 INFO Configuration.deprecation: yarn.resourcemanager.system-metrics-publisher.en                                                                                                                abled is deprecated. Instead, use yarn.system-metrics-publisher.enabled
2022-04-02 01:33:48,659 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1648877577075_0001
2022-04-02 01:33:48,661 INFO mapreduce.JobSubmitter: Executing with tokens: []
2022-04-02 01:33:48,843 INFO conf.Configuration: resource-types.xml not found
2022-04-02 01:33:48,844 INFO resource.ResourceUtils: Unable to find 'resource-types.xml'.
2022-04-02 01:33:49,261 INFO impl.YarnClientImpl: Submitted application application_1648877577075_0001
2022-04-02 01:33:49,300 INFO mapreduce.Job: The url to track the job: http://bigdata1:8088/proxy/applica                                                                                                                tion_1648877577075_0001/
2022-04-02 01:33:49,300 INFO mapreduce.Job: Running job: job_1648877577075_0001
2022-04-02 01:33:56,416 INFO mapreduce.Job: Job job_1648877577075_0001 running in uber mode : false
2022-04-02 01:33:56,417 INFO mapreduce.Job:  map 0% reduce 0%
2022-04-02 01:34:02,490 INFO mapreduce.Job:  map 100% reduce 0%
2022-04-02 01:34:08,529 INFO mapreduce.Job:  map 100% reduce 100%
2022-04-02 01:34:08,540 INFO mapreduce.Job: Job job_1648877577075_0001 completed successfully
2022-04-02 01:34:08,633 INFO mapreduce.Job: Counters: 53
        File System Counters
                FILE: Number of bytes read=1843
                FILE: Number of bytes written=417739
                FILE: Number of read operations=0
                FILE: Number of large read operations=0
                FILE: Number of write operations=0
                HDFS: Number of bytes read=2071
                HDFS: Number of bytes written=1386
                HDFS: Number of read operations=8
                HDFS: Number of large read operations=0
                HDFS: Number of write operations=2
        Job Counters
                Launched map tasks=1
                Launched reduce tasks=1
                Rack-local map tasks=1
                Total time spent by all maps in occupied slots (ms)=13196
                Total time spent by all reduces in occupied slots (ms)=28888
                Total time spent by all map tasks (ms)=3299
                Total time spent by all reduce tasks (ms)=3611
                Total vcore-milliseconds taken by all map tasks=3299
                Total vcore-milliseconds taken by all reduce tasks=3611
                Total megabyte-milliseconds taken by all map tasks=13512704
                Total megabyte-milliseconds taken by all reduce tasks=29581312
        Map-Reduce Framework
                Map input records=50
                Map output records=167
                Map output bytes=2346
                Map output materialized bytes=1843
                Input split bytes=97
                Combine input records=167
                Combine output records=113
                Reduce input groups=113
                Reduce shuffle bytes=1843
                Reduce input records=113
                Reduce output records=113
                Spilled Records=226
                Shuffled Maps =1
                Failed Shuffles=0
                Merged Map outputs=1
                GC time elapsed (ms)=100
                CPU time spent (ms)=1440
                Physical memory (bytes) snapshot=557318144
                Virtual memory (bytes) snapshot=13850431488
                Total committed heap usage (bytes)=390070272
                Peak Map Physical memory (bytes)=331268096
                Peak Map Virtual memory (bytes)=5254959104
                Peak Reduce Physical memory (bytes)=226050048
                Peak Reduce Virtual memory (bytes)=8595472384
        Shuffle Errors
                BAD_ID=0
                CONNECTION=0
                IO_ERROR=0
                WRONG_LENGTH=0
                WRONG_MAP=0
                WRONG_REDUCE=0
        File Input Format Counters
                Bytes Read=1974
        File Output Format Counters
                Bytes Written=1386

1.2执行查询命令:

[hdfs@bigdata1 hadoop]$ yarn logs -applicationId application_1648877577075_0001
2022-04-02 01:40:46,605 INFO client.RMProxy: Connecting to ResourceManager at bigdata1/192.168.72.31:803                                                                                                                2
File /yarn/hdfs/logs/application_1648877577075_0001 does not exist.

Can not find any log file matching the pattern: [ALL] for the application: application_1648877577075_000                                                                                                                1
Can not find the logs for the application: application_1648877577075_0001 with the appOwner: hdfs
[hdfs@bigdata1 hadoop]$ yarn logs -applicationId application_1648877577075_0002
2022-04-02 01:40:57,983 INFO client.RMProxy: Connecting to ResourceManager at bigdata1/192.168.72.31:803                                                                                                                2
Unable to get ApplicationState. Attempting to fetch logs directly from the filesystem.
Can not find the appOwner. Please specify the correct appOwner
Could not locate application logs for application_1648877577075_0002

2.配置之后:可以看到完整的运行日志

2.1运行:

[hdfs@bigdata1 hadoop]$ hadoop jar  /usr/local/BigData/hadoop-3.0.0/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.0.0.jar wordcount /test1 /test2/a1
2022-04-02 02:25:09,179 INFO client.RMProxy: Connecting to ResourceManager at bigdata1/192.168.72.31:8032
2022-04-02 02:25:09,718 INFO mapreduce.JobResourceUploader: Disabling Erasure Coding for path: /tmp/hadoop-yarn/staging/hdfs/.staging/job_1648879195625_0002
2022-04-02 02:25:09,936 INFO input.FileInputFormat: Total input files to process : 1
2022-04-02 02:25:10,009 INFO mapreduce.JobSubmitter: number of splits:1
2022-04-02 02:25:10,043 INFO Configuration.deprecation: yarn.resourcemanager.system-metrics-publisher.enabled is deprecated. Instead, use yarn.system-metrics-publisher.enabled
2022-04-02 02:25:10,144 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1648879195625_0002
2022-04-02 02:25:10,145 INFO mapreduce.JobSubmitter: Executing with tokens: []
2022-04-02 02:25:10,325 INFO conf.Configuration: resource-types.xml not found
2022-04-02 02:25:10,325 INFO resource.ResourceUtils: Unable to find 'resource-types.xml'.
2022-04-02 02:25:10,380 INFO impl.YarnClientImpl: Submitted application application_1648879195625_0002
2022-04-02 02:25:10,417 INFO mapreduce.Job: The url to track the job: http://bigdata1:8088/proxy/application_1648879195625_0002/
2022-04-02 02:25:10,417 INFO mapreduce.Job: Running job: job_1648879195625_0002
2022-04-02 02:25:17,508 INFO mapreduce.Job: Job job_1648879195625_0002 running in uber mode : false
2022-04-02 02:25:17,509 INFO mapreduce.Job:  map 0% reduce 0%
2022-04-02 02:25:23,575 INFO mapreduce.Job:  map 100% reduce 0%
2022-04-02 02:25:28,607 INFO mapreduce.Job:  map 100% reduce 100%
2022-04-02 02:25:28,616 INFO mapreduce.Job: Job job_1648879195625_0002 completed successfully
2022-04-02 02:25:28,707 INFO mapreduce.Job: Counters: 53
        File System Counters
                FILE: Number of bytes read=1843
                FILE: Number of bytes written=417711
                FILE: Number of read operations=0
                FILE: Number of large read operations=0
                FILE: Number of write operations=0
                HDFS: Number of bytes read=2071
                HDFS: Number of bytes written=1386
                HDFS: Number of read operations=8
                HDFS: Number of large read operations=0
                HDFS: Number of write operations=2
        Job Counters
                Launched map tasks=1
                Launched reduce tasks=1
                Data-local map tasks=1
                Total time spent by all maps in occupied slots (ms)=12876
                Total time spent by all reduces in occupied slots (ms)=21016
                Total time spent by all map tasks (ms)=3219
                Total time spent by all reduce tasks (ms)=2627
                Total vcore-milliseconds taken by all map tasks=3219
                Total vcore-milliseconds taken by all reduce tasks=2627
                Total megabyte-milliseconds taken by all map tasks=13185024
                Total megabyte-milliseconds taken by all reduce tasks=21520384
        Map-Reduce Framework
                Map input records=50
                Map output records=167
                Map output bytes=2346
                Map output materialized bytes=1843
                Input split bytes=97
                Combine input records=167
                Combine output records=113
                Reduce input groups=113
                Reduce shuffle bytes=1843
                Reduce input records=113
                Reduce output records=113
                Spilled Records=226
                Shuffled Maps =1
                Failed Shuffles=0
                Merged Map outputs=1
                GC time elapsed (ms)=97
                CPU time spent (ms)=1360
                Physical memory (bytes) snapshot=552706048
                Virtual memory (bytes) snapshot=13832036352
                Total committed heap usage (bytes)=391643136
                Peak Map Physical memory (bytes)=329871360
                Peak Map Virtual memory (bytes)=5243228160
                Peak Reduce Physical memory (bytes)=222834688
                Peak Reduce Virtual memory (bytes)=8588808192
        Shuffle Errors
                BAD_ID=0
                CONNECTION=0
                IO_ERROR=0
                WRONG_LENGTH=0
                WRONG_MAP=0
                WRONG_REDUCE=0
        File Input Format Counters
                Bytes Read=1974
        File Output Format Counters
                Bytes Written=1386

2.2执行查询命令

..................
非常多完整日志。

实验总结:

1)配置完就可以用 yarn logs -applicationId application_xxxxxxx 看到丰富的日志内容。
2)但是8088 web中的logs没法查看了,why?
	因为:没有配置历史服务,看下一节
实验2:flink on yarn 模式运行的时候,日志。
实验内容:
	flink job 消费kafka, 并且print()输出。
job配置:
	flink并行度:1	

首先启动job。 可以发现job运行的容器在cm2上。

Flink配置Yarn日志聚合、配置历史日志。

接下来可以看到 该job的一些日志,包括jm的和tm的。 tm的日志就是Stdout中看到的,并且刷新可以看到文件size在变大。

Flink配置Yarn日志聚合、配置历史日志。

再根据我们在yarn 上配置的容器日志位置可以看到日志保存在什么位置。下图可见是保存在各个节点的/yarn/container-logs下。

Flink配置Yarn日志聚合、配置历史日志。

我们到cm2的/yarn/container-logs 下看看。

Flink配置Yarn日志聚合、配置历史日志。

这个和 flink控制台显示的一模一样。

Flink配置Yarn日志聚合、配置历史日志。

当程序执行完毕或者cancel之后。容器日志被自动删除。为此有如下疑问1( 但是聚合日志在hdfs上正常有。)

Flink配置Yarn日志聚合、配置历史日志。

疑问1:如下配置不是设置日志在容器所在节点下的保存时间吗?

Flink配置Yarn日志聚合、配置历史日志。

疑问2:如果job是多个并行度怎么办?
如果是多个并行度。 那么‘总日志’ = 多个容器的日志合并。 也就是日志聚合的结果。
2.2 cdh上配置聚合日志(默认配置好的)

Flink配置Yarn日志聚合、配置历史日志。
Flink配置Yarn日志聚合、配置历史日志。
Flink配置Yarn日志聚合、配置历史日志。

#其中yarn.nodemanager.log-dirs 表示每个nodemanager上的容器产生的日志保存地址。
	但是日志聚合会把同一个job分散的日志进行聚合到hdfs.

Flink配置Yarn日志聚合、配置历史日志。

2.yarn配置历史日志
学习
https://blog.csdn.net/qq_38038143/article/details/88641288

https://blog.csdn.net/qq_35440040/article/details/84233655?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~aggregatepage~first_rank_ecpm_v1~rank_v31_ecpm-1-84233655.pc_agg_new_rank&utm_term=yarn%E5%8E%86%E5%8F%B2%E6%97%A5%E5%BF%97&spm=1000.2123.3001.4430

https://blog.csdn.net/duyenson/article/details/118994693

https://www.cnblogs.com/zwgblog/p/6079361.html

配置1:mapred-site.xml

<property>
	<name>mapreduce.jobhistory.address</name>
	<value>master:10020</value>
</property>
<property>
	<name>mapreduce.jobhistory.webapp.address</name>
	<value>master:19888</value>
</property>

配置2:yarn-site.xml

	<!--Spark Yarn-->
    <!-- 是否开启聚合日志 -->
    <property>
        <name>yarn.log-aggregation-enable</name>
        <value>true</value>
    </property>
    <!-- 配置日志服务器的地址,work节点使用 -->
    <property>
        <name>yarn.log.server.url</name>
        <value>http://master:19888/jobhistory/logs/</value>
    </property>
    <!-- 配置日志过期时间,单位秒 -->
    <property>
        <name>yarn.log-aggregation.retain-seconds</name>
        <value>86400</value>
    </property>

分发

启动: mr-jobhistory-daemon.sh start historyserver

jps
Flink配置Yarn日志聚合、配置历史日志。

查看日志:在8088端口点 id , 进去点log.

3.yarn配置历史日志plus->timelineservice

上聊天截图中大佬给的,他是hadoop 3.13,我当时是3.0.0 没配置成功。 以后再继续研究吧

yarn-site

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>bigdata1</value>
    </property>

    <property>
	    <name>yarn.resourcemanager.webapp.address</name>
	    <value>bigdata1:8088</value>
    </property>

    <property>
        <name>yarn.nodemanager.env-whitelist</name>
        <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
    </property>
    <property>
        <name>yarn.scheduler.minimum-allocation-mb</name>
        <value>512</value>
   </property>
    <property>
        <name>yarn.scheduler.maximum-allocation-mb</name>
        <value>4096</value>
    </property>
    <property>
        <name>yarn.nodemanager.resource.memory-mb</name>
        <value>30720</value>
    </property>
	<property>
        <name>yarn.scheduler.minimum-allocation-vcores</name>
        <value>1</value>
    </property>
    <property>
        <name>yarn.scheduler.maximum-allocation-vcores</name>
        <value>4</value>
    </property>
    <property>
        <name>yarn.nodemanager.resource.cpu-vcores</name>
        <value>12</value>
    </property> 
    <property>
        <name>yarn.nodemanager.pmem-check-enabled</name>
        <value>false</value>
    </property>
    <property>
        <name>yarn.nodemanager.vmem-check-enabled</name>
        <value>false</value>
    </property>
    <property>
        <name>yarn.log-aggregation-enable</name>
        <value>true</value>
    </property>
    <property>
        <name>yarn.log-aggregation.retain-seconds</name>
        <value>86400</value>
    </property>

    <property>
        <name>yarn.timeline-service.enabled</name>
        <value>true</value>
    </property>

    <property>
        <name>yarn.timeline-service.hostname</name>
        <value>${yarn.resourcemanager.hostname}</value>
    </property>

   <property>
        <name>yarn.timeline-service.address</name>
        <value>${yarn.timeline-service.hostname}:10020</value>
    </property>

    <property>
        <name>yarn.timeline-service.webapp.address</name>
        <value>${yarn.timeline-service.hostname}:8188</value>
    </property>

    <property>
        <name>yarn.log.server.url</name>
        <value>http://${yarn.timeline-service.webapp.address}/applicationhistory/logs</value>
    </property>

    <property>
        <name>yarn.timeline-service.ttl-enable</name>
        <value>true</value>
    </property>

    <property>
        <name>yarn.timeline-service.ttl-ms</name>
        <value>86400000</value>
    </property>

    <property>
        <name>yarn.timeline-service.http-cross-origin.enabled</name>
        <value>true</value>
    </property>

    <property>
        <name>yarn.resourcemanager.system-metrics-publisher.enabled</name>
        <value>true</value>
    </property>

   <property>
        <name>yarn.timeline-service.generic-application-history.enabled</name>
        <value>true</value>
    </property>

</configuration>

marped-site

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
    <property>
        <name>mapreduce.job.emit-timeline-data</name>
        <value>true</value>
    </property>
</configuration>

至此,大喊一声“优雅~”。文章来源地址https://www.toymoban.com/news/detail-496982.html

到了这里,关于Flink配置Yarn日志聚合、配置历史日志。的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • mysql8查看执行sql历史日志、慢sql历史日志,配置开启sql历史日志general_log、慢sql历史日志slow_query_log

    mysql8默认未开启 sql 历史日志。 mysql8默认已开启 慢sql 历史日志。 log_output : sql日志输出位置 FILE :输出到文件。默认值 TABLE :输出到表。 mysql.general_log mysql.slow_log general_log : sql历史 日志开关。默认为 OFF slow_query_log : 慢sql历史 日志开关。默认为 ON long_query_time : 慢sql历

    2024年02月14日
    浏览(60)
  • Flink日志文件配置详解

    Apache Flink是一个分布式流处理和批处理框架,它广泛应用于大规模数据处理和分析场景。在Flink的应用程序中,日志文件是非常重要的组成部分,可以帮助开发人员进行故障排查、性能优化和监控等操作。本文将详细介绍如何配置Flink的日志文件。 Flink日志文件的配置主要包括

    2024年02月05日
    浏览(43)
  • Flink、Yarn架构,以Flink on Yarn部署原理详解

    Apache Flink是一个开源的分布式流处理框架,它可以处理实时数据流和批处理数据。Flink的架构原理是其实现的基础,架构原理可以分为以下四个部分:JobManager、TaskManager、JobGraph、Checkpoint。 JobManager JobManager是Flink集群的控制节点,负责接收用户提交的任务,将任务分配给Task

    2024年02月12日
    浏览(40)
  • [Flink] Flink On Yarn(yarn-session.sh)启动错误

    在Flink上启动 yarn-session.sh时出现 The number of requested virtual cores for application master 1 exceeds the maximum number of virtual cores 0 available in the Yarn Cluster.错误。 版本说明: Hadoop: 3.3.4 Flink:1.17.1 在Flink On Yarn上启动 yarn-session.sh 时出现如下错误: 在yarn-site.xml文件中配置了所有可能相关的参

    2024年02月13日
    浏览(43)
  • Apache Flink连载(二十):Flink On Yarn运行 - Yarn Per-Job模式(弃用)

     🏡 个人主页:IT贫道-CSDN博客  🚩 私聊博主:私聊博主加WX好友,获取更多资料哦~  🔔 博主个人B栈地址:豹哥教你学编程的个人空间-豹哥教你学编程个人主页-哔哩哔哩视频 目录 1. 任务提交命令 2. 任务提交流程

    2024年01月20日
    浏览(41)
  • 基于Yarn搭建Flink

    1.1 Yarn 简介 Apache Hadoop YARN是一个资源提供程序,受到许多数据处理框架的欢迎。Flink服务被提交给 YARN 的 ResourceManager,后者再由 YARN NodeManager 管理的机器上生成容器。Flink 将其 JobManager 和 TaskManager 实例部署到此类容器中。 Flink 可以根据在 JobManager 上运行的作业所需的处理槽

    2024年02月04日
    浏览(41)
  • flink结合Yarn进行部署

    独立(Standalone)模式由 Flink 自身提供资源,无需其他框架,这种方式降低了和其他第三方资源框架的耦合性,独立性非常强。但我们知道, Flink 是大数据计算框架,不是资源调度框架 ,这并不是它的强项;所以还是应该让专业的框架做专业的事,和其他资源调度框架集成更

    2024年01月22日
    浏览(50)
  • flink on yarn 远程提交

    2024年02月10日
    浏览(52)
  • flink on yarn集群部署模式

    介绍 YARN 上部署的过程是:客户端把 Flink 应用提交给 Yarn 的ResourceManager, Yarn 的 ResourceManager 会向 Yarn 的 NodeManager 申请容器。在这些容器上,Flink 会部署JobManager 和 TaskManager 的实例,从而启动集群。Flink 会根据运行在 JobManger 上的作业所需要的 Slot 数量动态分配TaskManager 资源。

    2024年01月23日
    浏览(41)
  • flink on yarn 中的flink-conf.yaml参数

    在 Flink on YARN 中, flink-conf.yaml 是 Flink 配置文件,用于配置 Flink 应用程序在 YARN 上的运行。通过修改 flink-conf.yaml 文件中的参数,你可以调整 Flink 集群的行为和性能。以下是一些常见的在 flink-conf.yaml 中设置的参数: yarn.application.name : 指定 Flink 应用程序在 YARN 上的名称。

    2024年02月12日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包