HDFS中java API操作以及缺乏配置文件的报错

发布于:2023-01-04 ⋅ 阅读:(359) ⋅ 点赞:(0)

本部分内容是通过eclipse操作,实现本地上传文件到hdfs,从hdfs下载文件到本地磁盘,在hdfs创建、删除以及重命名目录,实现查看目录中的文件信息功能。
步骤如下:
1.配置windows下hadoop环境
如果不配置hadoop环境会报以下错误
(1)缺少winutils.exe
ERROR - Failed to locate the winutils binary in the hadoop binary path
 java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries.
(2)缺少hadoop.dll
Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
步骤:
(1)解压下载的linux平台的hadoop压缩包,(放在没有空格没有中文的路径下),在其目录下额外添加windows相关依赖文件(winutils.exe、winutils.pdb、hadoop.dll)下载地址为https://github.com/4ttty/winutils(尽可能使用与hadoop同版本的hadoop.dll,否则会报错,但不影响运行),名称是这个形式hadoop-common-2.2.0-bin-master.zip
(2)配置环境变量:HADOOP_HOME    D:\setup\hadoop-2.7.4
Path    %HADOOP_HOME%\bin
(3)把hadoop-2.7.4文件夹下bin目录下的hadoop.dll文件放到系统盘:C:\Windows\System32目录
(4)重启电脑
(5)在dos环境检查hadoop是否已安装成功:hadoop version
(6)若不成功,并且检查JAVA_HOME和HADOOP_HOME等环境变量没有错误,如果Java安装在c盘的默认路径下,没有修改过。那么将hadoop-2.7.1\etc\hadoop\hadoop-env.cmd文件中的set JAVA_HOME=%JAVA_HOME%修改成set JAVA_HOME=C:\PROGRA~1\Java\jdk1.8.0_40(注意:以上部分就是这样写,不要改!!!不要自作聪明写成C:\Program Files\Java\jdk1.8.0_40,这是行不通的!!!)
2.在eclipse选择File->New->Maven Project创建Maven工程,选择create a simple project并user defaultworkspace location->Next
GroupId:com.itcast
ArtifactId:HadoopDemo,打包方式jar
3.配置pom.xml,添加以下依赖
<dependencies>
      <dependency>
          <groupId>org.apache.hadoop</groupId>
          <artifactId>hadoop-common</artifactId>
          <version>2.7.4</version>
      </dependency>
      <dependency>
          <groupId>org.apache.hadoop</groupId>
          <artifactId>hadoop-hdfs</artifactId>
          <version>2.7.4</version>
      </dependency>
      <dependency>
          <groupId>org.apache.hadoop</groupId>
          <artifactId>hadoop-client</artifactId>
          <version>2.7.4</version>
      </dependency>
      <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>RELEASE</version>
      </dependency>
        </dependencies>
注意:若pom.xml报错:Missing artifact jdk.tools:jdk.tools:jar:1.8,再添加以下依赖关系
      <dependency>
          <groupId>jdk.tools</groupId>
          <artifactId>jdk.tools</artifactId>
          <version>1.8</version>
          <scope>system</scope>
          <systemPath>${JAVA_HOME}/lib/tools.jar</systemPath>
      </dependency>
4.在项目src文件夹下创建com.itcast.hdfsdemo包,并在其包下创建HDFS_CRUD.java文件,代码如下
注意:提前在D盘创建文件test.txt

package com.itcast.hdfsdemo;

import java.io.FileNotFoundException;
import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.BlockLocation;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.LocatedFileStatus;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.RemoteIterator;
import org.junit.Before;
import org.junit.Test;

public class HDFS_CRUD {
    FileSystem fs = null;

    @Before
    public void init() throws Exception {
        // 构造一个配置参数对象,设置一个参数:我们要访问的hdfs的URI
        Configuration conf = new Configuration();
        // 这里指定使用的是HDFS文件系统
        conf.set("fs.defaultFS", "hdfs://h1:9000");
        // 通过如下的方式进行客户端身份的设置
        System.setProperty("HADOOP_USER_NAME", "root");
        // 通过FileSystem的静态方法获取文件系统客户端对象
        fs = FileSystem.get(conf);
    }

    @Test
    public void testAddFileToHdfs() throws IOException {
        // 要上传的文件所在本地路径
        Path src = new Path("D:/test.txt");
        // 要上传到hdfs的目标路径
        Path dst = new Path("/testFile");
        // 上传文件方法
        fs.copyFromLocalFile(src, dst);
        // 关闭资源
        fs.close();
    }
    //从hdfs下载文件testFile到本地磁盘D盘
    public void testDownloadFileToLacal() throws IOException{
        fs.copyToLocalFile(new Path("testFile"), new Path("D:/"));
    }
    //在hdfs创建目录/a/b/c和a1/a2/a3,重命名目录a为M,删除目录a2
    @Test
    public void testMkdirAndDeleteAndRename() throws Exception{
        fs.mkdirs(new Path("/a/b/c"));
        fs.mkdirs(new Path("/a1/a2/a3"));
        fs.rename(new Path("/a"), new Path("/M"));
        fs.delete(new Path("/a2"),true);
    }
    //
    @Test
    public void testListFiles() throws FileNotFoundException,IllegalArgumentException,IOException{
        RemoteIterator<LocatedFileStatus> listFiles=fs.listFiles(new Path("/"), true);
        while(listFiles.hasNext()) {
            LocatedFileStatus fileStatus=listFiles.next();
            System.out.println(fileStatus.getPath().getName());
            // 打印当前文件名
            System.out.println(fileStatus.getPath().getName());
            // 打印当前文件块大小
            System.out.println(fileStatus.getBlockSize());
            // 打印当前文件权限
            System.out.println(fileStatus.getPermission());
            // 打印当前文件内容长度
            System.out.println(fileStatus.getLen());
            // 获取该文件块信息(包含长度,数据块,datanode的信息)
            BlockLocation[] blockLocations = fileStatus.getBlockLocations();
            for (BlockLocation bl : blockLocations) {
            System.out.println("block-length:" + bl.getLength() + "--" + "block-offset:" + bl.getOffset());
            String[] hosts = bl.getHosts();
            for (String host : hosts) {
            System.out.println(host);
            }
                        }
            System.out.println("----------------------------");
        }
    }
    
}


5.若出现nativeIO错误,解决办法如下(好像前边不应该将它加上....根据实际情况吧):
删除hadoop\bin\hadoop.dll,删除c:\windows\system32\hadoop.dll
6.解决eclipse相关插件问题:
下载的eclipse-hadoop-plugs放到eclipse的plugs文件夹下,再次打开eclipse就是没有hadoop的插件,插件并没有安装成功。
 将eclipse-hadoop-plugs 放在dropins文件夹下
只是解决了插件问题

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到