大数据 | Hadoop HA高可用搭建保姆级教程(大二学长的万字笔记)

news2024/10/5 12:50:29

知识目录

  • 一、写在前面🎈
  • 二、集群准备🍟
    • 2.1 集群规划
    • 2.2 集群解释
  • 三、说明🔑
    • 3.1 主机名说明
    • 3.2 用户名说明
    • 3.3 操作目录说明
    • 3.3 必要工具说明
  • 四、上传资料🌵
    • 4.1 资料准备
    • 4.2 脚本准备
    • 4.3 配置文件准备
  • 五、解压与修改文件🍉
    • 5.1 解压软件包
    • 5.2 修改配置文件
    • 5.3 创建目录
    • 5.4 分发HA目录
  • 六、启动HA集群🎈
    • 6.1 Zookeeper启动测试
    • 6.2 启动JournalNode
    • 6.3 初始化NameNode
    • 6.4 初始化Zookeeper
    • 6.5 启动集群
  • 七、检验集群✨
    • 7.1 jps检查
    • 7.2 网页检查
    • 7.3 自动故障转移检查
    • 7.4 解决NameNode无法自动故障转移问题
  • 八、日后HA启动方式🐮
  • 九、结语🔑
  • 十、投票调查🍉

一、写在前面🎈

大家好!我是初心,今天给大家带来的是Hadoop HA搭建保姆级教程,来自大二学长的万字长文自述和笔记!

相信很多人看到这个标题时,可能会产生一种疑问:博主你之前不是出过一期关于Hadoop HA高可用集群搭建的教程了吗,这次怎么还出一篇?是有什么改进的地方吗?

没错!本次将给大家带来更加详细的搭建教程以及解释! 希望能帮助大家更好的理解Hadoop HA集群。

老规矩,还是先介绍一下自己吧!(该走的流程不能少,嘿嘿嘿)

🏠 个人主页:初心%个人主页 🍺
🧑 个人简介:大家好,我是初心,和大家共同努力 🍺
💕 每日金句分享:迄今所有人生都大写着失败,但并不妨碍我继续向前。——狂铁《王者荣耀》🍺
💕欢迎大家:这里是CSDN,我记录知识的地方,喜欢的话请三连,有问题请私信😘

话不多说,就让我们一起进入正题吧!

二、集群准备🍟

这是我们本次搭建要完成的集群规划,也就是我们的,终极目标(The ultimate goal)。

2.1 集群规划

也就是说,总共有hadoop102,hadoop103,hadoop104,hadoop105四个节点。先来一张搭建好的图证明一下我搭建好了

  • 停止集群
  • 启动集群

  • 查看集群规划是否符合预期

2.2 集群解释

  • NN-1

NameNode节点1,在 core-site.xml 文件中配置。

<!-- mycluster是集群名称,值是集群中的所有namenodes -->
<property>
 <name>dfs.ha.namenodes.mycluster</name>
 <value>nn1,nn2</value>
</property>
  • NN-2

NameNode节点2,也是在 core-site.xml 文件中配置。

  • DN

DataNode,在workers中配置。 workers中的主机名要提前在/etc/hosts文件中做好主机名与IP的映射。

  • ZK

Zookeeper,在 zoo.cfg 文件中配置。 注意要将 zoo_sample.cfg 文件改名为 zoo.cfg,这个文件在 zookeeper 目录的 conf 目录下。不需要启动Zookeeper的节点,不需要配置进来。

  • ZKFC

ZKFailOverController,不需要主动配置,哪里的NameNode正常启动了ZKFC就会启动。 ZKFailOverController是Hadoop中通过ZK实现FC(故障转移)功能的一个实用工具。

  • JNN

JournalNode,在需要启动的节点上启动,仅第一次启动Hadoop时需要手动启动,后面都不需要手动启动。

三、说明🔑

3.1 主机名说明

据了解,很多朋友使用的四个节点的名称 并不是 hadoop102,hadoop103,hadoop104,hadoop105 ,有是master、slave1,slave2,slave3的;有namenode,datanode1,datanode2,datanode3的。没关系,只是主机名不一样而已! 只需要将对应的地方修改一下,就可以。(如果你足够熟练,就知道哪些地方要用自己的主机名)

3.2 用户名说明

在搭建过程中,我也没有使用 root 账号,使用的是一个可以执行 sudo 命令的普通用户账号。

为什么不使用root账号?

试问一下大家,如果你在公司上班,如果你不是运维人员,只是普通的开发人员,你可以拿到root账号的权限吗?显然是不可以的,我认为我们在平时的训练中就要养成使用普通用户账号的习惯,实际操作中才能游刃有余。(类似于接受自己的平庸哈哈哈)

3.3 操作目录说明

所有操作均在 /opt/module/HA 目录下,当然如果需要修改环境变量就要切换到 /etc/profile.d/ 目录下。

3.3 必要工具说明

这里使用到的就是VMware(安装虚拟机),XShell(远程连接工具)、Xftp(文件传输工具)。

至此,我们的需求、要求以及硬件设备就准备好了。下面开始准备软件吧!

四、上传资料🌵

磨刀不误砍柴工!充分的准备可以让我们的搭建过程事半功倍,流畅无比! ,而且,这也是减少返工(软件工程中的名词)的重要条件,大家一定要做好哦!

4.1 资料准备

这里用到的安装包有:jdk-8u202-linux-x64.tar.gz,点我下载jdk,hadoop-3.1.3.tar.gz,点我下载hadoop,apache-zookeeper-3.5.7-bin.tar.gz。点我下载Zookeeper,如果没有这些文件的可以私信我获取,我都上传到百度网盘了。

4.2 脚本准备

这里,我主要使用到了分发脚本(脚本名xsync),Hadoop HA一键启动脚本(脚本名myHA),查看所有节点jps进程脚本(脚本名jpsall)。

脚本的使用之前有提到过,这里不再赘述,大家可以参考我的这篇文章或其他文章:hadoop集群启停脚本分享。

下面是脚本内容,需要注意的是如果你的主机名和我不同,记得修改文中代码!

  • xsync
#! /bin/bash

# 1.判断参数个数
if [ $# -lt 1 ]
then
    echo Not Enough Argument!
    exit;
fi

# 2.遍历所有集群机器
for host in hadoop102 hadoop103 hadoop104 hadoop105
do
    echo ==================== $host ===================
    # 3.遍历所有目录,挨个发送

    for file in $@
    do
        # 4.判断文件是否存在
        if [ -e $file ]
            then
                # 5.获取父目录
                pdir=$(cd -P $(dirname $file); pwd)

                # 6.获取当前文件的名称
                fname=$(basename $file)
                ssh $host "mkdir -p $pdir"
                rsync -av $pdir/$fname $host:$pdir
            else
                echo $file does not exists!
        fi
    done
done
  • myHA
#! /bin/bash
if [ $# -lt 1 ]
then
    echo "No Args Input..."
    exit;
fi


case $1 in
"start"){
    echo "----------启动zookeeper----------"
	for i in hadoop103 hadoop104 hadoop105
	do
        echo ---------- zookeeper $i 启动 ------------
		ssh $i "/opt/module/HA/zookeeper/bin/zkServer.sh start"
	done
    echo "---------- 启动hdfs------------"
    ssh hadoop102 "/opt/module/HA/hadoop-3.1.3/sbin/start-dfs.sh"
    echo "---------- hadoop HA启动成功------------"
};;
"stop"){
    echo "----------关闭hdfs----------"
    ssh hadoop102 "/opt/module/HA/hadoop-3.1.3/sbin/stop-dfs.sh"
    echo "----------关闭zookeeper----------"
	for i in hadoop103 hadoop104 hadoop105
	do
        echo ---------- zookeeper $i 停止 ------------
		ssh $i "/opt/module/HA/zookeeper/bin/zkServer.sh stop"
	done
    echo "---------- hadoop HA停止成功------------"
};;
"status"){
	for i in hadoop103 hadoop104 hadoop105
	do
        echo ---------- zookeeper $i 状态 ------------    
		ssh $i "/opt/module/HA/zookeeper/bin/zkServer.sh status"
	done
};;
*)
    echo "Input Args Error"
;;
esac
  • jpsall
#! /bin/bash

for host in hadoop102 hadoop103 hadoop104 hadoop105
do
        echo ----------$host----------
        ssh $host jps
done

4.3 配置文件准备

由于篇幅原因,这里不展示配置文件的具体内容,但是却是非常重要,重中之重,大家可以私信我获取!这是搭建HA高可用中的关键,是减少我们遇到 报错风暴 的必由之路。

这里要用到的配置文件有:core-site.xml,hdfs-site.xml,hadoop-env.sh,workers,yarn-site.xml,mapred-site.xml(都在hadoop/etc/hadoop目录下)zoo.cfg(zookeeper/conf/目录下),my_env.sh(/etc/profile.d/目录下),共8个文件。

这8个配置文件均已上传百度网盘!点我获取资料。

至此,我们的资料也准备好了!

五、解压与修改文件🍉

5.1 解压软件包

将上述我们准备好的Zookeeper、Hadoop、JDK软件包通过Xshell+Xftp上传到 /opt/software 目录下,并解压到 /opt/module/HA 目录下。

上传文件过程请大家自己完成哦!下面是解压过程:(该过程只需要在一台节点上完成即可,我这里使用的hadoop102,其他的节点后面使用克隆)。

  • 创建HA目录
mkdir /opt/module/HA
  • 解压JDK
tar -xzvf /opt/software/jdk-8u202-linux-x64.tar.gz -C /opt/module/HA/
  • 解压Hadoop
tar -xzvf /opt/software/hadoop-3.1.3.tar.gz -C /opt/module/HA/
  • 解压Zookeeper
tar -xzvf apache-zookeeper-3.5.7-bin.tar.gz -C /opt/module/HA/
  • 重命名Zookeeper
mv apache-zookeeper-3.5.7-bin/ zookeeper
  • 重命名JDK
mv jdk1.8.0_202/ jdk1.8

5.2 修改配置文件

hadoop目录下的文件共六个,在资料中已经给出,下面仅展示一部分要特别注意的配置文件。

  • 1.core-site.xml

  • 2.hdfs-site.xml

  • 3.hadoop-env.sh

  • 4.workers

hadoop103
hadoop104
hadoop105
  • 5.yarn-site.xml
  • 6.mapre-site.xml

zookeeper目录下的文件

  • 1.zoo.cfg
server.1=hadoop103:2888:3888
server.2=hadoop104:2888:3888
server.3=hadoop105:2888:3888
  • 2.myid

这个节点上没有使用Zookeeper,所以未使用myid文件。

/etc/profile.d目录下的文件

  • my_env.sh
# JAVA_HOME
# 只需修改java_home 因人而异 是自己的jdk安装目录
export JAVA_HOME=/opt/module/jdk1.8
export PATH=$PATH:$JAVA_HOME/bin

# HADOOP_HOME
# 同理 这里只需修改Hadoop_home,是Hadoop安装目录
export HADOOP_HOME=/opt/module/HA/hadoop-3.1.3

export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin

export HDFS_NAMENODE_USER=sky
export HDFS_DATANODE_USER=sky
export HDFS_SECONDARYNAMENODE_USER=sky
export YARN_RESOURCEMANAGER_USER=sky
export YARN_NODEMANAGER_USER=sky

# ZOOKEEPER_HOME
export ZOOKEEPER_HOME=/opt/module/HA/zookeeper
export PATH=$PATH:$ZOOKEEPER_HOME/bin

之后记得刷新环境变量:

source /etc/profile.d/my_env.sh

5.3 创建目录

创建Hadoop数据临时目录:

mkdir /opt/module/HA/tmp

创建JournalNode日志目录:

mkdir /opt/module/HA/logs

创建Zookeeper数据目录:

mkdir /opt/module/HA/zookeeper/zkData

5.4 分发HA目录

分发HA目录下的所有内容到hadoop103,hadoop104,hadoop105上。

xsync /opt/module/HA/

六、启动HA集群🎈

6.1 Zookeeper启动测试

分别在hadoop103,hadoop104,hadoop105三个节点上启动Zookeeper,因为这三个节点在集群规划中有ZK。

zkServer.sh start

三个节点上的Zookeeper均启动成功!

6.2 启动JournalNode

分别在hadoop102,hadoop103,hadoop104三个节点上启动Zookeeper,因为这三个节点在集群规划中有JNN。

并且,JournalNode只需要手动启动一次,以后启动Hadoop HA高可用集群均不需要再次手动启动。

hdfs --daemon start journalnode

现在,我们通过jps来查看进程,ZK和JNN是否按照集群规划启动好了?




可以看到,目前集群规划正确,下面我们就可以进行下一步操作啦。

6.3 初始化NameNode

在是NameNode节点上的任意一个节点上初始化NameNode,并且只需要初始化一遍,这里我的集群中,hadoop102和hadoop103上都有NameNode,但是因为hadoop103上有DataNode,所以我 选择使用hadoop102作为初始化节点

hdfs namenode -format

6.4 初始化Zookeeper

在具有Zookeeper节点上的任意一个节点上初始化Zookeeper,并且只需要初始化一遍。这里我选择在hadoop103上进行初始化。

hdfs zkfc -formatZK

判断是否初始化成功:(在三台都查看一下)

zkCli.sh
ls \

6.5 启动集群

分别在hadoop102,hadoop103上启动NameNode。

hadoop102上执行:(只需执行一次

hdfs --daemon start namenode

hadoop103上执行:(只需执行一次

hdfs namenode -bootstrapStandby

在hadoop102上启动集群:

start-dfs.sh

至此,集群中的NameNode,DataNode,Zookeeper,ZKFC,JournalNode都已经启动好了。下面,让我们一起来看看,我们的集群能否经得住检验吧!

七、检验集群✨

7.1 jps检查

使用jpsall脚本分别查看四个节点上的jps进程信息,是否和集群规划相符,集群规划图再放一遍:

jpsall



和集群规划完全一致!

7.2 网页检查

分别访问NameNode1和NameNode2的两个Web页面,网址是http://hadoop102:9870,http://hadoop103:9870,结果如下:


网站访问中hadoop102的NameNode是active状态,hadoop103中的NameNode是standby状态。

7.3 自动故障转移检查

使用如下命令kill掉hadoop102上的NameNode进程:



这里,我们遇到了将NameNode-1的进程kill掉之后,另外一个NameNode没有变成active状态的问题,也就是说并没有实现自动故障转转移!

让我们一起来解决吧!

7.4 解决NameNode无法自动故障转移问题

这里引入一个 “脑裂” 的概念。

active namenode工作不正常后,zkfc在zookeeper中写入一些数据,表明异常,这时standby namenode中的zkfc读到异常信息,并将standby节点置为active。

但是,如果之前的active namenode并没有真的死掉,出现了假死(死了一会儿后又正常了),这样,就有两台namenode同时工作了。这种现象称为 脑裂

这里提供两种解决方案:

  • 法一:改变kill方式——安装psmisc插件

上述中,我们使用kill掉NameNode进程的方法是:

kill -9 进程号

但是这种方式不一定能够完全 kill 掉NameNode的状态,可能就会出现残余从而出现“脑裂”现象,所以我们采用 psmisc插件 的方式来彻底结束进程

更加神奇的是,这个插件安装好了,并不需要我们手动使用,而是系统自己调用的!

在hadoop102、hadoop103上按照psmisc插件:

sudo yum install -y psmisc
  • 感受psmisc插件的威力

这里,我们先手动将hadoop102的NameNode启动起来,它目前是standby状态:

hdfs --daemon start namenode


Kill掉Hadoop103的NameNode进程:

成功完成了NameNode的自动故障转移!

原理 :在备机准备上位的时候,它不管现在的主节点是不是真的挂机了,他都会使用远程登录技术ssh登录到主机上, 使用 killall namenode (这个killall就是psmisc插件的命令) 杀死它的namenode进程确保它真的结束了,有效的防止了出现“脑裂”的问题。

  • 法二:修改hdfs-site.xml文件

ZFKC的机制中,HealthMonitor定期去检查namenode的健康状态,如果我们杀掉namenode的服务,该namenode及其端口都关闭了。

推测因为无法正常通信所以保守确定namenode是否真的失效的等等时间大大延长。

那么如何解决这个问题呢?

就是在hdfs-site.xml文件配置隔离机制的地方加上一行shell(/bin/true),改为:

<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>

这里不再演示效果,大家可以自行尝试哦!

八、日后HA启动方式🐮

之后即可使用 myHA 脚本进行启停了!

九、结语🔑

以上就是本期要跟大家分享的全部内容了!

初心对于Hadoop HA的理解就是这些了,希望能帮助到大家!

如果你有更好的、更快速的方法,希望各位大佬不吝赐教哦。

十、投票调查🍉

你的Hadoop HA高可用搭建好了吗?

欢迎投票反馈哦!遇到任何问题,记得私信,给我留言~~

😍😍😍

最后,小伙伴们的点赞就是给初心最大的支持,能不能给初心来一个一键三连呢?谢谢支持。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/584434.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为OD机试真题 Java 实现【递增字符串】【2023Q1 200分】,附详细解题思路

一、题目描述 定义字符串完全由“A’和B"组成&#xff0c;当然也可以全是"A"或全是"B。如果字符串从前往后都是以字典序排列的&#xff0c;那么我们称之为严格递增字符串。 给出一个字符串5&#xff0c;允许修改字符串中的任意字符&#xff0c;即可以将任…

色彩空间转换 HSV,GRAY

RGB色彩空间是一种比较常见的色彩空间&#xff0c;除此之外比较常见的色彩空间还包括GRAY色彩空间&#xff08;灰度图像&#xff09;、YCrCb色彩空间、HSV色彩空间、HLS色彩空间、CIEL&#xff0a;a&#xff0a;b&#xff0a;色彩空间、CIEL&#xff0a;u&#xff0a;v&#xf…

租售keysight E8257D 50G模拟信号发生器 销售/回收

是德&#xff08;Keysight&#xff09; E8257D 模拟信号发生器 Keysight E8257D (Agilent) PSG 模拟信号发生器提供业界领先的输出功率、电平精度和高达 67 GHz 的相位噪声性能&#xff08;工作频率可达 70 GHz&#xff09;。Agilent PSG 模拟信号发生器的高输出功率和卓越的电…

SpringBoot + MyBatis报错:Invalid bound statement (not found)解决

背景&#xff1a;XML配置文件规范 使用Mybatis的注解方式&#xff0c;主要是来完成一些简单的增删改查功能。如果需要实现复杂的SQL功能&#xff0c;建议使用XML来配置映射语句&#xff0c;也就是将SQL语句写在XML配置文件中。 在Mybatis中使用XML映射文件方式开发&#xff0c…

从速度、质量到成本,Grid分布式并行测试在web自动化测试中尽显优势。

目录 前言&#xff1a; 一、Grid分布式并行测试简介 二、Grid分布式并行测试的优势 三、Grid分布式并行测试架构 四、Grid分布式并行测试封装 五、结语 前言&#xff1a; WEB自动化测试已经成为了软件开发流程中不可或缺的一部分。测试人员通过编写脚本&#xff0c;模拟用…

由于找不到msvcp140.dll文件,我们要怎么解决这种情况?

在使用电脑的过程中&#xff0c;我们经常会遇到各种各样的问题&#xff0c;其中之一就是缺少msvcp140.dll文件。这个问题通常会导致某些软件无法正常运行&#xff0c;而且很多人对于如何解决这个问题并不是很清楚。本文将会介绍多种修复方法&#xff0c;并对比哪种方法比较方便…

海睿思分享 | 颠覆传统方式的数仓构建工具

你还在为构建数仓的低效率而发愁吗&#xff1f; 你还在为数仓构建不能体系化而苦恼吗&#xff1f; 也许大家都不愿意承认&#xff0c;但是绝大部分的企业当前是没有统一、标准、公共、全局的模型设计的&#xff0c;而仅仅是把数据同步上来&#xff0c;然后基于业务需求做烟囱式…

pwn中利用off by null的一个思路,构造假chunk的难以触及pre_size咋整

题目分享 children_tcache 链接&#xff1a;https://pan.baidu.com/s/1jARmxmGaoN_VADlb6m0D8A?pwdra0l 提取码&#xff1a;ra0l 参考博客&#xff1a; tcache在pwn题中常见的利用姿势 - 先知社区 (aliyun.com) 开始&#xff1a; 这道题的具体写法我就不说了&#xff0…

如何快速运用R语言实现生物群落(生态)数据统计分析与绘图

R 语言作的开源、自由、免费等特点使其广泛应用于生物群落数据统计分析。生物群落数据多样而复杂&#xff0c;涉及众多统计分析方法。本次以生物群落数据分析中的最常用的统计方法回归和混合效应模型、多元统计分析技术及结构方程等数量分析方法为主线&#xff0c;通过多个来自…

【课程】12 水资源大系统多目标理论

2022级博士研究生课程笔记。 仅供学习交流&#xff0c;如若侵权&#xff0c;请联系我删除&#xff0c;谢谢。 感谢董老师的精彩分享&#xff01;

【课程】13 数据同化理论和方法

2022级博士研究生课程笔记。 仅供学习交流&#xff0c;如若侵权&#xff0c;请联系我删除&#xff0c;谢谢。 感谢时沈老师的精彩分享&#xff01;

MySQL分库分表方案及sharding-spher(1)

一、数据库瓶颈 不管是IO瓶颈&#xff0c;还是CPU瓶颈&#xff0c;最终都会导致数据库的活跃连接数增加&#xff0c;进而逼近甚至达到数据库可承载活跃连接数的阈值。在业务Service来看就是&#xff0c;可用数据库连接少甚至无连接可用。接下来就可以想象了吧&#xff08;并发…

史上最完整的Spring Bean的生命周期

Bean的生命周期总 Spring Bean 的生命周期 Spring中的bean的生命周期主要包含四个阶段&#xff1a;实例化Bean–> Bean属性填充–>初始化Bean—>销毁Bean 加载Bean定义 通过 loadBeanDefinitions 扫描所有xml配置、注解将Bean记录在beanDefinitionMap中创建Bean对象…

超级厉害的复盘能力,让你2023年下半年扬帆起航

不知不觉2023年的上半年已经过去了&#xff0c;上半年你过得怎么样&#xff1f;树立得目标有没有完成呢&#xff1f; 复盘&#xff0c;这个概念现在可谓是无人不知&#xff0c;无人不晓。好得复盘可以让我们避免犯错&#xff0c;让我们更加快速得接近我们得目标。 今天就和大…

不是说00后已经躺平了吗,怎么还是这么卷.....

都说00后已经躺平了&#xff0c;但是有一说一&#xff0c;该卷的还是卷。 前段时间我们部门就来了个00后&#xff0c;工作都还没两年&#xff0c;跳到我们公司起薪20K&#xff0c;都快接近我了。 后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了。最近和…

App上架流程(推荐)

准备 • 开发者账号 • 完工的项目 上架步骤 • 一、创建App ID • 二、创建证书请求文件 &#xff08;CSR文件&#xff09; • 三、创建发布证书 &#xff08;CER&#xff09; • 四、创建Provisioning Profiles配置文件 &#xff08;PP文件&#xff09; • 五、在App Stor…

ctfshow 每周大挑战 RCE极限挑战3

目录 题目源码1 跑一下正则2 分析解题用什么payload3 构造payload如何获取字母N构造出_POST及其他拼接内容POST传参 4 完整解题payload 题目源码 1 跑一下正则 <?php for($i32;$i<127;$i){if (!preg_match("/[a-zA-Z2-9!#%^&*:{}\-<\?>\"|~\\\\]/…

接口测试工具Postman接口测试图文教程

目录 一、前言 二、Postman安装和使用 三、请求方式 四、资金记录接口实例演示 一、前言 在前后端分离开发时&#xff0c;后端工作人员完成系统接口开发后&#xff0c;需要与前端人员对接&#xff0c;测试调试接口&#xff0c;验证接口的正确性可用性。而这要求前端开发进…

公网使用 SSH远程连接安卓手机 Termux -Android 手机服务器

文章目录 1.安装ssh2.安装cpolar内网穿透3.远程ssh连接配置4.公网远程连接5.固定远程连接地址 转载自cpolar极点云的文章&#xff1a;公网SSH远程连接Termux – 电脑使用安卓Termux 「无需公网IP」 使用安卓机跑东西的时候&#xff0c;屏幕太小&#xff0c;有时候操作不习惯。不…

增强型本地文件搜索工具:Find Any File

Find Any File是mac上一款增强型本地文件搜索工具&#xff0c;可以让你在本地磁盘上搜索、查找任何文件&#xff0c;包括本地磁盘的名称、 创建或修改日期、 大小或类型和创建者代码等。小编现为大家提供最新Find Any File Mac破解版&#xff0c;欢迎需要的朋友下载使用。 Find…