自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(122)
  • 收藏
  • 关注

原创 csapp-01:从程序员的角度去了解计算机系统的工作原理

写在开头:本人非科班,之前没读过,只听说是本好书,硬着头皮花了四天时间通读了一遍,书上画得密密麻麻的,尤其是在虚拟内存这一章到处写满注解,只能说这本书的确不好读。一直想把学习的心得整理出来,有很多只是自己的理解,有不恰当的地方只能待后面多读几遍或有专业人士看到时及时指出并慢慢来修正了,谢谢你能来。 Preface 1、csapp是一门什么课程 独立的、贯穿整个计算机系统的基础课程: 注意它的三个关键词 独立:因为现代的计算机系统不断更新迭...

2021-02-08 18:24:03 871

原创 Spark技术内幕读书笔记:Spark核心——Shuffle与性能调优模块详解

————Spark技术内幕读书笔记———— 本书的三个核心:RDD实现详解 Scheduler:DAGScheduler任务切分调度与TaskScheduler任务执行调度计算过程详解 Shuffle:性能调优详解

2021-01-29 18:44:55 388

原创 Spark技术内幕读书笔记:Spark核心——DAGScheduler任务切分调度与TaskScheduler任务执行调度计算过程详解

————Spark技术内幕读书笔记———— Scheduler任务调度充分体现了与MapReduce完全不同的设计思想。任务调度——多个DAG与多个Task之间如何分配计算资源!Spark对于DAG与Task的实现以及不同执行阶段的划分和任务的提交执行,充分体现了其设计的优雅与高效! ————第四章 Scheduler模块详解———— 任务调度整体架构将用户提交的计算任务按照DAG划分不同的阶段的计算任务提交到集群进行最终的计算...

2021-01-29 02:59:23 991

原创 Spark技术内幕读书笔记:Spark核心——RDD实现详解

————Spark技术内幕读书笔记————深入解析内核架构设计与实现原理Spark究竟解决了什么问题?1.背景:在spark出现之前,hadoop的迅速发展,hadoop分布式集群,把编程简化为自动提供 位置感知性调度,容错,以及负载均衡的一种模式,用户就可以在普通的PC机上运行超大集群运算,hadoop有一个非常大的问题:hadoop是基于流处理的,hadoop会从(物理存储)hdfs中加载数据,然后处理之后再返回给物理存储hdfs中,这样不断的读取与写入,占用了大量的IO,后来hadoop出现

2021-01-28 22:11:30 401

原创 基础知识整理1:从HelloWorld开始理解javac前端编译过程

1、学习的方法——不在学多少在于融汇贯通知识点 新知识的层出不穷,越早建立起自己的知识体系越重要,建立知识体系的关键在于如何找到知道的原点去学习,有了一个大概的全局观以后,剩下的都是一些基础知识点的细化。如果把开发一个项目或解决一个特定场景的解决方案比作一个体的话:点:基础的知识,相关的语法:如计算机原理、操作系统原理、底层IO、JVM、语言的语法逻辑 线:相关的知识点,如反射、线程、网络编程、IO操作、分布式、sql优化、协议等原理性的知识等 面:各种层出不穷的解决方案与框架,如Spri..

2021-01-26 17:35:23 178

原创 扛住01 成事的方法——裸体战术

导致一个人走弯路的原因——缺少自我学习和自我 反省的能力!最重要的是在三个方面要用心: 读书:通过读书获得新知——>自我检讨——>自我校正——>自我进步 行走:增长见闻,到处行走。走别人没走过的路,经历别人没经历过的风雨,冒别人不能冒的风险,去别人不能到达的地方——>增加生命的宽度,启发自己对这个世界全面地思考。 与人交流:行万里路,不如阅人无数。就是说你跟什么人聊天挺重要。跟不同的人聊天,你会获得看待世界不同的视角与智慧。 ...

2021-01-22 23:21:03 134

原创 并发编程2:并发的问题:死锁——两段不同的逻辑都在等待对方的锁释放才能继续执行

1、什么是死锁死锁:即多个线程因竞争而造成一种互相等待的现象。简单一点说:一个资源每次只能被一个进程使用,而当正在占用这个资源的进程又需要去使用其它资源时正好处于阻塞状态,导致使用中的资源无法释放,请求的资源又处于无限等待中。如果所有代码都是我们自己开发的,不太会出现这样的情况,至少在不是太复杂的情景下应该不会刻意去设计一个死锁的代码,但如果调用了其它外部的api或一些共享的资源时,就不可避免的出现一些死锁的情况。如:一个线程T1持有锁R1并且申请获得锁R2,而另一个线程T2持有锁R2并

2021-01-22 14:09:12 390 1

原创 并发编程1:线程基础——create、setDaemon、join、interrupt、synchronized及综合应用案例完成一个多线程任务

1、为什么看源码可以开阔思维,提升架构设计能力?技术的东西单靠书本和自己思考是很难快速提升的,必须通过看源码,看别人如何设计,思考为何这样设计才可以领悟得到。能力的提升不在于你写了多少代码,做过多少项目,而是给你一个业务场景时,你是否能拿出几种靠谱的解决方案,并且说出各自的优缺点。怎么才能拿得出来?一来靠经验,二来靠归纳总结,而看源码可以快速增加你的经验。2、如何看源码?第一遍:了解并简单使用,知道这个模块的作用,再debug进去看一下调用的逻辑、具体实现、用到哪些类,最好能画出一个大致的架

2021-01-20 19:46:15 178 2

转载 jdk自带监控程序jvisualvm的使用

监控小程序的配置生产环境tomcat的配置编辑应用所在的tomcat服务器下的bin目录下的catalina.sh文件,修改如下:配置如下内容:export JAVA_OPTS="-Xms256m -Xmx512m -Xss256m -XX:PermSize=512m -XX:MaxPermSize=1024m-Djava.rmi.server.hostname=136.64.45.24 -Dcom.sun.management.jmxremote.port=9315 -Dcom.sun..

2021-01-19 15:00:46 758

原创 JVM指令手册

反汇编字节码:javap -c 字节码文件名 > 文本文件名局部变量0——this所有机器指令的执行都是在栈帧中入栈出栈完成的,局部变量表会随时负责进行变量创建,操作数入栈等工作一、未归类系列A此系列暂未归类。指令码 助记符 说明0x00 nop 什么都不做0x01 aconst_null 将null推送至栈顶二、const系列:压入操作数栈该系列命令主要负责把简单的数值类型送到栈顶。该系列命令不带参数。注意只把简单的数值类型送到操作数栈顶时,才使用如下的命令

2021-01-18 18:34:27 254

原创 hadoop 拾遗补缺(一) HDFS基础与客户端简单操作

1、HDFS特点:高容错性:允许集群中某些机器宕机影响正常的存储廉价性:对单台服务器要求不会太高,成本低安全性:一个数据有多个副本,即使某台机器宕机也不会造成数据丢失扩展性:集群可在工作状态下随时扩展增加容量元数据限制:为提升查找效率,它在namenode的内存中存储一份,在磁盘中也会存储一份备份,不要存储大量小文件,以免给namenode工作压力,且在分布式环境下,效率会非常低不可随机修改:在HDFS中文件不可以随机进行修改2、HDFS 存储:元数据基于内存存储,其数量局限于nameno

2021-01-03 23:27:46 183

转载 Spark调优:性能调优、JVM调优、shuffle调优、算子调优、troubleshooting调优、数据倾斜

目录 一、性能调优 1、分配资源 2、提高spark运行的并行度 3、重构RDD架构以及RDD持久化 4、使用广播变量 5、使用Kryo序列化 6、使用fastutil集合 7、调节数据本地化等待时长(s) 二、JVM调优 1、JVM调优:降低cache操作的内存占比 2、JVM调优:executor堆外内存与连接等待时长 三、shuffle性能调优 1、shuffle的原理 2、shuf...

2020-12-27 16:02:42 1314 1

原创 大数据运维存档(10)Kafka常识整理

一、kafka概述1.1、为什么有消息系统解耦允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束。冗余消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险。许多消息队列所采用的"插入-获取-删除"范式中,在把一个消息从队列中删除之前,需要你的处理系统明确的指出该消息已经被处理完毕,从而确保你的数据被安全的保存直到你使用完毕。扩展性因为消息队列解耦了你的处理过程,所以增大消息入队和处理的频率是很容易的,只要另外增加处理过程即可。灵活性 &

2020-12-27 13:18:50 211

原创 大数据运维存档(9)HBase常识整理

一、hbase是什么1.1、hbase的概念HBase基于Google的BigTable论文,是建立的HDFS之上,提供高可靠性、高性能、列存储、可伸缩、实时读写的分布式数据库系统。 在需要实时读写随机访问超大规模数据集时,可以使用HBase。1.2、hbase的特点海量存储 可以存储大批量的数据 列式存储 HBase表的数据是基于列族进行存储的,列族是在列的方向上的划分。 极易扩展 底层依赖HDFS,当磁盘空间不足的时候,只需要动态增加datanode节点就可以了

2020-12-27 13:15:33 226

原创 大数据运维存档(8)数仓构建与Hive实现常识整理、生产中调优

目录一、数仓基础1、数仓基本介绍1.1、数仓基本概念1.2、数仓的定义1.2.1、面向主题1.2.2、集成性1.2.3、稳定性1.2.4、时变性1.3、数据仓库与数据库的区别1.4、构建数仓常用手段1.5、数仓分层1.5.1、数仓分层描述1.5.2、为什么要进行数仓分层1.6、获取数据1.7、同步策略2、数据仓库建模2.1、范式建模法(Third Normal Form 3NF)2.2、维度建模法2.2.1、维度表2.2.2、事

2020-12-27 13:08:52 1546

原创 成长复盘(1)从技术到管理:能力与薪资、惩罚与体系化、学会提问与深度思考、努力让选择变成对的选择

一、 技术人员走管理的三个阶段(五年登上一个新台阶) 1、DO:做事、谋求个人能力的成长 执行 主要负责自己搞定一个事情 2、Manager:带团队 协调组织、让团队实现更大的价值 制定好团队的激励措施 3、业务决策 思考公司的业务发展,能站在公司的角度做决策,更像是一个创业者 二、上台阶的途径 1、多学...

2020-12-27 09:12:39 636 1

原创 大数据运维存档(7)ZooKeeper常识整理

一、什么是zookeeper是Google的Chubby的一个开源实现版 ZooKeeper 一个分布式的,开源的,用于分布式应用程序的协调服务(service) 主从架构 Zookeeper 作为一个分布式的服务框架 主要用来解决分布式集群中应用系统的一致性问题 它能提供基于类似于文件系统的目录节点树方式的数据存储, Zookeeper 作用主要是用来维护和监控存储的数据的状态变化,通过监控这些数据状态的变化,从而达到基于数据的集群管理 二、zookeeper初体验

2020-12-27 09:12:16 195

原创 大数据运维存档(6)YARN常识整理

Apache Hadoop YARN(Yet Another Resource Negotiator)是Hadoop的子项目,为分离Hadoop2.0资源管理和计算组件而引入 YRAN具有足够的通用性,可以支持其它的分布式计算模式一、YARN架构类似HDFS,YARN也是经典的主从(master/slave)架构YARN服务由一个ResourceManager(RM)和多个NodeManager(NM)构成 ResourceManager为主节点(master) NodeManager为

2020-12-26 14:06:24 184

原创 大数据运维平台治理

1、大数据平台面临问题及流程2、大数据平台深度监控场景及思路讨论2.1、整体架构2.2、HDFS画像2.2.1、解析NameNode 序列化文件fsimage1.使用 HDFS 命令解析 fsimage 文件,得到 namenode 第一关系相关信息命令如下:hdfs oiv -p Delimited -i fsimage_0000000000000697136 -o fsimage_0000000000000697136.txt2.通过解析文件内容可以得到如下.

2020-12-26 14:01:58 305 1

原创 大数据集群节点与硬件规划

1、大数据平台前期调研1.1业务需求调研从运维角度看,主要调研公司的有哪业务的数据运营需求,是离线计算需求还是实时计算需求。1)离线计算组件需求:数据采集组件:FlinkX/DataX 数据存储组件:HDFS数据加工组件:YARN/Hive/Spark/Flink数据服务组件:HBase/Elasticsearch/Geomesa(时空数据库)/Kylin(OLAP 引擎)/MPP 数据库(可以用作即席交互查询,如 Greenplum、HAWQ)2)实时计算组件需求:数.

2020-12-26 13:59:25 1559

原创 大数据运维存档(5)HBase&Kafka调优与排障

一、HBase篇1、巡检HBase 是使用 HDFS 作为底层存储的 NoSQL 数据库,提供了满足实时性和随即读写功能的数据库服务。每日早晚巡检 HBase 服务,检查各集群的 HMaster 和 RegionServer 状态,是否事务积压等问题。1.1、查看CM HBase 的整体状态1.HBase 的状态,目前看没有严重警告2.查看集群读写请求量3.查看总 Region 数,有 4 万+的 Region平均每个 RegionServer 有 100

2020-12-26 13:55:57 247

原创 大数据运维存档(4)YARN调优与排障

1、巡检YARN 为 Hadoop 集群的上层应用,包括 MapReduce、Spark 等计算服务在内,提供了统一的资源管理和调度服务。每日早晚巡检YARN 服务,主要检查资源池内主机的健康状态,保障 YARN 服务可用性。1.1、YARN CM 运行状态Yarn 集群,目前 Cloudera Manager 显示 6 个不良,16 个存在隐患打开显示为不良的 NodeManager,这个节点有坏盘正在报修阶段查看存在隐患的 NodeManager查看正在运行的

2020-12-26 13:49:39 241 1

原创 大数据运维存档(3)HDFS&ZooKeeper调优与排障

1、巡检HDFS 为集群提供高可用性弹性存储服务,是集群的存储主体。每日早晚巡检HDFS 服务,包括HDFS 服务可用性、存储使用率、datanode 是否有故障盘等。1.1、HDFS 总体状态①HDFS 状态,如下的红色提示需要关注②HDFS容量是否过阈值1.2、HDFS UI 巡检1.2.1、summary巡检对应上图所示标号,逐一进行解释:(1)HDFS 总文件数:此数值代表着 HDFS 存储内有多少文件,该数值的警告阈值为 5000W(2)H.

2020-12-26 13:46:50 247 1

原创 大数据运维存档(0)linux系统运维常用命令

1、常用命令1.1、查看主机CPU使用情况1.1.1、sarsar -u 1 5说明:已1秒为周期查询5次当前主机总体CPU使用情况。%user 用户空间的 CPU 使用%nice 改变过优先级的进程的 CPU 使用率%system 内核空间的 CPU 使用率%iowait CPU 等待 IO 的百分比%steal 虚拟机的虚拟机 CPU 使用的 CPU%idle 空闲的 CPU主要看%iowait 和%idle,%iowait 过高表示存在 I/O 瓶颈,.

2020-12-26 13:27:26 215

原创 大数据运维存档(2)MapReduce分布式计算

一、MapReduce是什么总的来说:MapReduce是面向大规模数据并行处理的计算模型、框架和平台。具有以下3个层面的含义:1.MapReduce是一个并行程序的设计模型与方法;2.MapReduce是一个并行程序运行的软件框架;3.MapReduce是一个基于集群的高性能并行计算平台Hadoop中的MapReduce就是一个使用简单的软件框架,基于它写出来的应用程序能够运行在由成百上千个商用机器组成的大型集群上,并以一种可靠容错的方式并行处理TB或PB级别的数据集。二、MapR

2020-12-26 13:24:23 177

原创 大数据运维存档(1)HDFS常识整理

hdfs的设计理念可移植性 流式数据访问(高吞吐量而不是低延时) 分布式存储解决大规模数据存储 硬件故障是常态而不是异常 最高效的数据访问模式:一次写入,多次读取(数据的简单一致性)一、数据块(block)HDFS原理白话讲就是将大文件分为若干个块,将这些块散落在不同的服务器上进行存储。1.1 数据块大小如何设置在hdfs配置文件hdfs-site.xml中,通过dfs.blocksize参数配置1.2 为什么hdfs的数据块这么大hadoop 1.x默认块大.

2020-12-26 13:17:52 192

原创 HDFS小文件处理解决方案总结

问题:1、HDFS处理小文件有几种方案?各自的优缺点有哪些?2、HDFS文件操作流程步骤有哪些?3、你对提高HDFS处理小文件的效率有什么新的想法?一、概述HDFS存储特点:(1)流式读取方式,主要是针对一次写入,多次读出的使用模式。写入的过程使用的是append的方式。(2)设计目的是为了存储超大文件,主要是针对几百MB,GB,甚至TB的文件(3)该分布式系统构建在普通PC机组成的集群上,大大降低了构建成本,并屏蔽了系统故障,使得用户可以专注于自身的操作运...

2020-12-26 13:12:13 247

原创 HDFS租约机制: HDFS写BLock块及数据同步到磁盘时如何保证数据一致性

前言在HDFS中,当每次客户端用户往某个文件中写入数据的时候,为了保持数据的一致性,此时其它客户端程序是不允许向此文件同时写入数据的。那么HDFS是如何做到这一点的呢?答案是租约(Lease)。换句话说,租约是HDFS给予客户端的一个写文件操作的临时许可证,无此证件者将不被允许操作此文件。本文我们将要深入分析HDFS内部的租约机制,包括租约的添加、移除、管理操作等等。HDFS租约的概念HDFS租约可能很多使用HDFS的人都或多或少都知道一些,大致的理解一般如下:“客户端在每次读写HDFS文件的时

2020-12-25 14:12:26 616

原创 HDP2: HDFS 写、读、CheckPoint流程、元数据内容(内存元数据、元数据文件)

一、HDFS写流程流程:1.客户端向NameNode通信请求上传文件,附带path2.namenode进行检查检查的内容:hdfs的文件目录 权限检查 集群状态 租约检查3.NameNode返回是否可以上传4.得到肯定回复后,客户端切块,再次请求存放的datanode地址。5.响应返回给客户端dn1,dn2,dn3的地址6.客户端向datanode请求建立管道:DataNode 1收到请求会继续调用DataNode 2,然后DataNode 2调用Data.

2020-12-25 13:50:28 332

转载 脚本任务调度azkaban使用

1.Azkaban 底层原理简述架构图:从上图可见,Azkaban集群部署模式,主要有3个核心的组件:Azkaban WebServer,是整个调度集群的核心,负责所有作业的管理和调度。Azkaban ExecutorServer,整个调度集群中实际运行作业的节点DB,是集群中所有节点运行共用的数据存储,包含作业信息、各种调度元数据等。2 Azkaban任务调度平台搭建1. 下载安装下载地址:http://azkaban.github.io/downloads.h..

2020-12-25 11:37:13 828

原创 hive生产中的参数配置——不同任务不同参数

在脚本中hive-e后面直接设置:--任务优先级别set mapred.job.priority = NORMAL;--开启中间压缩(map输出结果压缩,map端溢写时压缩后再传输)set hive.exec.compress.intermediate = true--在Map-Reduce的任务结束时合并小文件(从map到reduceset hive.merge.mapredfiles = true;--合并文件的大小,设置为块大小的两倍256Mset hive.merg

2020-12-25 10:24:39 357 1

原创 向量化查询在列式存储DB中的优化引擎与HIVE中向量化执行引擎功能的BUG:ClassCastException:Integer cannot be cast to[B

具体用法关闭向量化执行引擎:set hive.vectorized.execution.enabled = false;–开启向量化查询开关set hive.vectorized.execution.enabled=true;select s_age, max(s_desc) num from student_tb_orc group by s_age;开启hive.vectorized.execution.enabled操作,默认是关闭状态,将一个普通的查询转化为向量化查询执行.

2020-12-25 09:36:34 1476

原创 Hive常用函数大全一览

本文转载自:https://www.iteblog.com/archives/2258.html文章目录1关系运算 1.11、等值比较: = 1.22、不等值比较: 1.33、小于比较: < 1.44、小于等于比较: <= 1.55、大于比较: > 1.66、大于等于比较: >= 1.77、空值判断: IS NULL 1.88、非空判断: IS NOT NULL 1.99、LIKE比较: LIKE 1.1010、...

2020-12-24 11:17:35 516

原创 数据业务建模的ER三范式与实际应用

数据建模:数据模型就是数据的组织和存储方法。主要关注的是从业务、数据存取和使用角度合理存储数据。一、传统业务建模:三范式主键: 创建表时可以不设置主键 , 但是没有设置主键的表 , 底层会认为所有的键都是主键 ,所以在创建时使用了所有的字段创建索引 , 在查询时索引的存在几乎没有意义 。复合主键: 两个或两个以上的字段作为评价一条数据记录的唯一性标志 。1、第一范式: 简单拆分成无重复列1.1强调列的原子性 , 即:列不能分成几列1.2 一范式建模考虑重点:...

2020-12-24 10:09:31 599 1

原创 HDP1: HDFS架构基础

学习目标:高可用、单机元数据内存受限、源码设计HDFS是如何实现有状态的高可用架构——HA解决单节点故障HDFS是如何从架构上解决单机内存受限问题——元数据内存受限问题HDFS能支撑起亿级流量的核心源码的设计一、HDFS架构演进1、Hadoop的三个版本:对应的三个HDFS版本​ Hadoop1、2、3​ HDFS 1、2、3Hadoop1重点解决的两上问题:海量数据如何存储海量数据如何进行计算2、HDFS1.0的架构:​ HDFS

2020-12-22 23:27:28 515

原创 归因分析模型

在数据时代,广告的投放效果评估往往会产生很多的问题。而归因分析(Attribution Analysis)要解决的问题就是广告效果的产生,其功劳应该如何合理的分配给哪些渠道。一、什么是归因分析?在复杂的数据时代,我们每天都会面临产生产生的大量的数据以及用户复杂的消费行为路径,特别是在互联网广告行业,在广告投放的效果评估上,往往会产生一系列的问题:哪些营销渠道促成了销售? 他们的贡献率分别是多少? 而这些贡献的背后,是源自于怎样的用户行为路径而产生的? 如何使用归因分析得到的结论,指.

2020-12-21 15:54:24 1551

原创 操作手册2:建数仓,从ODS到DWD层——日志的清洗、转换、集成

需求:用spark来进行数据ETL: 清洗: 去除json数据中的废弃字段 过滤json格式不正确的脏数据 过滤日志中的account及deviceid全为空的记录 过滤日志中缺少关键字段(properties/eventid/sessionid缺一不可)的记录 过滤日志中不符合时间段的记录(由于app上报日志可能的延迟,有数据延迟到达) 对于web端日志,过滤爬虫请求数据(通过useragent标识来分析) 转换: 将json打平,解析成扁平结构,主要是

2020-12-17 21:55:30 2856

原创 操作手册1:建数仓,埋点日志到ods层

需求:从埋点log到ods层将客户端app生成的json日志导入hive ods贴源层{"account":"l4d9TM","appId":"cn.doitedu.app1","appVersion":"2.0","carrier":"小米移动","deviceId":"KVlABkbMqqwn","deviceType":"REDMI-5","eventId":"adClick","ip":"180.62.91.180","latitude":25.213352855705107,"long

2020-12-17 19:18:00 527

原创 spark join案例:Json数据的解析中的脏数据过滤、join并写入mysql

源数据 :{"cid":1,"money":600.0,"longitude":116.397128,"latitude":39.916527,"oid":"o123",}"oid":"o112","cid":3,"money":200.0,"longitude":118.396128,"latitude":35.916527}{"oid":"o124","cid":2,"money":200.0,"longitude":117.397128,"latitude"...

2020-12-15 23:24:32 467

原创 Spark中决定Shuffle到哪个分区及Reduce个数的核心:HashPartitioner和RangePartitioner分区器

1、Spark的分区器:主要有HashPartitioner和RangePartitioner两种决定了RDD中每条数据经过Shuffle过程属于哪个分区; 也决定了Reduce的个数。(只有Key-Value类型的RDD才有分区的,非Key-Value类型的RDD分区的值是None的)2、HashPartitioner实现:对于给定的key,计算其hashCode,并除于分区的个数取余,如果余数小于0,则用余数+分区的个数,最后返回的值就是这个key所属的分区ID。由于hash

2020-12-15 22:39:50 547

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除