3.0 HDFS 配置与使用

axing
2025-09-20 / 0 评论 / 6 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2025年09月20日,已超过23天没有更新,若内容或图片失效,请留言反馈。
之前提到过的 Hadoop 三种模式:单机模式、伪集群模式和集群模式。

单机模式:Hadoop 仅作为库存在,可以在单计算机上执行 MapReduce 任务,仅用于开发者搭建学习和试验环境。

伪集群模式:此模式 Hadoop 将以守护进程的形式在单机运行,一般用于开发者搭建学习和试验环境。

集群模式:此模式是 Hadoop 的生产环境模式,也就是说这才是 Hadoop 真正使用的模式,用于提供生产级服务。

一、HDFS 配置和启动

HDFS 和数据库相似,是以守护进程的方式启动的。使用 HDFS 需要用 HDFS 客户端通过网络 (套接字) 连接到 HDFS 服务器实现文件系统的使用。
我们已经配置好了 Hadoop 的基础环境,容器名为 hadoop_single。如果你上次已经关闭了该容器或者关闭了计算机导致容器关闭,请启动并进入该容器。
进入该容器后,我们确认一下 Hadoop 是否存在:
hadoop version
#如果结果显示出 Hadoop 版本号则表示 Hadoop 存在。

1.1 新建 hadoop 用户

#新建用户,名为 hadoop:
adduser hadoop
#安装一个小工具用于修改用户密码和权限管理:
yum install -y passwd sudo
#设置 hadoop 用户密码
passwd hadoop
#接下来两次输入密码,一定要记住!
#修改 hadoop 安装目录所有人为 hadoop 用户:
chown -R hadoop /usr/local/hadoop
#然后用文本编辑器修改 /etc/sudoers 文件,在
root    ALL=(ALL)       ALL
#之后添加一行
hadoop  ALL=(ALL)       ALL
#然后退出容器。
#关闭并提交容器 hadoop_single 到镜像 hadoop_proto:
docker stop hadoop_single
docker commit hadoop_single hadoop_proto
#创建新容器 hdfs_single :
docker run -d --name=hdfs_single --privileged hadoop_proto /usr/sbin/init

1.2 启动 HDFS

#现在进入刚建立的容器:
docker exec -it hdfs_single su hadoop
#现在应该是 hadoop 用户:
whoami
#生成 SSH 密钥:
ssh-keygen -t rsa
#这里可以一直按回车直到生成结束。
#然后将生成的密钥添加到信任列表:
ssh-copy-id hadoop@172.17.0.2
#查看容器 IP 地址:
ip addr | grep 172
[hadoop@6eb1ec6bd5ce /]$ ip addr | grep 17
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
#从而得知容器的 IP 地址是 172.17.0.2
#在启动 HDFS 以前我们对其进行一些简单配置,Hadoop 配置文件全部储存在安装目录下的 etc/hadoop 子目录下,所以我们可以进入此目录:
cd $HADOOP_HOME/etc/hadoop
#这里我们修改两个文件:core-site.xml 和 hdfs-site.xml
#在 core-site.xml 中,我们在 标签下添加属性:
[hadoop@80b2f403b24e /]$ cd $HADOOP_HOME/etc/hadoop
[hadoop@80b2f403b24e hadoop]$ pwd
/usr/local/hadoop/etc/hadoop
[hadoop@80b2f403b24e hadoop]$ cat  ./core-site.xml 
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License. See accompanying LICENSE file.
-->

<!-- Put site-specific property overrides in this file. -->

<configuration>
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://192.168.30.50:9000</value>
  </property>
</configuration>


[hadoop@80b2f403b24e hadoop]$ 


[hadoop@80b2f403b24e hadoop]$ cat  ./hdfs-site.xml 
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
  <property>
    <name>dfs.namenode.name.dir</name>
    <value>file:///usr/local/hadoop/dfs/name</value>
  </property>
  <property>
    <name>dfs.datanode.data.dir</name>
    <value>file:///usr/local/hadoop/dfs/data</value>
  </property>

  <property>
    <name>dfs.replication</name>
    <value>1</value>
  </property>

  <property>
    <name>dfs.namenode.rpc-address</name>
    <value>192.168.30.50:9000</value>
  </property>
  <property>
    <name>dfs.namenode.rpc-bind-host</name>
    <value>0.0.0.0</value>
  </property>

  <property>
    <name>dfs.namenode.http-address</name>
    <value>192.168.30.50:9870</value>
  </property>
  <property>
    <name>dfs.namenode.http-bind-host</name>
    <value>0.0.0.0</value>
  </property>

  <property>
    <name>dfs.client.use.datanode.hostname</name>
    <value>true</value>
  </property>
  <property>
    <name>dfs.datanode.use.datanode.hostname</name>
    <value>true</value>
  </property>
  <property>
    <name>dfs.datanode.hostname</name>
    <value>192.168.30.50</value>
  </property>
  <property>
    <name>dfs.datanode.address</name>
    <value>0.0.0.0:9866</value>
  </property>
  <property>
    <name>dfs.datanode.http.address</name>
    <value>0.0.0.0:9864</value>
  </property>
</configuration>

# 建日志与数据目录
sudo mkdir -p /usr/local/hadoop/logs
sudo mkdir -p /usr/local/hadoop/dfs/{name,data}

# 把这些目录交给 hadoop 用户
sudo chown -R hadoop:hadoop /usr/local/hadoop/logs
sudo chown -R hadoop:hadoop /usr/local/hadoop/dfs
docker stop hdfs_single
[root@k8s-01 /]# docker run -d --name hdfs_single2 \
  --privileged --cgroupns=host \
  -v /sys/fs/cgroup:/sys/fs/cgroup:ro \
  -p 9870:9870 \
  -p 9000:9000 \
  -p 9864:9864 \
  -p 9866:9866 \
  hadoop_proto:with-hdfs /usr/sbin/init
80b2f403b24eb1458cc2dbc852eeb50a46119f4f355f5a7ba0c204b32e288486

mfsa96yh.png
mfsdfzje.png

到此为止,HDFS 守护进程已经建立,由于 HDFS 本身具备 HTTP 面板,我们可以通过浏览器访问http://你的节点IP:9870/来查看 HDFS 面板以及详细信息:
mfsdg5tj.png

二、HDFS 使用
2.1 HDFS Shell

#回到 hdfs_single 容器,以下命令将用于操作 HDFS:
# 显示根目录 / 下的文件和子目录,绝对路径
hadoop fs -ls /
# 新建文件夹,绝对路径
hadoop fs -mkdir /hello
# 上传文件
hadoop fs -put hello.txt /hello/
# 下载文件
hadoop fs -get /hello/hello.txt
# 输出文件内容
hadoop fs -cat /hello/hello.txt
#HDFS 最基础的命令如上所述,除此之外还有许多其他传统文件系统所支持的操作。

mfsdxa94.png

2.2 HDFS API

HDFS 已经被很多的后端平台所支持,目前官方在发行版中包含了 C/C++ 和 Java 的编程接口。此外,node.js 和 Python 语言的包管理器也支持导入 HDFS 的客户端。

以下是包管理器的依赖项列表:

Maven:
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-client</artifactId>
        <version>3.1.4</version>
    </dependency>
    
Gradle:
providedCompile group: 'org.apache.hadoop', name: 'hadoop-hdfs-client', version: '3.1.4'

NPM:
npm i webhdfs 

pip:
pip install hdfs
#这里提供一个 Java 连接 HDFS 的例子(别忘了修改 IP 地址):
package com.runoob;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
public class Application {
    public static void main(String[] args) {
        try {
            // 配置连接地址
            Configuration conf = new Configuration();
            conf.set("fs.defaultFS", "hdfs://172.17.0.2:9000");
            FileSystem fs = FileSystem.get(conf);
            // 打开文件并读取输出
            Path hello = new Path("/hello/hello.txt");
            FSDataInputStream ins = fs.open(hello);
            int ch = ins.read();
            while (ch != -1) {
                System.out.print((char)ch);
                ch = ins.read();
            }
            System.out.println();
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }
}
0

评论 (0)

取消