Hadoop实战读书笔记(5)

HDFS文件操作

你可以把一个大数据集(100TB)在HDFS中存储为单个文件,而大多数其他的文件系统无力实现这一点。虽然该文件存在多个副本分布在多台机器上来支持并行处理,你也不必考虑这些细节。

HDFS (Hadoop Distribution File System)文件系统到底是一个怎样的文件系统?

并不是一个Unix文件系统,不支持像ls和cp这种标准的Unix文件命令,也不支持如fopen()和fread()这样的标准文件读写操作。但是Hadoop提供了一套与Linux文件命令类似的命令行工具。

一个典型的Hadoop工作流是指?

1、在别的地方生成数据文件(如日志文件)再将其复制到HDFS中。

2、由MapReduce程序处理这个数据,读取HDFS文件并将之解析为独立的记录(键/值对)

3、除非要定制数据的导入与导出,否则你几乎不必编程来读写HDFS文件。

Hadoop文件命令采取的形式是?

hadoop fs -cmd <args>

cmd是具体的文件命令,而<args>是一组数目可变的参数。cmd的命名通常与UNIX对应的命令名相同。如,文件列表的命令为:hadoop fs -ls

Hadoop最常用的文件管理任务包括?

1、添加文件和目录

2、获取文件

3、删除文件

Hadoop文件命令可以和本地文件系统交互吗?

Hadoop的文件命令既可以与HDFS文件系统交互,也可以和本地文件系统交互。

URI定位是指?完整的URL格式是?

URL精确地定位一个特定文件或目录的位置。

完整的URL格式为scheme://authority/path. Scheme类似于一个协议它可以是hdfs或file、来分别指定HDFS文件系统或本地文件系统。

对于HDFS,authority是NameNode的主机名,而path是文件或者目录的路径。

对于在本地机器的9000端口上,以标准伪分布式模型运行的HDFS,访问用户目录user/chuck中文件example.txt的URI是什么?

hdfs://localhost:9000/user/chuck/example.txt

hadoop fs -cat hdfs://localhost:9000/user/chuck/example.txt

但是通常我们在使用Hadoop文件命令时没有指定URI中的scheme://authority部分

是怎么回事?

是的,大多数设置不需要指定URI中的scheme://authority部分

例如,当在本地文件系统和HDFS之间复制文件时

1、put命令将本地文件复制到HDFS中,源是本地文件,目的是HDFS文件

2、get命令将HDFS中文件复制到本地,源是HDFS文件,目的是本地文件。

如果未设置URI中的scheme://authority部分,就会采用Hadoop的默认配置fs.default.name属性的配置。

例如:conf/core-site.xml文件配置是:

<property>

<name>fs.default.name</name>

<value>hdfs://localhost:9000</value>

</property>

在此配置下,URI hdfs://localhost:9000/user/chuck/example.txt缩短为/user/chuck/example.txt

注:有些更早的文档以hadoop dfs -cmd <args>的形式表示文件工具。dfs和fs是等价的,但现在都是用fs

HDFS默认当前工作目录是?

HDFS默认当前工作目录为/user/$USER,其中$USER是你的登录用户名。

例:如果你作为chuck登录,则URI hdfs://localhost:9000/user/chuck/example.txt就缩短为example.txt。显示文件内容的Hadoop cat命令可写为:

hadoop fs -cat example.txt

如何在HDFS上添加文件和目录?

首先必须确保几点:

1、必须先进行格式化

2、出于学习目的,建议使用伪分布式

3、默认工作目录是/user/$USER,但这个目录不会自动创建,需要手动创建先

手动创建默认工作目录

hadoop fs -mkdir /user/chuck

Hadoop的mkdir命令会自动创建父目录,类似于UNIX中使用-p选项的mkdir命令,因此上述命令还会创建/user目录。

hadoop fs -ls / 该命令列出根目录下的所有文件和目录

hadoop fs -lsr / 该命令列出根目录下所有文件和子目录

hadoop fs -put example.txt . 将本地文件example.txt放入HDFS中。

后面的(.),意味着把文件放入默认的工作目录,等价于

hadoop fs -put example.txt /user/chuck

hadoop fs -ls 列出工作目录下的所有文件和目录

使用hadoop fs -ls命令列出内容和复制因子

通常情况下会列出如下面这样的view

Found 1 items

-rw-r--r-- 1 chuck supergroup 264 2009-01-14 11:02 /user/chuck/example.txt

显示属性信息,其他的不解释和UNIX的概念类似。主要说一下"1"列出文件的复制因子。伪分布式下它永远为1,对于生产环境中的集群,复制因子通常为3,也可以是任何正整数,复制因子不适用于目录,所以该列会显示一个(-)

如何检索文件?

Hadoop的get命令与put命令相反,从HDFS中复制文件到本地文件系统。

比如hadoop fs -get example.txt 将它复制带本地的当前工作目录中。

hadoop fs -cat example.txt 也可以使用cat命令显示数据。

也可以使用管道命令 hadoop fs -cat example.txt | head

可以使用tail命令来查看最后的一千字节:

hadoop fs -tail example.txt

如何删除文件?

删除文件和空目录使用rm命令

hadoop fs -rm example.txt

如何查阅帮助?

hadoop fs (无参数) 来获取所用版本Hadoop的一个完整命令列表。

hadoop fs -help ls 显示每个命令的用法及简短描述。

HDFS的Java API

虽然,命令行工具足以满足大多数与HDFS文件系统交互的需求,但是有些需求只能用Java API去访问,比如开发一个PutMerge程序,用于合并文件后放入HDFS中,命令行工具并不支持这个操作。

合并文件后放入HDFS中,什么时候会这样做呢?

考虑这样一个场景,需要分析来自许多Web服务器的Apache日志文件时,就有了建立这个例程的动机,虽然我们可以把每个日志文件都复制到HDFS中,但通常而言,Hadoop处理单个大文件会比处理许多个小文件更有效率。

为什么会日志数据会分散在多个文件?

这是由于Web服务器采用分布式架构所造成的。

一种解决办法是?为什么不直接合并?

一种解决办法是先将所有的文件合并,然后再复制到HDFS。可是,文件合并需要占用本地计算机的大量磁盘空间。如果我们能够在向HDFS复制的过程中合并它们就好了。

Hadoop命令行工具getmerge命令。

getmerge命令,用于把一组HDFS文件在复制到本地计算机之前进行合并,但我们想要的截然相反。我们是要putmerge命令。

Hadoop文件操作API是?

Hadoop中用作文件操作的主类位于org.apache.hadoop.fs软件包中,Hadoop的基本文件操作包括open、read、write和close,Hadoop的文件API也可以用于HDFS以外的其他文件系统。

Hadoop文件API的起点是FileSystem类,这是一个与文件系统交互的抽象类,存在不同的具体实现子类用于处理HDFS和本地文件系统。你可以通过调用factory方法FileSystem.get(Configuration conf)来得到所需的FileSystem实例。Configuration类是用于保留键/值配置参数的特殊类。它的默认实例化方法是以HDFS系统的资源配置为基础的。

如何得到一个FileSystem对象?

Configuration conf = new Configuration();

FileSystem hdfs = FileSystem.get(conf);

要得到一个专用于本地文件系统的FileSystem对象,可以使用factory方法的FileSystem.getLocal(Configuration conf);

FileSystem local = FileSystem.getLocal(conf);

其他说明:

Hadoop文件API使用Path对象来编制文件和目录名,使用FileStatus对象来存储文件和目录的元数据。PutMerge程序将合并一个本地目录中的所有文件。我们使用FileSystem的listStatus()方法来得到一个目录中的文件列表:

Path inputDir = new Path(args[0]);

FileStatus[] inputFiles = local.listStatus(inputDir);

数组inputFiles的长度等于指定目录中的文件个数。在inputFiles中每一个FileStatus对象均有元数据信息,如文件长度、权限、修改时间等。PutMerge程序所关心的是每个文件的Path,即inputFiles[i].getPath()。我们可以通过FSDataInputStream对象访问这个Path来读取文件。

FSDataInputStream in = local.open(inputFiles[i].getPath());

byte buffer[] = new byte[256];

int bytesRead = 0;

while ( (bytesRead = in.read(buffer)) > 0) {

...

}

in.close();

FSDataInputStream是Java标准类java.io.DataInputStream的一个子类,增加了对随机访问的支持。类似地有一个FSDataOutputStream对象用于将数据写入HDFS文件:

Path hdfsFile = new Path(args[1]);

FSDataOutputStream out = hdfs.create(hdfsFile);

out.write(buffer, 0, bytesRead);

out.close();

时间: 2024-10-12 08:37:51

Hadoop实战读书笔记(5)的相关文章

Hadoop实战读书笔记(8)

什么是开发数据集? 一个流行的开发策略是为生产环境中的大数据集建立一个较小的.抽样的数据子集,称为开发数据集.这个开发数据集可能只有几百兆字节.当你以单机或者伪分布式模式编写程序来处理它们时,你会发现开发周期很短,在自己的机器上运行程序也很方便,而且还可以在独立的环境中进行调试. 为什么选择专利引用数据做测试? 1.因为它们与你将来会遇到的大多数数据类型相似 2.专利引用数据所构成的关系图与网页链接以及社会网络图可谓大同小异 3.专利发布以时间为序,有些特性类似于时间序列 4.每个专利关联到一个

Hadoop实战读书笔记(7)

输入数据概要 输入数据通常驻留在较大的文件中,通常几十或者数百GB,甚至更大.MapReduce处理的基本原则之一是将输入数据分割成块.这些块可以在多台计算机上并行处理,在Hadoop的术语中这些块被称为输入分片(Input Split).每个分片应该足够小以实现更细粒度的并行.(如果所有的输入数据都在一个分片中,那就没有并行了.) 另一方面,每个分片也不能太小,否则启动与停止各个分片处理所需的开销将占去很大一部分执行时间. 所以说: 1.单个文件要足够的大,这样才能被分片,才会有并行. 2.分

Hadoop实战读书笔记(6)

putmerge程序的大体流程是? 1.根据用户定义的参数设置本地目录和HDFS的目录文件 2.提取本地输入目录中每个文件的信息 3.创建一个输出流写入到HDF文件 4.遍历本地目录中的每个文件,打开一个输入流来读取该文件,剩下就是一个标准的Java文件复制过程了 具体程序如下: public static void main(String[] args) throws IOException { Configuration conf = new Configuration(); FileSys

Hadoop实战读书笔记(9)

如何将一个反向引用索引的程序的Reducer输出的类型改为IntWritable public static class Reduce extends MapReduceBase implements Reducer<Text, Text, Text, IntWritable> { public void reduce(Text key, Iterator<Text> values, OutputCollector<Text, IntWritable> output,

R实战读书笔记四

第三章 图形入门 本章概要 1 创建和保存图形 2 定义符号.线.颜色和坐标轴 3 文本标注 4 掌控图形维数 5 多幅图合在一起 本章所介绍内容概括如下. 一图胜千字,人们从视觉层更易获取和理解信息. 图形工作 R具有非常强大的绘图功能,看下面代码. > attach(mtcars) > plot(wt, mpg) > abline(lm(mpg~wt)) > title("Regression of MPG on Weight") > detach(m

JAVA并发编程实战 读书笔记(二)对象的共享

<java并发编程实战>读书摘要 birdhack 2015年1月2日 对象的共享 JAVA并发编程实战读书笔记 我们已经知道了同步代码块和同步方法可以确保以原子的方式执行操作,但一种常见的误解是,认为关键之synchronized只能用于实现原子性或者确定临界区.同步还有另一个重要的方面:内存可见性. 1.可见性 为了确保多个线程之间对内存写入操作的可见性,必须使用同步机制. 在没有同步的情况下,编译器.处理器以及运行时等都可能对操作的执行顺序进行一些意想不到的调整.在缺乏足够同步的多线程程

Spring3.x企业开发应用实战读书笔记 —— 第三章IoC容器概述

声明:    本篇博客绝大多数内容为<Spring3.x企业开发应用实战>一书原内容,所有版权归原书作者所有!,仅供学习参考,勿作他用! 3.2 相关Java基础知识 Java语言允许通过程序化的方式间接对Class对象实例操作,Class文件由类装载器装在后,在JVM(Java虚拟机)中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息: 如构造函数.属性和方法等.Java允许用户借由这个Class相关的元信息对象间接调用Class对象的功能,这就为使用程

机器学习实战读书笔记(三)决策树

3.1 决策树的构造 优点:计算复杂度不高,输出结果易于理解,对中间值的缺失不敏感,可以处理不相关特征数据. 缺点:可能会产生过度匹配问题. 适用数据类型:数值型和标称型. 一般流程: 1.收集数据 2.准备数据 3.分析数据 4.训练算法 5.测试算法 6.使用算法 3.1.1 信息增益 创建数据集 def createDataSet(): dataSet = [[1, 1, 'yes'], [1, 1, 'yes'], [1, 0, 'no'], [0, 1, 'no'], [0, 1, '

R语言实战读书笔记(二)创建数据集

2.2.2 矩阵 matrix(vector,nrow,ncol,byrow,dimnames,char_vector_rownames,char_vector_colnames) 其中: byrow=TRUE/FALSE,表示按行填充还是按列填充,默认情况下是按列填充 2.2.4 数据框 1.attach,detach()和with() attach():将数据框加入搜索路径 detach():将数据框移除出搜索路径 with():赋值仅在括号内有效,如果想在括号外生效也可以,用<<- 2.