Windows下配置Hadoop的Java开发环境以及用Java API操作HDFS

时间:2022-06-05 01:04:05


场景

HDFS的访问方式之HDFS shell的常用命令:


在上面使用HDFS shell的方式去访问HDFS。

那么怎么使用Java API的方式去操作HDFS。

注:

关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。

实现

CentOS7上搭建Hadoop集群(入门级):

在Windows上的搭建流程和上面的流程前面类似。

首先下载hadoop的tar包,这里选择版本和上面搭建的集群的版本一致。

在windows上依托于解压工具比如7-zip将tar.gz解压成tar再进行解压成目录如下

Windows下配置Hadoop的Java开发环境以及用Java API操作HDFS

解压之后将其挪到没有中文路径和空格的目录下

下载之后如果需要编程、还需要在hadoop的bin目录下添加对应版本的hadoop.dll和wintuils.exe

https://github.com/cdarlint/winutils

下载之后将对应版本的hadoop.dll和winutils.exe复制到hadoop的bin目录下

Windows下配置Hadoop的Java开发环境以及用Java API操作HDFS

 

配置环境变量

将上面Hadoop的bin目录和sbin目录都添加到环境变量Path中

Windows下配置Hadoop的Java开发环境以及用Java API操作HDFS

修改配置文件

按照上面Centos中搭建Hadoop流程中的配置文件,依次修改Windows下同目录的配置文件

1、修改hadoop-env.cmd

修改这里的JAVA_HOME为对应目录

这里的jdk在默认路径下 ,Program Files有中文路径,可以使用

set JAVA_HOME=C:\PROGRA~1\Java\jdk1.8.0_202

进行代替

Windows下配置Hadoop的Java开发环境以及用Java API操作HDFS

2、修改core-site.xml

<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://192.168.148.128:9000</value>
    </property>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>D:\SoftWare\hadoop-2.8.0\hdfs\tmp</value>
    </property>
</configuration>

将这里的集群访问地址改为master的ip地址,将数据路径改为在Windows上的路径

3、修改hdfs-site.xml

<configuration>
    <property>
        <name>dfs.replication</name>
        <value>2</value>
    </property>
</configuration>

4、修改mapred-site.xml

<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>

5、修改yarn-site.xml

<configuration>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <name>yarn.resourcemanager.address</name>
        <value>192.168.148.128:18040</value>
    </property>
    <property>
        <name>yarn.resourcemanager.scheduler.address</name>
        <value>192.168.148.128:18030</value>
    </property>
    <property>
        <name>yarn.resourcemanager.resource-tracker.address</name>
        <value>192.168.148.128:18025</value>
    </property>
    <property>
        <name>yarn.resourcemanager.admin.address</name>
        <value>192.168.148.128:18141</value>
    </property>
    <property>
        <name>yarn.resourcemanager.webapp.address</name>
        <value>192.168.148.128:18088</value>
    </property>
</configuration>

全部改为master的ip地址

验证配置

在Windows中打开cmd

hadoop version

Windows下配置Hadoop的Java开发环境以及用Java API操作HDFS

 

然后输入

hdfs dfs -ls /

查看hdfs中根目录下所有文件

Windows下配置Hadoop的Java开发环境以及用Java API操作HDFS

 

 用Java API 操作HDFS

打开IDEA-新建一个Maven项目,pom.xml中引入依赖,这里与集群中

hadoop的版本一致。

在Maven仓库中搜索hadoop

需要如下依赖

hadoop-client
hadoop-common
hadoop-hdfs
hadoop-hdfs-client
hadoop-mapreduce-client-core
junit

pom.xml依赖如下:

<dependencies>
        <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-client -->
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>2.8.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common -->
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
            <version>2.8.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs -->
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-hdfs</artifactId>
            <version>2.8.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs-client -->
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-hdfs-client</artifactId>
            <version>2.8.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-mapreduce-client-core -->
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-mapreduce-client-core</artifactId>
            <version>2.8.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/junit/junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

然后新建包,包下新建类,类中新建main方法

package com.badao.hdfsdemo;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import java.io.IOException;


public class hellohdfs {
    public static void main(String[] args) throws IOException {
        FileSystem fileSystem = getFileSystem();
        //获取文件详情
        RemoteIterator<LocatedFileStatus> listFiles = fileSystem.listFiles(new Path("/"), true);
        while (listFiles.hasNext()){
            LocatedFileStatus status = listFiles.next();
            //输出详情
            System.out.println(status.getPath().getName());//文件名称
            System.out.println(status.getLen());//长度
            System.out.println(status.getPermission());//权限
            System.out.println(status.getOwner());//所属用户
            System.out.println(status.getGroup());//分组
            System.out.println(status.getModificationTime());//修改时间
            //获取存储的块信息
            BlockLocation[] blockLocations = status.getBlockLocations();
            for (BlockLocation blockLocation : blockLocations) {
                //获取块存储的主机节点
                String[] hosts = blockLocation.getHosts();
                for (String host : hosts) {
                    System.out.println(host);
                }
            }
        }
        fileSystem.close();
    }


    /**
     * 获取HDFS文件系统
     * @return
     * @throws IOException
     */
    public static FileSystem getFileSystem() throws IOException {
        Configuration configuration = new Configuration();
        configuration.set("fs.defaultFS","hdfs://192.168.148.128:9000");
        configuration.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");
        System.setProperty("HADOOP_USER_NAME","root");
        FileSystem fileSystem = FileSystem.get(configuration);
        return fileSystem;
    }

}

注意:

其中main方法中调用了获取HDFS文件系统的方法getFileSystem

1、configuration.set("fs.defaultFS","hdfs://192.168.148.128:9000");

这里的集群的访问地址与core-site.xml中fs.defaultFS配置的一致。

2、configuration.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");

这里的目的是:

如果不加这个就会提示:

Exception in thread "main" java.io.IOException: No FileSystem for scheme: hdfs

Windows下配置Hadoop的Java开发环境以及用Java API操作HDFS

 

hadoop filesystem相关的包有以下两个:hadoop-hdfs-xxx.jar和hadoop-common-xxx.jar(xxx是版本),而他们当中都有org.apache.hadoop.fs.FileSystem这个文件

调用的接口是hadoop-hdfs-xxx.jar中的,所以很明显No FileSystem for scheme: hdfs这个问题是因为,相同文件被覆盖了

3、System.setProperty("HADOOP_USER_NAME","root");

如果不加这个就会提示:

org.apache.hadoop.serurity.AccessControlException:Permission denied: user  =

Windows下配置Hadoop的Java开发环境以及用Java API操作HDFS

 

效果

然后运行main方法,获取HDFS根目录下所有的文件的详情

Windows下配置Hadoop的Java开发环境以及用Java API操作HDFS