Hadoop分布式文件系统
数据的冗余存储
(1)加快数据传输速度
(2)容易检查数据错误
(3)保证数据可靠性
数据存取策略
数据存放
HDFS默认的冗余复制因子是3,每一个文件块会被同时保存到3个地方,有两份副本放在同一个机架的不同机器上面,第三个副本凡在不同机架的机器上面
•第一个副本:放置在上传文件的数据节点;如果是集群外提交,则随机挑选一台磁盘不太满、CPU不太忙的节点
•第二个副本:放置在与第一个副本不同的机架的节点上
•第三个副本:与第一个副本相同机架的其他节点上
•更多副本:随机节点
数据读取
· HDFS提供了一个API可以确定一个数据节点所属的机架ID,客户端也可以调用API获取自己所属的机架ID
· 当客户端读取数据时,从名称节点获得数据块不同副本的存放位置列表,列表中包含了副本所在的数据节点,可以调用API来确定客户端和这些数据节点所属的机架ID,当发现某个数据块副本对应的机架ID和客户端对应的机架ID相同时,就优先选择该副本读取数据,如果没有发现,就随机选择一个副本读取数据
数据读写
读
写
java代码实现数据读写
导入jar包
cd /usr/local/hadoop
./sbin/start-dfs.sh #启动hadoop
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.fs.permission.FsAction;
import org.apache.hadoop.fs.permission.FsPermission;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
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); //fs指向HDFS的根目录
FileStatus[] status = fs.listStatus(new Path("/"));//获得当前路径的所有文件状态
fs.create(new Path("HelloWorld.txt")); //创建文件
FsPermission permission = new FsPermission(FsAction.ALL, FsAction.ALL, FsAction.ALL); //文件权限(用户,组,其他)
fs.mkdirs(new Path("Hello"), permission);//创建文件夹
FSDataInputStream input = fs.open(new Path("Hello/HelloWorld.txt"));//读
System.out.println(input.readLine());
FSDataOutputStream output = fs.create(new Path("Hello/HelloWorld.txt")); //覆盖
output.write("test".getBytes());
// FSDataOutputStream output2 = fs.append(new Path("Hello/HelloWorld.txt")); //追加
// output2.write("test2".getBytes());
fs.copyToLocalFile(new Path("Hello/HelloWorld.txt"), new Path("/usr/local/hadoop/bin/test.txt"));//下载
fs.copyFromLocalFile(new Path("/usr/local/hadoop/bin/test.txt"), new Path("Hello/HelloWorld.txt"));//上传
}
}