IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 【Hadoop】HDFS操作、数据上传与下载原理解析、高级特性及底层原理 -> 正文阅读

[大数据]【Hadoop】HDFS操作、数据上传与下载原理解析、高级特性及底层原理


手动反爬虫,禁止转载: 原博地址 https://blog.csdn.net/lys_828/article/details/118660106(CSDN博主:Be_melting)

 知识梳理不易,请尊重劳动成果,文章仅发布在CSDN网站上,在其他网站看到该博文均属于未经作者授权的恶意爬取信息

1 HDFS操作

可以通过三种方式来操作HDFS,分别是: Web Console网页工具、命令行和Java API。接下来就分别介绍这三种方式

1.1 Web Console网页工具

需要先启动虚拟机bigdata111,然后进入伪分布模式中,开启HDFS:start-all.sh。对于NameNode和SecondaryNameNode有不同的网页端口进行监控,具体如下

(1)NameNode:端口50070。注意里面有个参数safemode,在进行操作的时候这个值一定要是关闭的状态,下图中的截图只截取了部分,后面的内容还有一些其它的介绍
在这里插入图片描述
为了补全上面的截图,后面的内容也全部截取如下。主要注意一下,正常运行期间,下面的Dead Nodes(死掉的节点)个数一定要为0,不为0的时候表明有些节点是不可用,我们就必须关注一下这些死掉的节点为什么处于不健康的状态,因为每一个节点都相当于是一个完整体系中重要的一环,都不能出问题,否则最后的处理就会垮掉
在这里插入图片描述
另外,除了首页之外,还有其它的菜单栏,可以查看,比如下面的HDFS的启动过程,一共分为四步。第一步就是加载原信息文件(但是这个文件并没有体现HDFS最新的状态),因此第二步就是加载客户端日志文件(edit文件中包含了最新的状态信息),然后第三步,出发检查点,SecondaryNameNode就会把edits中的最新状态信息合并到fsimage文件中,最后一步就是整个HDFS会进入一个安全模式。这四个流程正常之后,系统就会自动退出安全模式(第四步存在的必要就是检查数据块的完整性,检查无误就会自动退出)。

在utilities菜单栏里面会有HDFS里面的文件和操作的log文件,可以直接在网页上进行查看或者下载
在这里插入图片描述
(2)SecondaryNameNode:端口50090。可以发现该网页中出现最多的一个单词就是checkpoint,这个也和SecondaryNameNode的主要职责有关系,当触发检查点时候,SecondaryNameNode就会进行日志信息的合并。
在这里插入图片描述

1.2 命令行

通过命令行操作HDFS也有两种方式:

  • 第一种是普通的操作命令:hdfs dfs ****
  • 还有一种是管理员命令:hdfs dfsadmin ****

需要提醒一下,我们不需要对于每个指令都牢记于心,就像python中模块内部的方法一样,使用的时候调用帮助文档查看即可,对于HDFS的操作也是如此,打开Xshell启动biadgdata111上的HDFS,然后直接输入前面的指令,后面的具体参数就会出来的,比如以普通操作命令为例(只截取部分参数信息)
在这里插入图片描述

1.2.1 普通的操作命令

-mkdir 在HDFS中创建目录
	hdfs dfs -mkdir /aaa
	hdfs dfs -mkdir -p /bbb/ccc 如果父目录不存在,使用-p参数先创建父目录

-ls		查询HDFS的某个目录
-ls -R	查询HDFS的某个目录,包含子目录
		简写:-lsr

-put			上传数据
-copyFromLocal  上传数据
-moveFromLocal  上传数据,本质ctrl+x 剪切

-copyToLocal	下载数据
-get			下载数据

从hdfs中下载文件到本地:hdfs dfs -get /input/data.txt .

-rm				删除目录
-rmr			删除目录,包含子目录
	举例:hdfs dfs -rmr /bbb
	日志:Deleted /bbb(注意对比有无打开回收站)

-getmerge:先把某个目录下的文件合并,再下载
	[root@bigdata111 ~]# vi student01.txt
	[root@bigdata111 ~]# vi student02.txt
	[root@bigdata111 ~]# hdfs dfs -mkdir /students
	[root@bigdata111 ~]# hdfs dfs -put student0* /students
	[root@bigdata111 ~]# hdfs dfs -ls /students
	Found 2 items
	-rw-r--r--   1 root supergroup         19 2020-02-24 10:19 /students/student01.txt
	-rw-r--r--   1 root supergroup         10 2020-02-24 10:19 /students/student02.txt
	[root@bigdata111 ~]# hdfs dfs -getmerge /students ./allstudents.txt

-cp:拷贝  hdfs dfs -cp /input/data.txt /input/data2.txt
-mv:剪切

-count:举例 hdfs dfs -count /students
[root@bigdata111 ~]# hdfs dfs -count /students
		   1            2                 29 /students
		   意思就是当前文件夹下有1个文件夹,2个文件,一共29个字节
		   
-du:类似-count,更详细
	hdfs dfs -du /students
	19  /students/student01.txt
	10  /students/student02.txt
			
-text、-cat 查看文本文件的内容
	hdfs dfs -cat /students/student01.txt
			
balancer:平衡操作
	hdfs balancer
	就是将DataNode各个节点的数据块尽量保持均衡提高性能,
	但是执行这个操作的时候应该在系统空闲的时候

1.2.2 管理员命令

-report:hdfs dfsadmin -report
	打印报告,观察HDFS的状态,这个信息和在Web console上面看到的信息一致

-safemode 安全模式
	[root@bigdata111 ~]# hdfs dfsadmin -safemode
	Usage: hdfs dfsadmin [-safemode enter | leave | get | wait]
	
	进入 | 离开 | 获取当前安全模式状态 | 等待安全模式自动退出
	
	[root@bigdata111 ~]# hdfs dfsadmin -safemode get
	Safe mode is OFF
	[root@bigdata111 ~]# hdfs dfsadmin -safemode enter
	Safe mode is ON
	
	安全模式打开后,程序进入只读的状态,无法进行文件的创建
	
	[root@bigdata111 ~]# hdfs dfs -mkdir /xyz
	mkdir: Cannot create directory /xyz. Name node is in safe mode.
	[root@bigdata111 ~]# hdfs dfsadmin -safemode leave
	Safe mode is OFF

1.3 Java API

包含的jar包(需要把jar包放置在工程文件夹中)
	$HADOOP_HOME/share/hadoop/common/*.jar
	$HADOOP_HOME/share/hadoop/common/lib/*.jar
	$HADOOP_HOME/share/hadoop/hdfs/*.jar
	$HADOOP_HOME/share/hadoop/hdfs/lib/*.jar

这里使用的开发环境为Eclipse,然后就是使用WinSCP软件将bigdata111虚拟机上面的HDFS中的对应的jar包下载到本地(建议在桌面创建一个空文件夹,然后将下载的jar包都放置在其中),下载完毕后,桌面创建的HDFS文件夹中一共有74个jar包(注意核实个数)
在这里插入图片描述
然后打开Eclipse,创建工程项目,把下载的jar全部放置到工程项目中,并添加到环境路径,操作分解如下:

第一步:创建/找一个已有文件放置工程项目文件
在这里插入图片描述
然后新建一个Java 的工程项目,进行命名后确认
在这里插入图片描述
第二步,将桌面HDFS文件夹中的所有jar包全选后复制粘贴到创建的工程下面的lib文件夹中(lib文件夹要先自己新建)
在这里插入图片描述
然后再复制粘贴全部jar,进行环境路径的添加
在这里插入图片描述
至此环境就搭建完成了,桌面的HDFS文件夹就可以直接删除了。

接下来就是创建Java程序,跑代码,先在src文件夹下先创建一个demo为名的package,然后创建一个DemoMkDir的Java class
在这里插入图片描述
然后检查的方法采用JUnit方式进行测试,代码输入完成后如下

package demo;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.Test;

public class DemoMkDir {
	
	@Test
	public void test1() throws Exception{
		//指定NameNode地址,Configuration是在apache.hadoop.conf下
		Configuration  conf = new Configuration();
		
		//在设置伪分布模式,hdfs配置第二个文件core-site.xml是
		//用来设置NameNode地址,键:fs.defaultFS,值:hdfs://192.168.124.111:9000
		conf.set("fs.defaultFS","hdfs://192.168.124.111:9000");
		
		//创建一个HDFS的客户端,注意导入的也是apache.hadoop的抽象类
		FileSystem client = FileSystem.get(conf);
		//返回的是DistributeFileSystem
		
		//创建目录
		client.mkdirs(new Path("/folder1"));
		
		//关闭客户端
		client.close();
	}
}

运行Java文件,最后输出的结果如下,具体的报错信息直接看不方便,可以新建一个记事本,复制粘贴上去
在这里插入图片描述

还是在桌面创建一个新的记事本,报错信息上传后,内容如下,这里就涉及到之前介绍的HDFS的权限管理了,这里的用户user为lenovo,对应的就是其它用户了,权限码就是最后的r-x,只有读和执行的权限,没有进行写权限,所以这里创建文件夹,程序报错说Permission denied
在这里插入图片描述

解决问题的方式有四种:

  • (1) 设置执行的用户是root:HADOOP_USER_NAME = root
  • (2) 通过Java的-D参数来设置:HADOOP_USER_NAME
  • (3) 通过chmod的命令执行:hdfs dfs -chmod 777 /folder1
  • (4)禁用HDFS的权限检查:dfs.permission = false

(1)先来介绍第一种方式,既然上传的用户是其它用户,那么把执行的用户设置为root用户自然也就有了写的权权力,就能够完成文件夹的创建,需要添加一行代码:System.setProperty("HADOOP_USER_NAME", "root");

输出结果如下,完美的解决问题
在这里插入图片描述
在上机操作中验证一下这个folder1是否创建成功(核实无误)
在这里插入图片描述

(2) 通过Java的-D参数来设置,关于-D参数的使用,先进行一段小程序的编写,新建一个java程序,代码内容如下:

//java -Dp1=helloword TestD
public class TestD{

	public static void main(String[] args) {
		method1();
	}

	public static void method1() {
		//在这里获取命令行参数
		String value = System.getProperty("p1");
		System.out.println(value);
	}
}

书写完毕后进行保存,然后进行编译,最后在命令行上执行上面注释掉的指令,可以发现最后直接输出了p1对应的值,这里就相当于把HelloWord传递到String value = System.getProperty("p1")中了,可以发现利用这种方式本质上也是和第一种方式的实现原理一样,都是设置用户为root
在这里插入图片描述
然后就开始解决一下问题,将原来的函数复制一份重命名为test3,将之前添加的那行代码进行删除(注意为了显示出效果,创建的文件夹名称改为folder2),然后运行,这次是选择下面的一种方式
在这里插入图片描述
弹出的页面中鼠标点击JUnit,然后点击新建配置的按钮,在界面中选择待检测的方法为test3,这时候再点击上方的Arguments菜单栏进行参数设置如下
在这里插入图片描述
最后运行结果如下
在这里插入图片描述
然后上机核实一下文件目录是否有增多,可以发现确实增加了一个folder2的文件夹
在这里插入图片描述
(3) 通过chmod的命令执行,之前介绍过权限管理,这里把所有的权限都改为可读、可写、可执行,对应的指令码就为777,然后新建一个test4函数,在folder2文件夹下再创建一个folder3文件夹,运行程序后在xshell中查看文件信息如下(证明修改权限后,直接可以对文件进行写入操作了)
在这里插入图片描述
(4) 禁用HDFS的权限检查,之前在进行hdfs设置时hdfs-site.xml文件的时候有个权限检查的参数。先将启动的hdfs进行关闭,然后进入hdfs-site.xml文件进行参数修改
在这里插入图片描述
修改完成后再次运行test1函数,这个函数是最初的报错程序,再设置不进行权限检查后再次运行结果如下(为了对比出区别,把文件夹的名称这次随便修改为aaa),注意这里有一个小细节,如果是在hdfs刚刚启动就执行下面的程序,程序也是会报错,显示hdfs正在安全模式中,需要等待一会再运行就可以了
在这里插入图片描述
然后再上机操作中核实一下情况。注意看这里多出来的信息中正是test1创建的aaa文件,还有一个就是用户名就是使用本地的用户
在这里插入图片描述
至此使用Java API的方式操作HDFS的过程就全部梳理完毕

2 HDFS的原理解析

2.1 数据上传的过程

依然是在Eclipse中进行操作,然后新建一个TestUpLoad的Java Class,前面的部分还是一样保持不变,有差别的就是最后面的数据输入和输出流的创建
在这里插入图片描述

然后上机查看一下是否已经将文件进行上传(核实无误)
在这里插入图片描述
代码简化,关于上方Java代码的输入输出流,可以直接使用一个工具类进行简化,代码优化如下(另建一个test2的函数,尽量不修改原来的函数,然后把上传的文件名称修改一下)
在这里插入图片描述
然后再上机核实一下结果,可以发现folder1文件夹中比原来多了一个b.tag.gz的文件,说明上传无误
在这里插入图片描述
以下通过图示的方式介绍HDFS数据上传的过程和原理

在这里插入图片描述

2.2 数据下载的过程

既然前面使用了Java程序实现了本地文件的上传,那么同样可以进行文件的下载,还是以Java程序为例,新建一个Java Class文件为TestDownLoad。可以发现基本上是和上传的代码几乎一致,只修改了两行的代码,就是构建输出流和输入流的部分,然后桌面就生成了指定的文件

同样也是可以使用工具类进行简化代码,就是要注意工具类是来自于hadoop,然后桌面也生成了指定的文件
在这里插入图片描述

以下通过图示的方式介绍HDFS数据下载的过程和原理
在这里插入图片描述

2.3 使用Java API获取HDFS中的元信息

创建一个新的Java Class文件,命名为TestHDFS,比如要完成查找某个文件在HDFS中的DataNode位置、查看HDFS的数据节点、删除HDFS数据等

(1)查看文件位置,注意知道了数据的大小是超过一个数据块,所以得到的肯定是多个结果,所以使用列表进行存放,然后遍历输出每一个数据的信息
在这里插入图片描述
(2)查看HDFS的数据节点,这里使用的伪分布模式,最终输出的就是只有一台虚拟机的主机名,如果是全分布的模式,输出结果就会是多个主机,这里使用的是FileSystem的子类FileSystem的子类进行客户端的创建
在这里插入图片描述
(3)删除HDFS数据,也很简单,直接使用client.delete的命令,注意里面递归参数的使用
在这里插入图片描述

3 HDFS的高级特性

3.1 回收站

默认是关闭回收站功能,如果启用回收站,可以通过在core-site.xml中添加fs.trash.interval来打开幵配置时间阀值

  • 删除文件时,其实是放入回收站/trash
  • 回收站里的文件可以快速恢复
  • 可以设置一个时间阈值,当回收站里文件的存放时间超过返个阈值,就被彻底删除,并
    且释放占用的数据块
<property>
   <name>fs.trash.interval</name>
   <value>1440</value>
</property>

上机实际操作如下,注意设置的时间是1440分钟,这个时间就是一天的时间
在这里插入图片描述
进行一个文件夹的删除,看看系统反馈的结果如何(注意对比之前删除的系统反馈)
在这里插入图片描述
如果要进行数据恢复,直接进行mv/cp即可,代码指令:hdfs dfs -mv /user/root/.Trash/Current/aaa *** ,最后面的***代表要恢复的文件路径

3.2 配额Quota

3.2.1 名称配额

名称配额:规定的是某个HDFS目录下文件的个数,

比如:设置名称配额是N,表示只能在该目录下存放N-1个文件或者目录(因为创建的这个目录也算是文件)

  • hdfs dfsadmin [-setQuota …]
  • hdfs dfsadmin [-clrQuota …]
举例:
	hdfs dfs -mkdir /t1 

设置该目录的名称配额是3
	hdfs dfsadmin -setQuota 3 /t1 

上机实例如下,如果超过名称配额之后就会进行报错
在这里插入图片描述

3.2.2 空间配额

空间配额:规定的是某个HDFS目录下文件的大小

比如:设置某个HDFS目录的空间配额是200M,只能存放200M以下的文件

  • hdfs dfsadmin [-setSpaceQuota [-storageType ] …]
  • hdfs dfsadmin [-clrSpaceQuota [-storageType ] …]
举例:
	hdfs dfs -mkdir /t2
	
设置该目录的空间配额是1M (逻辑单位)
	hdfs dfsadmin -setSpaceQuota 1M /t2

尝试把a.xml文件上传至t2,结果核心报错如下,说明虽然文件的实际内存没有1m,但是实际上使用了128m(说明在传输和处理的时候不到128m的文件,最后也是一128m的数据块进行处理)
在这里插入图片描述

3.3 快照Snapshot

一个snapshot(快照)是一个全部文件系统、或者某个目录在某一时刻的镜像(本质:就是cp命令),作用如下:

  • 防止用户的错误操作
  • 备份
  • 试验/测试
  • 灾难恢复
开启快照
	hdfs dfsadmin -allowSnapshot /input

创建快照(备份)
	hdfs dfs -createSnapshot /input backup_input_01

往/input目录再存放一个文件,创建快照
	hdfs dfs -put a.xml /input
	hdfs dfs -createSnapshot /input backup_input_02

最后上机实操,进行快照之后,会提示里快照保存的地址,然后我们查看一下地址就可以知道快照的信息了
在这里插入图片描述
然后可以通过指令:hdfs lsSnapshottableDir 查看是否有快照的文件信息
在这里插入图片描述
还有一个实用的操作就是对比快照的差异,通过这种方式,就可以知道对比的两个文件信息之间的差异性,操作如下:hdfs snapshotDiff /input backup_input_01 backup_input_02,结果说明第二个备份比第一个备份中多出来一个a.xml文件
在这里插入图片描述

3.4 安全模式与权限管理

安全模式是hadoop的一种保护机制,用于保证集群中的数据块的安全性。如果HDFS处于安全模式,则表示HDFS是只读状态(之前的操作中也是有遇到过)。

当集群启动的时候,会首先进入安全模式。当系统处于安全模式时会检查数据块的完整性。假设我们设置的副本数(即参数dfs.replication,冗余度)是5,那么在datanode上就应该有5个副本存在,假设只存在3个副本,那么比例就是3/5=0.6。在配置文件hdfs-default.xml中定义了一个最小的副本的副本率0.999。我们的副本率0.6明显小于0.99,因此系统会自动的水平复制副本到其他的dataNode,使得副本率不小于0.999.如果系统中有8个副本,超过我们设定的5个副本,那么系统也会删除多余的3个副本。关于安全模式相关的超过可以查看之前的介绍,这里就进行回顾一下

HDFS的权限管理和Linux的权限管理是一致的,实操如下,就不再进行赘述了
在这里插入图片描述

3.5 HDFS的集群

集群的两大功能:

  • (1)负载均衡 (一个人默默扛下来所有,时间久了也会累,再找一个伴)
  • (2)失败迁移,就是实现HA(给一个备用节点,随时待命)

针对两个功能实现的方式分别为:联盟和HA(注意其中的NameNode的状态),只有HDFS才有联盟,之前介绍的其它主从架构的都没有,HA的话主从架构的都有。
在这里插入图片描述
然后就是ZooKeeper的介绍:是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等

4 HDFS的底层原理

4.1 Java的代理对象Proxy

注意在前面的数据上传过程中的第三步,特意进行标红,“建立RPC通信,得到NameNode的代理对象”,接下来就介绍一下代理对象的相关知识,RPC放在最后面进行介绍

使用代理对象的过程可以理解为购买火车票,火车票最终是由火车站(12306售出),但是可以使用其它的软件或者网站购买,这些软件或者网站就是代理对象,而且代理对象还可以增加一些原来没有的附加服务,比如增选座位靠窗、卧铺上中下、增值餐饮服务等。
在这里插入图片描述
实战操作,还是使用Eclipse,新建一个proxy的package,然后创建一个MyService的接口
在这里插入图片描述
接口文件里面输入两个实例的方法:method1和method2,然后在创建一个Java Class来实现接口的类
在这里插入图片描述
该文件中的信息如下,为了更好地展示调用了哪个方法,在每个方法中都输出对应的方法名称
在这里插入图片描述
最后在创建一个实现的Java Class来运行,结果可以发现接口中的两个方法均可正常运行,最后输出打印了对应方法中的内容
在这里插入图片描述
然后就有了需求,对于method2中的功能我觉得可以在完善,就要基于此接口的上丰富我想要的功能(在不修改源码的基础上,对method2进行重写)

代理对象实现的类,通过查找Java API文档可以发现,使用的是newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)

  • 第一个参数:ClassLoader loader 类加载器(相当于实例化一个类)
  • 第二个参数:Class<?>[] interfaces 真正对象实现的接口 (真正的实现的软件或网站)
  • 第三个参数:InvocationHandler h如何处理客户端的调用 (具体的处理方式)
    在这里插入图片描述
    接着就是进行方法的重写,根据方法的名称进行判断,然后if里面的内容就是我们可以再进行开发的地方
    在这里插入图片描述
    还有一个小细节,就是今后看到$符号,就明确知道这个对象是一个代理对象,比如上面的代码在41行打个断点,然后以debug的模式运行,运行完毕后,鼠标放置在proxy上面,就会有个自动显示,如下,存在$符号,说明是一个代理对象,而不是真实的对象
    在这里插入图片描述

4.2 RPC协议

Remote Procedure Call,远程过程调用。也就是说,调用过程代码并不是在调用者本地运行,而是要实现调用者与被调用者二地之间的连接与通信。

RPC的基本通信模型是基于Client/Server进程间相互通信模型的一种同步通信形式;它对Client提供了远程服务的过程抽象,其底层消息传递操作对Client是透明的。

在RPC中,Client即是请求服务的调用者(Caller),而Server则是执行Client的请求而被调用的程序 (Callee)。

具体的流程如下,开发时候,首要HDFS会有自己的接口(12306买火车票),然后我们会基于此创建自己的业务接口,然后再创建一个类实现这个接口。这里面有一个问题:既然是开发接口,就可以有很多的类来实现这个业务,所以为了明确指定由哪个类实现这个接口,就要指定一个签名的信息(比如2号类来实现),然后就和业务进行绑定,从而提高效率。最后就是客户端开发程序实现这个过程
在这里插入图片描述

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-07-13 17:31:50  更:2021-07-13 17:32:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/1 8:52:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码