本部分内容是通过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文件夹下
只是解决了插件问题