初识HDFS

190 阅读2分钟

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"));//上传
    }
}