hdfs并不擅长存储小文件,因为每个文件最少一个block,每个block的元数据都会在NameNode中占用150byte内存。如果存储大量的小文件,它们会吃掉NameNode节点的大量内存。MR案例:小文件处理方案

Hadoop Archive或者HAR,是一个高效地将小文件放入HDFS块中的文件存档工具。它能将多个小文件打包成一个HAR文件,这样在减少NameNode内存使用的同时,仍然允许对小文件进行透明的访问,比如作为MapReduce的输入。

使用方法:

 1). 归档前的目录结构

[root@ncst mapreduce]# hadoop fs -lsr /test/in
drwxr-xr-x - root supergroup -- : /test/in/har
drwxr-xr-x - root supergroup -- : /test/in/mapjoin
-rw-r--r-- root supergroup -- : /test/in/mapjoin/address.txt
-rw-r--r-- root supergroup -- : /test/in/mapjoin/company.txt
drwxr-xr-x - root supergroup -- : /test/in/small
-rw-r--r-- root supergroup -- : /test/in/small/small.
-rw-r--r-- root supergroup -- : /test/in/small/small.
-rw-r--r-- root supergroup -- : /test/in/small/small.
-rw-r--r-- root supergroup -- : /test/in/small/small_data

 2). 归档命令

  可以通过参数 -D har.block.size 指定HAR的大小

shell> hadoop archive -archiveName NAME -p <parent path> <src>* <dest>
/* 归档命令
* -archiveName 0825.har : 指定归档后的文件名
* -p /test/in/ : 被归档文件所在的父目录
* small mapjoin : 要被归档的目录,一至多个(small和mapjoin)
* /test/in/har : 生成的归档文件存储目录
*/
hadoop archive -archiveName 0825.har -p /test/in/ small mapjoin /test/in/har

 3). 归档后的目录结构

[root@ncst ~]# hadoop fs -lsr /test/in
drwxr-xr-x - root supergroup -- : /test/in/har
drwxr-xr-x - root supergroup -- : /test/in/har/.har
-rw-r--r-- root supergroup -- : /test/in/har/.har/_SUCCESS
-rw-r--r-- root supergroup -- : /test/in/har/.har/_index
-rw-r--r-- root supergroup -- : /test/in/har/.har/_masterindex
-rw-r--r-- root supergroup -- : /test/in/har/.har/part-
drwxr-xr-x - root supergroup -- : /test/in/mapjoin
-rw-r--r-- root supergroup -- : /test/in/mapjoin/address.txt
-rw-r--r-- root supergroup -- : /test/in/mapjoin/company.txt
drwxr-xr-x - root supergroup -- : /test/in/small
-rw-r--r-- root supergroup -- : /test/in/small/small.
-rw-r--r-- root supergroup -- : /test/in/small/small.
-rw-r--r-- root supergroup -- : /test/in/small/small.
-rw-r--r-- root supergroup -- : /test/in/small/small_data

 4). 查看结果文件【part-0】内容

[root@ncst ~]# hadoop fs -cat /test/in/har/.har/part-
Beijing
Guangzhou
Shenzhen
XianBeijing Red Star
Shenzhen Thunder
Guangzhou Honda
Beijing Rising
Guangzhou Development Bank
Tencent

 5). 使用har uri去访问原始数据

 HAR是HDFS之上的一个文件系统,因此所有 fs shell 命令对HAR文件均可用,只不过文件路径格式不一样

[root@ncst ~]# hadoop fs -lsr har:///test/in/har/0825.har
drwxr-xr-x - root supergroup 0 2015-08-22 12:02 har:///test/in/har/0825.har/mapjoin
-rw-r--r-- 1 root supergroup 39 2015-08-22 12:02 har:///test/in/har/0825.har/mapjoin/address.txt
-rw-r--r-- 1 root supergroup 129 2015-08-22 12:02 har:///test/in/har/0825.har/mapjoin/company.txt
drwxr-xr-x - root supergroup 0 2015-08-25 22:27 har:///test/in/har/0825.har/small
-rw-r--r-- 1 root supergroup 1 2015-08-25 22:17 har:///test/in/har/0825.har/small/small.1
-rw-r--r-- 1 root supergroup 1 2015-08-25 22:17 har:///test/in/har/0825.har/small/small.2
-rw-r--r-- 1 root supergroup 1 2015-08-25 22:17 har:///test/in/har/0825.har/small/small.3
-rw-r--r-- 1 root supergroup 3 2015-08-25 22:27 har:///test/in/har/0825.har/small/small_data

 6). 用har uri访问下一级目录

[root@ncst ~]# hdfs dfs -lsr har:///test/in/har/0825.har/small
-rw-r--r-- root supergroup -- : har:///test/in/har/0825.har/small/small.1
-rw-r--r-- root supergroup -- : har:///test/in/har/0825.har/small/small.2
-rw-r--r-- root supergroup -- : har:///test/in/har/0825.har/small/small.3
-rw-r--r-- root supergroup -- : har:///test/in/har/0825.har/small/small_data

 ). 远程访问,可以使用以下命令

//hdfs-ncst:9000 其中,ncst是NameNode所在节点的HostName
[root@ncst ~]# hadoop fs -lsr har://hdfs-ncst:9000/test/in/har/small.har
lsr: DEPRECATED: Please use 'ls -R' instead.
drwxr-xr-x - root supergroup -- : har://hdfs-ncst:9000/test/in/har/small.har/small
-rw-r--r-- root supergroup -- : har://hdfs-ncst:9000/test/in/har/small.har/small/small.1
-rw-r--r-- root supergroup -- : har://hdfs-ncst:9000/test/in/har/small.har/small/small.2
-rw-r--r-- root supergroup -- : har://hdfs-ncst:9000/test/in/har/small.har/small/small.3
-rw-r--r-- root supergroup -- : har://hdfs-ncst:9000/test/in/har/small.har/small/small_data

 8)删除har文件必须使用rmr命令,rm是不行的

[root@ncst ~]# hadoop fs -rmr /test/in/har/.har

 9). 使用HAR作为MapReduce的输入

[root@ncst ~]#  hadoop jar /***/hadoop-mapreduce-examples-2.2.0.jar wordcount \
> har:///test/in/har/0825.har/mapjoin //输入路径
> /test/out/0825/05 //输出路径

存在的问题:

  1. 存档文件的源文件及目录都不会自动删除,需要手动删除
  2. 存档过程实际是一个MapReduce过程,所以需要hadoop的MapReduce支持
  3. 存档文件本身不支持压缩
  4. 存档文件一旦创建便不可修改,要想从中删除或增加文件,必须重新建立存档文件
  5. 创建存档文件会创建原始文件的副本,所以至少需要有与存档文件容量相同的磁盘空间
  6. 使用 HAR 作为MR的输入,MR可以访问其中所有的文件。但是由于InputFormat不会意识到这是个归档文件,也就不会有意识的将多个文件划分到单独的Input-Split中,所以依然是按照多个小文件来进行处理,效率依然不高
  7. HAR结构:二级索引

解读:Hadoop Archive的更多相关文章

  1. Hadoop的Archive归档命令使用指南

    hadoop不适合小文件的存储,小文件本省就占用了很多的metadata,就会造成namenode越来越大.Hadoop Archives的出现视为了缓解大量小文件消耗namenode内存的问题. 采 ...

  2. Hadoop记录-hdfs转载

    Hadoop 存档 每个文件均按块存储,每个块的元数据存储在namenode的内存中,因此hadoop存储小文件会非常低效.因为大量的小文件会耗尽namenode中的大部分内存.但注意,存储小文件所需 ...

  3. Hadoop的理解笔记

    1.2Hadoop与云计算的关系1.什么是云计算:一种基于互联网的计算,在其中共享的资源.软件和信息以一种按需的方式提供给计算机和设备 , 就如同日常生活中的电网一样. 什么是Hadoop:Hadoo ...

  4. 大数据学习笔记之Hadoop(二):HDFS文件系统

    文章目录 一 HDFS概念 1.1 概念 1.2 组成 1.3 HDFS 文件块大小 二 HFDS命令行操作 三 HDFS客户端操作 3.1 eclipse环境准备 3.1.1 jar包准备 3.2 ...

  5. 大数据技术之Hadoop(HDFS)

    第1章 HDFS概述 1.1 HDFS产出背景及定义 1.2 HDFS优缺点 1.3 HDFS组成架构 1.4 HDFS文件块大小(面试重点) 第2章 HDFS的Shell操作(开发重点) 1.基本语 ...

  6. 保姆级教程,带你认识大数据,从0到1搭建 Hadoop 集群

    大数据简介,概念部分 概念部分,建议之前没有任何大数据相关知识的朋友阅读 大数据概论 什么是大数据 大数据(Big Data)是指无法在一定时间范围内用常规软件工具进行捕捉.管理和处理的数据集合,是需 ...

  7. 转载文章——Hadoop学习

    转载地址:http://www.iteye.com/blogs/subjects/zy19982004?page=2 一.Hadoop社区版和发行版 社区版:我们把Apache社区一直开发的Hadoo ...

  8. 从零自学Hadoop(11):Hadoop命令上

    阅读目录 序 概述 Hadoop Common Commands User Commands Administration Commands File System Shell 引用 系列索引 本文版 ...

  9. Hadoop:部署Hadoop Single Node

    一.环境准备 1.系统环境 CentOS 7 2.软件环境 OpenJDK # 查询可安装的OpenJDK软件包[root@server1] yum search java | grep jdk... ...

随机推荐

  1. Python全栈day21(作业针对一个文件进行查询修改删除的操作练习)

    需求,有一个配置文件test.conf内容如下 backend www1 server 1 server 2 backend www2 server 3 server 4 add [{'backend ...

  2. ajax跨域问题解决之cors篇

    现在浏览器出于安全考虑,在域名.协议.端口不同的情况下,浏览器会认为这是跨域,ajax请求是不允许跨域的. 如果我们有跨域的需求,可以使用cors解决.其原理就是,在请求之前先发送一个OPTIONS请 ...

  3. HDU 5701 中位数计数 百度之星初赛

    中位数计数 Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Sub ...

  4. SignalR 循序渐进(四) Hub的生命周期以及IoC

    有阵子没更新这个系列了,最近太忙了.本篇带来的是Hub的生命周期以及IoC. 首先,Hub的生命周期,我们用一个Demo来看看: public class TestHub : Hub { public ...

  5. glibc-2.23_malloc_consolidate_浅析

  6. linux创建lvm分区

    创建LVM分区 shell> fdisk /dev/xvdb #### 选择磁盘 Command (m for help): m #### 帮助 Command action a toggle ...

  7. go-009-函数

    一.概述 Go 语言最少有个 main() 函数. 你可以通过函数来划分不同功能,逻辑上每个函数执行的是指定的任务. 函数声明告诉了编译器函数的名称,返回类型,和参数. Go 语言标准库提供了多种可动 ...

  8. 关于理财和买房 http://shouce.jb51.net/phpcms/ https://www.bj.cmbchina.com/bjtransweb/wsgzd_employ/login.jsp

    对于绝大多数家境普通的年轻人来说,青年阶段无疑是一生中手头最紧的时候.原因很简单,这个阶段花钱最多,挣钱却最少.年轻人收入往往是硬性的低,开支却往往是硬性   的高.已经加班到晕头转向的小职员,很难再 ...

  9. 安装CentOS 7 文字版

    下载镜像 http://mirrors.163.com/ CentOS 7.4 http://mirrors.163.com/centos/7.4.1708/isos/x86_64/ 选择 CentO ...

  10. 创建正真的Java不可变类

    如果需要设计一个不可变类,尤其要注意其引用类型Field,如果其引用类型Field的类是可变的,就必须采取必要的措施来保护该Field所引用的对象不会被修改,这样才能创建真正的不可变类. class ...