zoukankan      html  css  js  c++  java
  • Windows下配置Hadoop的Java开发环境以及用Java API操作HDFS

    场景

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

    https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/119351218

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

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

    注:

    博客:
    https://blog.csdn.net/badao_liumang_qizhi
    关注公众号
    霸道的程序猿
    获取编程相关电子书、教程推送与免费下载。

    实现

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

    https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/119335883

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

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

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

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

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

    https://github.com/cdarlint/winutils

    或者

    https://download.csdn.net/download/BADAO_LIUMANG_QIZHI/20691010

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

    配置环境变量

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

    修改配置文件

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

    1、修改hadoop-env.cmd

    修改这里的JAVA_HOME为对应目录

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

    set JAVA_HOME=C:PROGRA~1Javajdk1.8.0_202

    进行代替

    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:SoftWarehadoop-2.8.0hdfs	mp</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

    然后输入

    hdfs dfs -ls /

    查看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

    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  =

     

    效果

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

    博客园: https://www.cnblogs.com/badaoliumangqizhi/ 关注公众号 霸道的程序猿 获取编程相关电子书、教程推送与免费下载。
  • 相关阅读:
    java.lang.IllegalArgumentException: When allowCredentials is true, allowedOrigins cannot contain the special value "*" since that cannot be set on the "Access-Control-Allow-Origin" response header.
    spring-session-data-redis依赖冲突问题
    centos7启动iptables时报Job for iptables.service failed because the control process exited with error cod
    图片上传后台服务报内存溢出 Out Of Memory Java heap space
    mysql 数据库密码忘记重置 进行远程连接
    打Jar包
    Type interface com.innovationV2.mapper.UserMapper is not known to the MapperRegistry
    关于java基础类型Integer String的clone()
    clion使用clang编译
    token & refresh token 机制总结
  • 原文地址:https://www.cnblogs.com/badaoliumangqizhi/p/15097862.html
Copyright © 2011-2022 走看看