Hadoop 学习
- 第三天
-
- 一、实战HDFS
- 二、HDFS的高可靠性机制
第三天
一、实战HDFS
HDFS主要提供了HDFS Web UI、HDFS Shell命令和HDFS API三种类型接口。
1.使用HDFS Web UI:
在浏览器输入NameNodeIP:50070就可以查看到HDFS文件系统的相关信息了。
2.使用HDFS Shell命令:
使用Shell命令可以对HDFS进行操作,完成文件的上传,下载,复制,查看等等操作。命令统一入口为hadoop
3.使用HDFS Java API:
HDFS提供了丰富的Java编程接口可以实现非常多的功能,要使用HDFS的JAVA API需要先导入相关的jar包,当然也可以使用maven导入相关依赖,笔者这里使用的是maven导入相关依赖,这里笔者用的是hadoop2.8.5,这里版本根据自己的做相关修改就可以了。
<dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.9.0</version>
</dependency>
</dependencies>
上面的准备工作做好之后就可以开始了,开始之前介绍URL类,使用java.net.JAVA可以很方便的打开HDFS文件系统中的文件,数据以流的形式从远程服务器传到本地,使用URL类的静态方法setURLStreamHandlerFactory设置Hadoop文件系统的URLStreamHandlerFactory,实现类FsUrlStreamHandlerFactory,此方法只在程序启动时使用,因此放在静态语句块中。具体程序如下:
package hadoop;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import org.apache.hadoop.fs.FsUrlStreamHandlerFactory;
import org.apache.hadoop.io.IOUtils;
public class HDFSURLReader {
static {
URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
}
public static void main(String[] args) {
InputStream stream = null;
String hdfsUrl = "hdfs://localhost:9000/InputDataTest/hadoop-env.sh";
try {
stream = new URL(hdfsUrl).openStream();
IOUtils.copyBytes(stream, System.out, 1024, false);
}catch (IOException e){
IOUtils.closeStream(stream);
}
}
}
通过以上代码就可以读取到文件中的数据。
HDFS JAVA API最常用的类是import org.apache.hadoop.fs.FileSystem。定义了存取和管理HDFS文件和目录的方法。具体的常见方法自行搜索,就不写出来了,下面提供如何获取FileSystem,上传和下载文件,创建和删除目录:
package hadoop;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.net.URI;
import java.net.URISyntaxException;
import java.io.IOException;
import java.net.URL;
public class HdfsApi {
FileSystem fileSystem = null; //定义一个fileSystem变量
//获取文件系统对象
public void getfileSystem() throws IOException, InterruptedException, URISyntaxException {
fileSystem = FileSystem.get(
new URI("hdfs://localhost:9000"),
new Configuration(),
"xiangtongtong"
);
}
//下载hdfs文件到本地
public void testDownload() throws IllegalArgumentException, IOException {
FSDataInputStream in = fileSystem.open(new Path("/InputDataTest/hadoop-env.sh"));
FileOutputStream out = new FileOutputStream("/Users/xiangtongtong/Desktop/jpress/hadoop.sh");
IOUtils.copyBytes(in, out, 4096, true);
}
//上传文件到hdfs
public void testUpload() throws IllegalArgumentException, IOException {
FileInputStream in = new FileInputStream("/Users/xiangtongtong/Desktop/jpress/hadoop.sh");
FSDataOutputStream out = fileSystem.create(new Path("/InputDataTest/hadoop.sh"), true);
IOUtils.copyBytes(in, out, 4096, true);
}
//创建hdfs目录
public void testMakeDir() throws IllegalArgumentException,IOException{
boolean isSuccess = fileSystem.mkdirs(new Path("/testdir"));
System.out.println(isSuccess);
}
//删除hdfs目录
public void testDel() throws IllegalArgumentException,IOException{
System.out.println(fileSystem.delete(
new Path("testdir"),
true
));
}
}
下面提供一段测试代码:
package hadoop;
import java.io.IOException;
import java.net.URISyntaxException;
public class test {
public static void main(String[] args) throws IOException, URISyntaxException, InterruptedException {
HdfsApi hdfsApi = new HdfsApi();
hdfsApi.getfileSystem();
hdfsApi.testDownload();
}
}
二、HDFS的高可靠性机制
高可靠性的目标之一就是即使在系统出错的情况下也要保证数据存储的正常。常见的三种错误是:Namenode节点出错,DataNode节点出错和数据出错。