一、简介
1.什么是HDFS?
利用网络将文件存储在多个主机上
2.特点
1)流数据读写:HDFS目标是处理批量数据,为了提高数据吞吐量,采用流数据的读取方式;
2)简单一致的文件模型:一次写入、多次读取的简单模型,文件一次写入,之后只能读取;
3)超大规模数据集:可以存储PB级别的数据;
4)高可用性:可以自动检测硬件故障,并自动恢复;
3.基本概念
1)数据块
默认块的大小为64M,大于一般的文件系统,目的是最小化寻址空间。但是由于mapreduce一次只能处理一个数据块,块太大时会影响map任务的数量,降低并行处理速度。
数据分块有一下几个好处:第一、文件大小可以大于任一磁盘的大小;第二、简化系统设计,计算每个磁盘可以存储多少个块就好了;第三、方便数据备份
2)命名空间
HDFS中文件存储的命名空间包含目录、文件和块(普通文件系统只有目录和块)。
3)namenode
一个HDFS集群中只有一个namenode,该节点负责管理该集群的命名空间(不太好理解),包括两个文件 FsImage和EditLog(这个永久存储在本地磁盘)。其中FsImage维护系统文件树及文件夹中所有的文件和文件夹元数据(只涉及文件夹和文件);EditLog负责记录所有对文件的创建、删除、重命名等操作。namenode中还存储了文件中各个块的存储位置,但不是永久存储,而是在每次HDFS启动时由datanode创建,通知namenode保存.
4)datanode
负责数据的存储和读取,定期向namenode发送自己所存储的块的列表。
二、实践
1.利用shell进行交互
在HDFS中文件是以块的形式存储在本地linux文件系统中,没有绝对路径(即cd命令不可用),是相对路径,相对于当前用户的路径,比如hadoop fs -ls a/xx 访问的是相对于当前用户(/user/lpq)的相对路径,如果写完整就是/user/lpq/a/xx
1)启动hadoop
格式化namenode的命令: hdfs namenode -format
启动hdfs: start-dfs.sh
2) hdfs文件系统的根路径是"/"
hadoop fs -mkdir /input
hadoop fs -ls /
Found 1 items
drwxr-xr-x - lpq supergroup 0 2016-10-10 23:04 input
2.利用java API交互
1)写入文件
public static void main(String[] args) {
// TODO Auto-generated method stub
try{
//设置hdfs的配置文件中配置节
Configuration conf=new Configuration();
//为什么去掉下面的两行就不行
conf.set("fs.defaultFS","hdfs://localhost:9000" );
conf.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");
//1.利用设置的配置文件来实例化FileSystem
FileSystem fs =FileSystem.get(conf);
byte[] buffer="Hello world!".getBytes();
String Filename="test";
//设置HDFS的输入流
FSDataOutputStream os=fs.create(new Path(Filename));
//写入数据
os.write(buffer,0,buffer.length);
System.out.println("creat "+Filename);
os.close();
fs.close();
}
catch(Exception e){
e.printStackTrace();
}
}
}
2)读取文件
package chapter3;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.FSDataInputStream;
public class Chapter3_2 {
public static void main(String[] args) {
try{
Configuration conf=new Configuration();
conf.set("fs.defaultFS","hdfs://localhost:9000" );
conf.set("fs.hdfs.impl", "org.apache.hado