hdfs基本架构:1 Master(NameNode/NN) 带 N个Slaves(DataNode/DN)
1个文件会被拆分成多个Block
blocksize:128M
130M ==> 2个Block: 128M 和 2M
NN(NameNode):
1)负责客户端请求的响应
2)负责元数据(文件的名称、副本系数、Block存放的DN)的管理
DN(DataNode):
1)存储用户的文件对应的数据块(Block)
2)要定期向NN发送心跳信息,汇报本身及其所有的block信息,健康状况
A typical deployment has a dedicated machine that runs only the NameNode software.
Each of the other machines in the cluster runs one instance of the DataNode software.
The architecture does not preclude running multiple DataNodes on the same machine
but in a real deployment that is rarely the case.
NameNode + N个DataNode
建议:NN和DN是部署在不同的节点上
replication factor:副本系数、副本因子
All blocks in a file except the last block are the same size
我自己的使用习惯:
hadoop/hadoop
/home/hadoop
software: 存放的是安装的软件包
app : 存放的是所有软件的安装目录
data: 存放的是课程中所有使用的测试数据目录
source: 存放的是软件源码目录,spark
Hadoop shell的基本使用(分为两种)
hdfs dfs
hadoop fs
hdfs的基本操作:
vi hello.txt
hadoop fs -put hello.txt /
hadoop fs -ls /
hadoop fs -text /hello.txt
hadoop fs -mkdir /test
hadoop fs -mkdir -p /test/a
hadoop fs -ls -R /
hadoop fs -copyFromLocal hello.txt /test/a/h.txt
hadoop fs -get /test/a/h.txt
hadoop fs -rm /h.txt
Hdfs在java中的开发:1)
project添加hadoop依赖
org.apache.hadoop
hadoop-client
${hadoop.version}
UTF-8
2.6.0-cdh5.7.0
cloudera
https://repository.cloudera.com/artifactory/cloudera-repos
2)
public static final String HDFS_PATH="hdfs://hadoop000:8020";
Configuration configuration=null;
FileSystem fileSystem=FileSystem.get(new URI(HDFS_PATH),configuration,用户名);
3)
创建HDFS目录 fileSystem.mkdirs(new Path("/hdfsapi/test "));
创建文件 FSDataOutputStream output = fileSystem.create(new Path("/hdfsapi/test/a.txt"));
output.write("hello".getBytes());
output.flush();
output.close();
查看内容 FSDataInputStream in = fileSystem.open(new Path("/hdfsapi/test/a.txt"));
IOUtils.copyBytes(in,System.out,1024);
in.close;
重命名 fileSystem.rename(src,des);
上传文件到HDFS fileSystem.copyFromLocalFile(src,des);
上传带进度条 InputStram in =new BufferedInputStream(new FileInputStream(new File(path)));
FSDataOutputStream output = fileSystem.create(new Path("/hdfsapi/test/a.txt") new Progressabel(){});
IOUtils.copyBytes(in,output,4096);
下载到本地 fileSystem.copyToLocalFile(src,des);
展示所有文件
FileStatus[] fileStatus = fileSystem.listStatus(new Path())
删除文件 fileSystem.delete(new Path(src,boolean));
问题:我们已经在hdfs-site.xml中设置了副本系数为1,为什么此时查询文件看到的3呢?
答:如果你是通过hdfs shell的方式put的上去的那么,才采用默认的副本系数1
如果我们是java api上传上去的,在本地我们并没有手工设置副本系数,所以否则采用的是hadoop自己的副本系数3
HDFS优点:
HDFS缺点: