HDFS(分布式文件存储)
解决海量分布式存储问题。
分布式文件系统在计算机集群中由多个节点构成,分为以下两类节点
- 主节点:名称节点(NameNode)在内存中存储元数据,数据目录,保存数据块与数据节点的映射关系
- 从节点:数据节点(DataNode)存储具体数据到磁盘
HDFS不满足实时读写的需求,只允许追加,不允许随意读写。
块
一个文件被分为很多数据块,以块作为数据存储单位。每个块都将做冗余备份。
读过程
客户端输入流询问名称节点离客户机最近的数据节点,读取数据,再询问名称节点后续数据依次反复。
写过程
客户端输出流询问名称节点要写入到哪些数据节点,进行流水线复制,数据包由客户端传到第一个数据节点再传到第二个数据节点…发确认包确认收到返回客户端。
JavaAPI读写
写
try {
//加载配置
Configuration conf = new Configuration();
conf.set("fs.defaultFS","hdfs://localhost:9000");
conf.set("fs.hdfs.impl","org.apache.hadoop.hdfs.DistributedFileSystem");
//FileSystem内容封装的是DistrubitFileSystem
FileSystem fs = FileSystem.get(conf);
byte[] buff = "Hello world".getBytes(); // 要写入的内容
String filename = "test"; //要写入的文件名
//FSDataOutputStream内部封装DFSDataOutputStream
FSDataOutputStream os = fs.create(new Path(filename));
os.write(buff,0,buff.length);
System.out.println("Create:"+ filename);
os.close();
fs.close();
} catch (Exception e) {
e.printStackTrace();
}
读
try {
String filename = "test";
Configuration conf = new Configuration();
conf.set("fs.defaultFS","hdfs://localhost:9000");
conf.set("fs.hdfs.impl","org.apache.hadoop.hdfs.DistributedFileSystem");
FileSystem fs = FileSystem.get(conf);
if(fs.exists(new Path(filename))){
System.out.println("文件存在");
}else{
System.out.println("文件不存在");
}
fs.close();
} catch (Exception e) {
e.printStackTrace();
}
Hadoop平台运行jar包
./bin/hadoop jar jar包名
几个常用的shell命令
目录操作
./bin/hdfs dfs -mkdir -p /user/hadoop 创建目录/user/hadoop多级目录加上-p
./bin/hdfs dfs -ls 查看目录
./bin/hdfs dfs –rm –r /input 删除根目录下的input目录
文件操作
./bin/hdfs dfs -put source dst 上传文件到HDFS
./bin/hdfs dfs –cat dst 查看文件
./bin/hdfs dfs -get source dst 从HDFS下载到本地
./bin/hdfs dfs -cp input/myLocalFile.txt /input 将相对路径下的myLocalFile拷贝到根目录下,在HDFS间拷贝