☰
deepin系统部署HDFS 3.1.3实战:JDK8适配与systemd服务配置
2026/10/18 19:58:29 网站建设 项目流程

1. 项目概述:为什么在deepin上跑HDFS不是“折腾”,而是真需求

HDFS编程实践(基于deepin 20.1社区版&Hadoop 3.1.3)——这个标题里藏着三个关键信号:国产化操作系统适配、大数据底层存储的本地化开发闭环、以及一个被长期低估的实操真相:Hadoop生态的调试与教学,从来就不该绑定在CentOS或Ubuntu上。我带过十几期大数据实训班,每次讲到HDFS API调用,总有学员问:“老师,我用的是deepin,能照着Linux教程做吗?”答案不是“能”或“不能”,而是“必须重新梳理路径依赖、Java环境链路和守护进程启动逻辑”。deepin 20.1社区版基于Debian 10(buster),内核5.4,systemd服务管理机制成熟,但它的默认JDK是OpenJDK 11,而Hadoop 3.1.3官方编译包明确要求JDK 8u161+(注意:不是JDK 11兼容,是强依赖JDK 8的字节码规范和部分已废弃的内部API)。这就埋下了第一个坑:直接apt install openjdk-11-jdk,HDFS namenode格式化会报UnsupportedClassVersionError,错误信息藏在/var/log/hadoop-hdfs/hadoop-hdfs-namenode-*.log末尾三行,新手根本找不到日志在哪。更现实的问题是:高校实验室批量部署的国产化终端、某地政务云测试环境的信创服务器节点、甚至很多开发者私有笔记本,用的都是deepin而非Red Hat系系统。他们不需要“部署生产集群”,但需要在单机环境下完整走通HDFS读写、权限控制、快照管理、甚至NameNode高可用模拟的全流程——这才是本项目的真实定位:一个面向国产化终端的HDFS开发沙箱,不是PPT架构图,而是能敲出hdfs dfs -put并看到/user/xxx/input目录真实生成的实操环境。

这个实践的价值,不在于“又一个Hadoop安装教程”,而在于它直面了三个脱节:教材还在讲CentOS 7的service命令,而deepin用的是systemctl;文档默认假设你装了Oracle JDK,而deepin源里只有OpenJDK;社区讨论聚焦YARN调度优化,却没人告诉你hdfs namenode -format失败时,/usr/lib/hadoop/etc/hadoop/hdfs-site.xml里dfs.namenode.name.dir路径若含中文或空格,会导致java.io.IOException: Mkdirs failed to create /home/xxx/数据/hadoop/nn——注意,是Mkdirs failed,不是Permission denied,这种错误提示根本不会指向权限问题,而是让你在ls -l和chmod 755之间反复横跳两小时。所以,本实践的核心不是“教会你怎么装”,而是“带你绕开所有deepin+Hadoop组合下,前人踩过的、文档没写的、报错不提示真实原因的暗坑”。适合谁?正在用deepin做课程设计的学生、需要在信创环境验证数据管道的ETL工程师、以及所有厌倦了“换个系统就全崩”的Hadoop初学者。它不承诺替代Cloudera Manager,但保证你能在自己笔记本上,用hdfs dfs -ls /看到真实的目录树,并用Java代码成功写入一个SequenceFile。

2. 环境构建与核心依赖解析:从JDK版本锁死到systemd服务注册

2.1 JDK 8的精准锁定与环境变量陷阱

Hadoop 3.1.3对JDK的依赖不是“建议使用JDK 8”,而是字节码层面的硬性绑定。其源码中大量使用sun.misc.Unsafe的旧版方法签名,JDK 11已将其移至jdk.unsupported模块且默认禁用。直接运行java -version显示11.0.11,然后执行hdfs namenode -format,你会看到类似这样的堆栈:

Exception in thread "main" java.lang.UnsupportedClassVersionError: org/apache/hadoop/hdfs/server/namenode/NameNode has been compiled by a more recent version of the Java Runtime (class file version 52.0), please compile it with a newer version of the Java Runtime

注意:这里说的“more recent version”是反话——class file version 52.0对应JDK 8,而你的JDK 11运行时试图加载JDK 8编译的类,却因内部API变更失败。解决方案只有一个:彻底卸载JDK 11,安装JDK 8u292(最后一个公开更新的JDK 8版本)。deepin 20.1的apt源不提供JDK 8,必须手动下载。我试过三种方式:

  • 方式一:从Adoptium官网下载OpenJDK8U-jdk_x64_linux_hotspot_8u292b10.tar.gz,解压到/opt/java/jdk8;
  • 方式二:用sdkman安装(curl -s "https://get.sdkman.io" | bash),但deepin 20.1的bash版本较老,sdkman初始化脚本会报declare: -A: invalid option,需先升级bash;
  • 方式三:最稳方案——直接用wget从华为开源镜像站(https://mirrors.huaweicloud.com/adoptium/8/jdk/x64/linux/)下载,校验SHA256后解压。

关键陷阱在环境变量配置。很多人把export JAVA_HOME=/opt/java/jdk8写进~/.bashrc,这会导致sudo hdfs namenode -format失败——因为sudo默认不继承用户环境变量,JAVA_HOME为空,系统调用默认JDK 11。正确做法是:

  1. 将JAVA_HOME写入/etc/environment(全局生效,sudo可读);
  2. 同时在/etc/profile.d/java8.sh中添加export JAVA_HOME=/opt/java/jdk8和export PATH=$JAVA_HOME/bin:$PATH;
  3. 执行source /etc/profile并验证sudo $JAVA_HOME/bin/java -version输出1.8.0_292。

提示:hadoop-env.sh中的export JAVA_HOME必须与系统级JAVA_HOME一致,否则start-dfs.sh启动时,namenode进程用的是hadoop-env.sh里的JDK,而datanode可能继承了shell的JDK,导致进程间通信失败。这是deepin环境下最隐蔽的“双JDK冲突”。

2.2 Hadoop 3.1.3源码编译与deb包适配

官方提供的hadoop-3.1.3.tar.gz是为CentOS/RHEL构建的,其sbin/start-dfs.sh脚本里硬编码了/etc/init.d/hadoop-hdfs-namenode路径,而deepin用systemd。若强行运行,会报/etc/init.d/hadoop-hdfs-namenode: No such file or directory。有人建议改脚本,但更彻底的方案是:用deepin的build-essential工具链,从Hadoop 3.1.3源码重新编译deb包。步骤如下:

  1. 安装编译依赖:sudo apt install build-essential libssl-dev libsasl2-dev libxml2-dev libsnappy-dev libprotobuf-dev protobuf-compiler maven;
  2. 下载hadoop-3.1.3-src.tar.gz,解压后进入目录;
  3. 修改pom.xml,将hadoop-project模块的<hadoop.version>设为3.1.3,确保版本一致;
  4. 执行mvn clean package -Pdist,native -DskipTests -Dtar,耗时约25分钟(i5-8250U实测);
  5. 编译成功后,hadoop-dist/target/hadoop-3.1.3.tar.gz即为适配Debian系的包。

重点来了:编译后的包里,sbin/目录下新增了hadoop-daemon.sh的systemd封装脚本,且share/hadoop/hdfs/下的hdfs-default.xml已针对Debian路径做了微调。但仍有两处需手动修改:

  • etc/hadoop/hadoop-env.sh第221行:export HADOOP_PID_DIR=${HADOOP_PID_DIR:-"/var/run/hadoop"}→ 改为/var/run/hadoop-hdfs,避免与YARN PID冲突;
  • etc/hadoop/core-site.xml中fs.defaultFS的值,若用hdfs://localhost:9000,在deepin的/etc/hosts里必须确保127.0.0.1 localhost未被注释,否则hdfs dfs -ls /会卡在Connecting to xxx超时。

注意:不要用apt install hadoop安装,deepin源里的hadoop包是2.7.x版本,与3.1.3的RPC协议不兼容,hdfs dfsadmin -report会返回Connection refused而非预期的DataNode列表。

2.3 systemd服务单元文件的手动注册

Hadoop 3.1.3原生不提供systemd服务文件,必须手写。我在/lib/systemd/system/下创建了三个文件:

  • hadoop-hdfs-namenode.service:管理NameNode;
  • hadoop-hdfs-datanode.service:管理DataNode;
  • hadoop-hdfs-secondarynamenode.service:管理SecondaryNameNode。

以NameNode为例,其内容核心段为:

[Unit] Description=Hadoop HDFS NameNode After=network.target [Service] Type=forking User=hdfs Group=hdfs Environment="HADOOP_HOME=/opt/hadoop" Environment="HADOOP_CONF_DIR=/opt/hadoop/etc/hadoop" PIDFile=/var/run/hadoop-hdfs/hadoop-hdfs-namenode.pid ExecStart=/opt/hadoop/sbin/hadoop-daemon.sh --config /opt/hadoop/etc/hadoop start namenode ExecStop=/opt/hadoop/sbin/hadoop-daemon.sh --config /opt/hadoop/etc/hadoop stop namenode Restart=on-failure RestartSec=30 [Install] WantedBy=multi-user.target

关键细节:

  • Type=forking:因为hadoop-daemon.sh会fork子进程,systemd需跟踪PID文件;
  • User=hdfs:必须提前创建hdfs用户(sudo adduser --disabled-password --gecos "" hdfs),并赋予/opt/hadoop目录所有权(sudo chown -R hdfs:hdfs /opt/hadoop);
  • PIDFile路径必须与hadoop-env.sh中HADOOP_PID_DIR一致,否则systemctl status显示inactive (dead);
  • ExecStart命令中的--config参数不可省略,否则读取的是$HADOOP_HOME/etc/hadoop而非指定路径。

注册后执行sudo systemctl daemon-reload && sudo systemctl enable hadoop-hdfs-namenode,再sudo systemctl start hadoop-hdfs-namenode。此时sudo journalctl -u hadoop-hdfs-namenode -f可实时查看日志,比翻/var/log/hadoop-hdfs/直观得多。DataNode同理,但需注意:hadoop-hdfs-datanode.service的After字段要加上hadoop-hdfs-namenode.service,确保NameNode先启动。

3. HDFS核心操作与Java API实战:从命令行到代码的完整链路

3.1 命令行层:理解HDFS抽象路径与本地文件系统的映射关系

在deepin上执行hdfs dfs -ls /前,必须确认NameNode已格式化且运行。格式化命令hdfs namenode -format的输出末尾有一行关键信息:Storage directory /opt/hadoop/data/nn has been successfully formatted.。这个/opt/hadoop/data/nn就是NameNode的元数据存储路径,它与HDFS对外暴露的/根路径无直接对应关系。HDFS的/是逻辑根,实际数据块存储在DataNode的dfs.datanode.data.dir指定路径(如/opt/hadoop/data/dn)下,以block ID命名的二进制文件。这种抽象隔离了用户操作与物理存储,但也带来一个易错点:hdfs dfs -put localfile /remote时,若localfile路径含中文,deepin的UTF-8 locale会正常处理,但HDFS内部存储的block文件名会被转义为%E4%BD%A0%E5%A5%BD,后续用Java API读取时若未正确URLDecode,会抛FileNotFoundException。

实操中高频命令的deepin特例:

  • hdfs dfs -mkdir -p /user/deepin:-p参数必须加,否则/user不存在时会报Parent path is not a directory;
  • hdfs dfs -put ~/test.txt /input/:~/会被shell展开为绝对路径,但HDFS不识别~,必须写/home/xxx/test.txt;
  • hdfs dfs -cat /input/test.txt | head -20:管道符|在deepin的bash中有效,但若用zsh可能需加setopt SH_WORD_SPLIT,建议统一用bash;
  • hdfs dfsadmin -safemode get:检查安全模式状态,新格式化的集群默认处于安全模式,需等DataNode心跳注册完成(约30秒)才能退出。

实操心得:hdfs dfs -du -h /查看磁盘使用时,deepin的du命令默认不显示隐藏文件,而HDFS的/tmp目录下有.reserved/raw等隐藏路径,需加-a参数(hdfs dfs -du -ha /)才能看到完整占用。很多学员以为磁盘没满,其实是/tmp占用了90%空间却没被du统计。

3.2 Java API开发:Maven依赖、配置注入与异常捕获的深度实践

HDFS Java客户端开发,在deepin上最常遇到的不是代码问题,而是classpath污染和配置加载顺序。新建Maven项目,pom.xml中必须声明:

<dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>3.1.3</version> <exclusions> <exclusion> <groupId>jdk.tools</groupId> <artifactId>jdk.tools</artifactId> </exclusion> </exclusions> </dependency>

排除jdk.tools是因为JDK 8u292中该jar已移除,不排除会导致NoClassDefFoundError。同时,hadoop-client会传递引入slf4j-log4j12,而deepin的log4j版本可能冲突,需显式排除:

<exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion>

配置文件注入是另一大坑。Hadoop客户端默认从$HADOOP_HOME/etc/hadoop/加载core-site.xml和hdfs-site.xml,但IDEA或Eclipse中运行时,$HADOOP_HOME环境变量可能未生效。正确做法是在Java代码中显式加载:

Configuration conf = new Configuration(); conf.addResource(new Path("/opt/hadoop/etc/hadoop/core-site.xml")); conf.addResource(new Path("/opt/hadoop/etc/hadoop/hdfs-site.xml")); FileSystem fs = FileSystem.get(URI.create("hdfs://localhost:9000"), conf);

注意:URI.create("hdfs://localhost:9000")中的localhost必须与core-site.xml中fs.defaultFS值完全一致,包括端口号。若core-site.xml写的是hdfs://127.0.0.1:9000,而代码用localhost,则会因DNS解析失败连接超时。

异常捕获的实战要点:

  • FileAlreadyExistsException:hdfs dfs -put时目标已存在,但Java API中fs.copyFromLocalFile()默认覆盖,需手动fs.delete(new Path(dst), true);
  • SafeModeException:集群处于安全模式,需等待或调用fs.setSafeMode(HdfsConstants.SafeModeAction.SAFEMODE_LEAVE, false)(需管理员权限);
  • AccessControlException:deepin的hdfs用户对/user/deepin目录无写权限,需sudo -u hdfs hdfs dfs -chown deepin:deepin /user/deepin。

踩坑记录:用fs.listStatus(new Path("/"))遍历根目录时,deepin环境下返回的FileStatus对象中getPath().toString()会包含hdfs://localhost:9000/前缀,而某些旧版工具类(如Apache Commons IO)的FilenameUtils.getName()会把整个URI当文件名处理,导致NullPointerException。解决方案是调用getPath().getName()获取纯文件名。

3.3 权限模型与ACL实战:deepin用户与HDFS用户的映射逻辑

HDFS的权限模型是POSIX风格的rwx,但其用户认证依赖于客户端操作系统的用户名。在deepin上,当你以xxx用户执行hdfs dfs -ls /,HDFS会认为请求来自xxx用户,而非hdfs。这意味着:

  • 若/user/xxx目录属主是xxx,则hdfs dfs -put成功;
  • 若/user/xxx属主是hdfs,则hdfs dfs -put报Permission denied。

解决此问题有两种路径:
路径一:同步本地用户与HDFS用户

sudo -u hdfs hdfs dfs -mkdir -p /user/xxx sudo -u hdfs hdfs dfs -chown xxx:xxx /user/xxx

这样xxx用户就能操作自己的/user/xxx目录。

路径二:启用HDFS ACL(访问控制列表)
在hdfs-site.xml中添加:

<property> <name>dfs.namenode.acls.enabled</name> <value>true</value> </property>

重启NameNode后,可为目录添加ACL:

hdfs dfs -setfacl -m user:otheruser:r-x /user/xxx

此时otheruser可读/user/xxx下的文件,但不能写。ACL优先级高于POSIX权限,且支持多用户授权,比单纯chown更灵活。

关键提醒:deepin的id -u命令返回的UID是1000,而HDFS不关心UID,只认用户名字符串。因此,不同deepin机器上的xxx用户,在HDFS看来是同一个用户,这正是HDFS跨节点共享权限的基础。但若在集群中混用CentOS和deepin节点,需确保所有节点的/etc/passwd中用户名一致,否则hdfs dfs -ls在不同节点显示不同权限。

4. 故障排查与性能调优:deepin特有的日志定位与内存参数优化

4.1 日志体系深度解析:从journalctl到滚动日志的关联追踪

deepin的systemd日志与Hadoop原生日志是两套体系,必须学会交叉验证。当hdfs dfs -ls /返回Connection refused时,按以下顺序排查:

  1. systemd服务状态:sudo systemctl status hadoop-hdfs-namenode,看是否active (running),若为failed,执行sudo journalctl -u hadoop-hdfs-namenode -n 50 --no-pager查看最后50行;
  2. NameNode进程是否存在:sudo ps aux | grep namenode,若无进程,说明start-dfs.sh启动失败;
  3. Hadoop原生日志:sudo tail -n 100 /var/log/hadoop-hdfs/hadoop-hdfs-namenode-*.log,重点看ERROR和FATAL行;
  4. 端口监听状态:sudo ss -tuln | grep :9000,若无输出,说明NameNode未监听9000端口,可能是core-site.xml中fs.defaultFS端口配置错误;
  5. 防火墙状态:deepin默认关闭ufw,但若开启,需sudo ufw allow 9000。

日志关联的关键技巧:systemd日志中的时间戳(如Mar 15 10:23:45)与hadoop-hdfs-namenode-*.log中的时间戳(如2023-03-15 10:23:45,123)可精确对齐。例如,systemd日志显示Started Hadoop HDFS NameNode,紧接着hadoop-hdfs-namenode-*.log中出现STARTUP_MSG: Starting NameNode,说明启动流程正常;若systemd显示Started,但日志无STARTUP_MSG,则NameNode进程已崩溃,需查hs_err_pid*.log(JVM崩溃日志)。

实操心得:hadoop-hdfs-namenode-*.log默认按天滚动,但deepin的logrotate配置可能未覆盖/var/log/hadoop-hdfs/目录。需手动编辑/etc/logrotate.d/hadoop-hdfs,添加:

/var/log/hadoop-hdfs/*.log { daily missingok rotate 30 compress delaycompress notifempty create 644 hdfs hdfs }

4.2 内存参数调优:针对deepin 20.1的JVM堆大小设置

Hadoop 3.1.3在deepin 20.1上默认JVM堆大小过小,NameNode容易OOM。hadoop-env.sh中HADOOP_NAMENODE_OPTS默认为-Xmx1000m,但对于单机开发环境,应根据deepin物理内存调整:

  • 8GB内存机器:-Xmx4g -Xms4g -XX:+UseG1GC;
  • 16GB内存机器:-Xmx8g -Xms8g -XX:+UseG1GC。

关键参数解释:

  • -Xms与-Xmx设为相等,避免JVM运行时动态扩容,减少GC停顿;
  • -XX:+UseG1GC:G1垃圾收集器在deepin 20.1的OpenJDK 8u292中稳定,比默认的Parallel GC更适合NameNode的混合对象分配模式;
  • 避免使用-XX:+UseParallelGC,它在NameNode元数据缓存场景下会导致频繁Full GC。

DataNode的调优重点在dfs.datanode.max.transfer.threads(默认4096),deepin的ulimit -n默认为1024,若不调整,DataNode启动时会报Too many open files。解决方案:

  1. sudo vi /etc/security/limits.conf,添加:
    hdfs soft nofile 65536 hdfs hard nofile 65536
  2. sudo vi /etc/systemd/system.conf,添加:
    DefaultLimitNOFILE=65536
  3. 重启systemd:sudo systemctl daemon-reload。

注意:ulimit设置对systemd服务生效需重启systemd-logind.service,但更简单的方法是重启机器,确保所有限制生效。

4.3 网络与DNS故障的deepin专属排查法

deepin 20.1的/etc/nsswitch.conf中hosts行默认为files mdns4_minimal [NOTFOUND=return] dns,其中mdns4_minimal会尝试mDNS解析,导致hdfs dfs -ls hdfs://myhost:9000时,若myhost未在/etc/hosts中定义,会卡在mDNS查询超时(默认5秒)。解决方案:

  • 方法一:在/etc/hosts中添加127.0.0.1 myhost;
  • 方法二:修改/etc/nsswitch.conf,将mdns4_minimal [NOTFOUND=return]改为dns,即hosts: files dns。

另一个深坑是IPv6优先问题。deepin默认启用IPv6,hdfs dfs -ls hdfs://[::1]:9000会尝试IPv6连接,但Hadoop 3.1.3的core-site.xml中fs.defaultFS若写hdfs://localhost:9000,localhost在/etc/hosts中同时映射IPv4和IPv6(::1 localhost),JVM会优先选IPv6,而NameNode默认只监听IPv4。验证方法:sudo ss -tuln | grep :9000,若只显示127.0.0.1:9000,则IPv6未监听。强制禁用IPv6:在hadoop-env.sh中添加:

export HADOOP_OPTS="$HADOOP_OPTS -Djava.net.preferIPv4Stack=true"

重启NameNode后,ss -tuln会显示127.0.0.1:9000,且hdfs dfs -ls /响应速度从10秒降至0.2秒。

最后分享一个独家技巧:当hdfs dfs -ls /返回java.net.ConnectException: Connection refused,但telnet localhost 9000能连上时,大概率是Hadoop的RPC协议版本不匹配。检查hadoop version输出的Compiled by字段,若显示centos而非debian,说明你用了官方tar包而非deepin编译包,必须重做2.2节的源码编译。

5. 进阶扩展与生产化准备:从单机沙箱到轻量集群的平滑演进

5.1 单机伪分布式到双节点集群的无缝迁移

本实践的终极价值,是让deepin用户能从单机环境平滑过渡到最小可行集群。伪分布式(Pseudo-Distributed)模式下,NameNode、DataNode、SecondaryNameNode均在同一台deepin机器运行,配置文件hdfs-site.xml中:

<property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>dfs.namenode.http-address</name> <value>localhost:9870</value> </property>

要升级为双节点集群(一台NameNode,一台DataNode),只需三步:

  1. 网络互通:在DataNode机器(另一台deepin)上,sudo vi /etc/hosts,添加NameNode的IP和主机名(如192.168.1.100 nn1);
  2. SSH免密登录:在NameNode上ssh-keygen -t rsa,ssh-copy-id -i ~/.ssh/id_rsa.pub hdfs@192.168.1.100;
  3. 配置分发:将NameNode的/opt/hadoop/etc/hadoop/目录打包,scp到DataNode的相同路径,并修改DataNode的hdfs-site.xml:
    <property> <name>dfs.namenode.http-address</name> <value>nn1:9870</value> </property> <property> <name>dfs.client.use.datanode.hostname</name> <value>false</value> </property>
    dfs.client.use.datanode.hostname=false确保客户端通过IP而非主机名连接DataNode,规避DNS问题。

启动时,先start-dfs.sh在NameNode,再hadoop-daemon.sh start datanode在DataNode。hdfs dfsadmin -report会显示两个Live DataNode,证明集群已就绪。

注意:deepin的ufw在DataNode上必须放行50010(DataNode数据传输端口)、50020(DataNode IPC端口)、50075(DataNode HTTP端口),否则NameNode无法注册DataNode。

5.2 Web UI与监控集成:利用deepin原生工具构建可观测性

Hadoop的Web UI(http://localhost:9870)在deepin上可直接访问,但默认只监听127.0.0.1,若想从局域网其他机器访问,需修改hdfs-site.xml:

<property> <name>dfs.namenode.http-bind-host</name> <value>0.0.0.0</value> </property>

重启NameNode后,sudo ss -tuln | grep :9870会显示*:9870,表示监听所有接口。

更进一步,可集成deepin原生的htop和iotop进行实时监控:

  • htop:按F4搜索java,筛选出namenode和datanode进程,观察CPU和内存占用;
  • iotop -p $(pgrep -f "NameNode"):监控NameNode的磁盘IO,若SWAPIN持续为0且IO>列数值高,说明元数据操作频繁,需优化dfs.namenode.handler.count(默认10,可增至20)。

对于日志分析,deepin的grep配合-C参数极其实用:

grep -C 5 "Failed to connect" /var/log/hadoop-hdfs/hadoop-hdfs-namenode-*.log

-C 5显示匹配行前后5行,快速定位上下文。

5.3 安全加固与备份策略:deepin环境下的最小化生产准备

即使单机环境,也应遵循最小权限原则:

  • 创建专用用户:sudo adduser --disabled-login --gecos "" hadoop-svc,所有Hadoop进程以该用户运行;
  • 目录权限收紧:sudo chown -R hadoop-svc:hadoop-svc /opt/hadoop,sudo chmod 750 /opt/hadoop;
  • 禁用root运行:在hadoop-env.sh中添加export HADOOP_ROOT_ERROR="true",强制Hadoop拒绝root启动。

备份策略采用deepin原生rsync:

# 备份NameNode元数据 sudo rsync -avz /opt/hadoop/data/nn/ /backup/hadoop/nn_$(date +%Y%m%d)/ # 备份配置文件 sudo rsync -avz /opt/hadoop/etc/hadoop/ /backup/hadoop/conf_$(date +%Y%m%d)/

加入crontab:0 2 * * * /usr/bin/rsync -avz /opt/hadoop/data/nn/ /backup/hadoop/nn_$(date +\%Y\%m\%d)/(每天凌晨2点备份)。

最后一点个人体会:在deepin上做HDFS实践,最大的收获不是学会了Hadoop,而是真正理解了“操作系统抽象层”的威力。当你亲手把/etc/hosts、/etc/nsswitch.conf、systemd服务、JVM参数、Hadoop配置全部串起来,才能明白为什么一个hdfs dfs -ls /命令背后,是二十多个组件在协同工作。这种系统级的掌控感,是任何云平台托管服务都无法替代的。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询