G
N
I
D
A
O
L

Hadoop-Hdfs


Hadoop-Hdfs

前置教程:Hadoop安装配置:openeuler-hadoop安装配置 | Angels-D

文件系统扩容

HDFS文件系统默认存储目录取决于core-site.xml文件内的hadoop.tmp.dir参数

文件系统的目录通过hdfs-site.xml文件内的dfs.datanode.data.dir参数修改,其目录可以多个,使用逗号隔开

  1. 查看当前文件系统的datanode和存储目录

    浏览器打开NN Web网页,端口一般为9720

    NN Web

    进入Datanodes栏目,查看当前文件系统节点储存情况

    Datanodes

  2. 在各节点调用命令 df查看当前系统磁盘使用情况 df

根据

可用查看当前空闲空间较多的目录,选择想要作为扩容的挂载点(当前home目录空闲空间较多,可作为hadoop扩容)

  1. 关闭hadoop,修改配置文件hdfs-site.xml内的dfs.datanode.data.dir

     <property>
      <name>dfs.datanode.data.dir</name>
      <value>/home/hadoop_tmp</value>
     </property>
    

    添加或修改目录,加入**/home/**下的目录,作为HDFS存储目录

  2. 重新启动hadoop,打开NN Web查看修改情况

NN Web和HttpFS使用

NN Web 中的 Browse the file system

Browse the file system

HttpFS

配置文件httpfs-site.xml,此配置文件一般保存默认即可,无需修改。

  1. hdfs-site.xml添加如下配置

    两个参数名称中的root代表的是启动hdfs服务的OS用户,应以实际的用户名称代替

     <property>  
      <name>hadoop.proxyuser.root.hosts</name>  
      <value>*</value>  
     </property>  
     <property>  
     <name>hadoop.proxyuser.root.groups</name>  
       <value>*</value>  
     </property>
    
  2. 启动/关闭httpfs hdfs --daemon start httpfshdfs --daemon stop httpfs

    默认监听端口 14000

    旧版本启动/关闭方式:sbin/httpfs.sh startsbin/httpfs.sh stop

  3. HttpFS使用

    官方文档:HttpFS – Hadoop HDFS over HTTP - Documentation Sets (apache.org)

    参考教程:TDH-使用httpFS接口操作说明_wj1298250240的博客-CSDN博客

    HttpFS采用POST/GET的方式操作文件系统

    样例:

    • 查看目录 http://#hostname#:14000/webhdfs/v1/?op=LISTSTATUS&user.name=root
    • 创建文件夹 http://#hostname#:14000/webhdfs/v1/user/abc?op=MKDIRS&user.name=root
    • 获取文件 http://#hostname#:14000/webhdfs/v1/user/abc/test.txt?op=OPEN&user.name=root

Shell 命令使用

相关实验参考 《大数据技术原理与应用》—林子雨

《大数据技术原理与应用(第2版)》教材官网_厦门大学数据库实验室 (xmu.edu.cn)

  • 向 HDFS 中上传任意文本文件,如果指定的文件在 HDFS 中已经存在,则由用户来指定是追加到原有文件末尾还是覆盖原有的文件

    if $(hdfs dfs -test -e text.txt);
    then $(hdfs dfs -appendToFile text.txt text.txt);
    else $(hdfs dfs -copyFromLocal -f text.txt text.txt);
    fi
    
  • 从 HDFS 中下载指定文件,如果本地文件与要下载的文件名称相同,则自动对下载的文件重命名

    if $(hdfs dfs -test -e text.txt);
    then $(hdfs dfs -copyToLocal text.txt ./text(1).txt);
    else $(hdfs dfs -copyToLocal text.txt ./text.txt);
    fi
    
  • 将 HDFS 中指定文件的内容输出到终端中

    hdfs dfs -cat text.txt
    
  • 显示 HDFS 中指定的文件的读写权限、大小、创建时间、路径等信息

     hdfs dfs -ls -h text.txt
    
  • 给定 HDFS 中某一个目录,输出该目录下的所有文件的读写权限、大小、创建时间、路径等信息,如果该文件是目录,则递归输出该目录下所有文件相关信息

    hdfs dfs -ls -R -h /xxx/xxxx
    
  • 提供一个 HDFS 内的文件的路径,对该文件进行创建和删除操作。如果文件所在目录不存在,则自动创建目录

    if $(hdfs dfs -test -d /xxx/xxxx);
    then $(hdfs dfs -touchz /xxx/xxxx/text.txt); 
    else $(hdfs dfs -mkdir -p /xxx/xxxx && hdfs dfs -touchz /xxx/xxxx/text.txt);
    fi
    hdfs dfs -rm /xxx/xxxx/text.txt
    
  • 提供一个 HDFS 的目录的路径,对该目录进行创建和删除操作。创建目录时,如果目录文件所在目录不存在,则自动创建相应目录;删除目录时,由用户指定当该目录不为空时是否还删除该目录

    hdfs dfs -mkdir -p /xxx/xxxx
    hdfs dfs -rmdir /xxx/xxxx
    hdfs dfs -rm -R /xxx/xxxx
    
  • 向HDFS中指定的文件追加内容,由用户指定内容追加到原有文件的开头或结尾

    #文件末尾
    hdfs dfs -appendToFile text.txt text.txt
    #文件开头
    hdfs dfs -get text.txt
    cat text.txt >> text1.txt
    hdfs dfs -copyFromLocal -f text.txt text.txt*
    
  • 删除 HDFS 中指定的文件

    hdfs dfs -rm text.txt
    
  • 在HDFS 中,将文件从源路径移动到目的路径。

hdfs dfs -mv text.txt text2.txt

外网访问HDFS

使用样例:

功能 主机 端口
NameNode C216 8020
NameNodeWeb C216 9870
SecondaryNameNode D413 9868
WebHdfs C216,D413 9840
JobHistoryServer C216 19888
YARN D413 8042

Java API 调用

  • 导入Jar包(hadoop/share/hadoop/**/*.jar
import java.net.URI;
import org.apache.hadoop.conf.*;
import org.apache.hadoop.fs.*;
public class demo {
    public static void main(String[] args) {
        FileSystem fs;
        try {
            // 获取文件系统
            fs = FileSystem.get(new URI("hdfs://demo:8020"), new Configuration(), "root");
            // 创建文件夹
            Boolean flag = fs.mkdirs(new Path("/demotest"));
            System.out.println(flag);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

WebHdfs 和 HttpFS 访问解析

在外网访问WebHdfs会发生一系列问题,使得部分功能不可用

以下是对问题的发现解析,您也可以直接跳过分析查看处理办法

问题分析

进入 NN WebBrowse the file system 可以调用 WebHdfs 傻瓜式操作

其中http://#NameNode:PORT#/webhdfs/v1/?op=#YOUROP#

  • OPMKDIRS、DELETE、GET_BLOCK_LOCATIONSLISTSTATUS 时,只需 NN Web 本端口即可正常工作。

  • OPOPEN、CREATE 时,NN Web 将发送 GET请求,获取Location响应,并跳转至 DataNode 相对应的 WebHdfs 上。

    NN Web open

可见 NN Web 需要重定向链接,而重定向的链接会指向内网,造成链接无法访问的问题

问题解决

为了解决此问题,可以通过使用 Nginx 进行服务反代,将需要的链接统一代理并重定向内部链接和重写响应内容的方式改正

  1. 服务端安装 Nginx

    参考教程:Nginx代理 | Angels-D

  2. 修改Nginx配置文件 /etc/nginx/nginx.conf

    http {
    #------------------------------#
    #-----------原有的内容-----------#
    #------------------------------#
    
        # 将Hadoop相关服务加入upstream模块
        upstream Hadoop {
            server c216:9870;
        }
        upstream YARN {
            server d413:8042;
        }
        upstream HttpFS {
            server c216:14000;
        }
        upstream HadoopHistory {
            server c216:19888;
        }
    
        #------------------------------#
        #-----------原有的内容-----------#
        #------------------------------#
    
        # 将Hadoop相关服务加入upstream模块
        # 参考主机、端口见前文
        # 此处配置反代后,相应端口的防火墙和端口映射功能不需要再打开
        server {
            location /Hadoop/ {
                proxy_pass http://Hadoop/;
                # 为css,js等文件以替换的方式重定向目录
                sub_filter ="/ ="/Hadoop/;
                # 多次替换
                sub_filter_once off; 
                # Hadoop预设无密码,外网访问不安全,可以通过Nginx设置密码
                # 安装htpassed工具 dnf install httpd-tools
                # 设置用户名和密码,并把用户名、密码保存到指定文件中:
                # htpasswd -c [passwfile] [username]
                auth_basic "请输入密码";
                auth_basic_user_file /usr/share/nginx/htpasswd.users;
            }
            location /Hadoop/HttpFS/ {
                # 添加替换对象格式(此处主要为了替换json)
                sub_filter_types text/xml application/json application/javascript;
                proxy_pass http://HttpFS/;
                sub_filter http:// /Hadoop/;
                sub_filter_once off; 
                auth_basic "请输入密码";
                auth_basic_user_file /usr/share/nginx/htpasswd.users;
                # HttpFS需要处理上传下载服务,在此添加响应请求
                proxy_set_header Content-Type application/octet-stream;
            }
            location /Hadoop/YARN/ {
                proxy_pass http://d413:8042/;
                sub_filter ="/ ="/Hadoop/YARN/;
                sub_filter_once off; 
                auth_basic "请输入密码";
                auth_basic_user_file /usr/share/nginx/htpasswd.users;
            }
            location /Hadoop/HadoopHistory/ {
                proxy_pass http://HadoopHistory/;
                sub_filter ="/ ="/Hadoop/HadoopHistory/;
                sub_filter http://d413:8042 /Hadoop/YARN/;
                sub_filter_once off; 
                auth_basic "请输入密码";
                auth_basic_user_file /usr/share/nginx/htpasswd.users;
            }
            # 重定向内部指向根目录的链接
            rewrite ^/(jmx|conf|startupProgress)(.*) /Hadoop/$1$2 permanent;
            rewrite ^/(httpfs|HttpFS)(.*) /Hadoop/HttpFS/$1 permanent;
            rewrite ^/jobhistory(.*) /Hadoop/HadoopHistory/jobhistory$1 permanent;
            location /webhdfs/ {
                set $flag_url 0;
                # Hadoop中的一些请求本身就可以访问,只需要重定向到自身就行
                if ( $arg_op ~ 'LISTSTATUS|MKDIRS|DELETE|GET_BLOCK_LOCATIONS') {
                    rewrite ^/(.*) /Hadoop/$1 permanent;
                    set $flag_url 1;
                }
                # WebHdfs无法满足上传下载等请求,在此重定向至HttpFS进行解决
                if ( $flag_url = 0){
                    set $args "$args&user.name=root";
                    rewrite ^/(.*) /Hadoop/HttpFS/$1 permanent;
                }
            }
        }
    #------------------------------#
    #-----------原有的内容-----------#
    #------------------------------#
    }
    
  3. 重启 Nginx 即可访问


文章作者: AnglesD
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 AnglesD !
评论
  目录