大数据Hadoop之HDFS

1.HDFS概述

  • 全称:Hadoop Distributed File System(Hadoop分布式文件系统)
  • HDFS优点

    1. 数据冗余、硬件容错
    2. 处理流式的数据访问
    3. 适合存储大文件
    4. 可构建在廉价机器上
  • HDFS缺点

    1. 不能实现低延迟的数据访问
    2. 不适合小文件存储:小文件越多,源数据存放在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。

start-dfs.sh
  • 3)验证是否启动成功:
/** 1.查看进程:应该有三个
      DataNode、NameNode、SecondaryNameNode */
jps
/** 2.本地的浏览器访问:http://chao:50070 
      或 http://192.168.27.131:50070 */

会看到如下的页面:

HDFS浏览器视图

5.启动HDFS的过程中可能出现的问题

  • 如果在start-dfs.sh后jps只看到两个进程,没有DataNode进程,则是DataNode和NameNode的Cluster ID不匹配,下列方法解决:

    1. 复制:/home/hadoop/app/tmp/dfs/data/current/VERSION 里的Cluster ID到tmp/dfs/name/current/VERSION中;
    2. 或者删除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
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呢?

  1. 如果你是通过hdfs shell的方式put的上去的那么,才采用默认的副本系数1;
  2. 如果我们是java api上传上去的,在本地我们并没有手工设置副本系数,所以否则采用的是hadoop自己的副本系数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值