大数据Hadoop之HDFS

  • 1.HDFS概述
  • 2.HDFS架构
  • 3.伪分布式下:HDFS配置文件的修改
  • 4.启动HDFS
  • 5.启动HDFS的过程中可能出现的问题
  • 6.停止HDFS
  • 7.HDFS shell的常用命令
  • 8.Java API操作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.replicationname>
    <value>1value>
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 */

会看到如下的页面:

大数据Hadoop之HDFS_第1张图片

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
  • 源码地址:[email protected]:chao2015/HadoopConfig.git

  • 测试运行: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呢?

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

你可能感兴趣的:(D_大数据,从零开始的大数据)