1.HDFS概述
- 全称:Hadoop Distributed File System(Hadoop分布式文件系统)
HDFS优点
- 数据冗余、硬件容错
- 处理流式的数据访问
- 适合存储大文件
- 可构建在廉价机器上
HDFS缺点
- 不能实现低延迟的数据访问
- 不适合小文件存储:小文件越多,源数据存放在NameNode上所占用的内存越多
2.HDFS架构
- 1个Master(NameNode)带N个Slaves(即DataNode)
- 1个文件会被拆分成多个Block
blocksize:128M
130M ==> 2个Block: 128M 和 2M
除了最后一个块,文件中所有的块都是128M
NameNode(NN):
1)负责客户端请求的响应
2)负责元数据(文件的名称、副本系数、Block存放的DN)的管理DataNode(DN):
1)存储用户的文件对应的数据块(Block)
2)要定期向NN发送心跳信息,汇报本身及其所有的block信息,即健康状况replication factor:副本系数、副本因子
3.伪分布式下:HDFS配置文件的修改
- 我的配置文件路径为:/home/hadoop/app/hadoop-2.6.0-cdh5.7.0/etc/hadoop/hdfs-site.xml
// 直接添加:
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
- 注:真实集群下还要另外配置slaves文件。
4.启动HDFS
- 1)格式化文件系统(仅第一次执行即可,不要重复执行),格式化的文件系统会放在core-site.xml配置的tmp文件夹里:
hdfs namenode -format
// 或者
hadoop namenode -format
注意:过程中如果出现Y/N的提示:一定要大写Y。
- 2)Hadoop的环境变量已设置(见《大数据Hadoop之环境搭建》),直接打命令启动HDFS:
start-dfs.sh
- 3)验证是否启动成功:
/** 1.查看进程:应该有三个
DataNode、NameNode、SecondaryNameNode */
jps
/** 2.本地的浏览器访问:http://chao:50070
或 http://192.168.27.131:50070 */
会看到如下的页面:
5.启动HDFS的过程中可能出现的问题
如果在start-dfs.sh后jps只看到两个进程,没有DataNode进程,则是DataNode和NameNode的Cluster ID不匹配,下列方法解决:
- 复制:/home/hadoop/app/tmp/dfs/data/current/VERSION 里的Cluster ID到tmp/dfs/name/current/VERSION中;
- 或者删除tmp中的整个dfs文件夹,重新格式化(tmp的位置在core-site.xml中有配置)
当jps能看到3个进程,但是本地浏览器不能访问50070端口,输入以下命令:
// 开放对应的防火墙端口(在普通账户下):
/sbin/iptables -I INPUT -p tcp --dport 50070 -j ACCEPT // 开放50070端口
/etc/rc.d/init.d/iptables save // 存储防火墙规则
/etc/init.d/iptables restart // 重启防火墙
/etc/init.d/iptables status // 查看开放的端口=service iptables status
// 或者关闭防火墙(一定要在root权限下):
// 1) 禁止开机启动防火墙
开启: chkconfig iptables on
关闭: chkconfig iptables off
// 2) 关闭防火墙,即时生效,重启后复原
开启: service iptables start
关闭: service iptables stop
6.停止HDFS
stop-dfs.sh
7.HDFS shell的常用命令
- 所有命令均用hadoop fs / hdfs dfs 开头
● 查看文件系统根目录(/):hadoop fs -ls /
● 把一个文件上传到文件系统的根目录:hadoop fs -put hello.txt /
● 再查看就有了:hadoop fs -ls /
● 和linux的cat一样的功能:hadoop fs -text /hello.txt
● 查看内容(=-text):hadoop fs -cat /test/a/b/h.txt
● 创建文件夹:hadoop fs -mkdir /test
● 递归地创建文件夹加-p参数:hadoop fs -mkdir -p /test/a/b
● 递归地查看文件:hadoop fs -ls -R /
● 拷贝文件:hadoop fs -copyFromLocal hello.txt /test/a/b/h.txt
● 从文件系统中获取文件:hadoop fs -get /test/a/b/h.txt
● 删除文件:hadoop fs -rm /hello.txt
● 删除文件夹:hadoop fs -rm -R /test
● 检查端口号:hadoop fs -ls hdfs://chao:8020/
8.Java API操作HDFS文件
- 开发工具:IDEA
- 查看方法提示:ctrl+j
进入方法:command+单击
log4j报错:
log4j:WARN No appenders could be found for logger (org.apache.hadoop.metrics2.lib.MutableMetricsFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
- 原因是没有对log4j这个jar进行文件配置。解决办法:在项目的/hadooptest/target/classes路径下创建log4j.properties文件
- 添加下面的代码:
log4j.rootLogger=WARN, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
测试运行:src/java/com/chenchao/hadoop/hdfs/HDFSApp的listFiles()方法,结果:
HDFSApp.setUp
2018-01-10 15:42:41,098 WARN [org.apache.hadoop.util.NativeCodeLoader] - Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
文件夹 0 0 hdfs://192.168.27.131:8020/hdfsapi
文件 1 49 hdfs://192.168.27.131:8020/hello.txt
文件 3 12 hdfs://192.168.27.131:8020/hdfsapi/test/a.txt
文件 3 0 hdfs://192.168.27.131:8020/hdfsapi/test/b.txt
HDFSApp.tearDown
- 问题:我们已经在hdfs-site.xml中设置了副本系数为1,为什么查询到有的文件看到的3呢?
- 如果你是通过hdfs shell的方式put的上去的那么,才采用默认的副本系数1;
- 如果我们是java api上传上去的,在本地我们并没有手工设置副本系数,所以否则采用的是hadoop自己的副本系数。