在上一篇中,用到了hadoop的compression codecs组件(gzip,还另有:zlib,lzo),其中,gzip和lzo压缩编解码器必须使用hadoop本地库才能运行,如果没有配置好,则会报以下错误:
13/08/09 23:28:49 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
鉴于性能问题以及某些Java类库的缺失,对于某些组件,Hadoop提供了自己的本地实现。 这些组件保存在Hadoop的一个独立的动态链接的库里。这个库在*nix平台上叫libhadoop.so.
使用方法
hadoop本地库的用法很简单:
- 看一下 支持的平台.
-
下载 预构建的32位i386架构的Linux本地hadoop库(可以在hadoop发行版的lib/native目录下找到)或者自己构建 这些库。
- 确保你的平台已经安装了zlib-1.2以上版本或者lzo2.0以上版本的软件包或者两者均已安装(根据你的需要)。
bin/hadoop 脚本通过系统属性 -Djava.library.path=<path>来确认hadoop本地库是否包含在库路径里。
检查hadoop日志文件可以查看hadoop库是否正常,正常情况下会看到:
DEBUG util.NativeCodeLoader - Trying to load the custom-built native-hadoop library...
INFO util.NativeCodeLoader - Loaded the native-hadoop library
支持的平台
Hadoop本地库只支持*nix平台,已经广泛使用在GNU/Linux平台上,但是不支持
Cygwin 和
Mac OS X。
已经测试过的GNU/Linux发行版本:
在上述平台上,32/64位Hadoop本地库分别能和32/64位的jvm一起正常运行。
构建Hadoop本地库
Hadoop本地库使用
ANSI C 编写,使用GNU autotools工具链 (autoconf, autoheader, automake, autoscan, libtool)构建。也就是说构建hadoop库的平台需要有标准C的编译器和GNU autotools工具链。请参看支持的平台。
你的目标平台上可能会需要的软件包:
如果已经满足了上述先决条件,可以使用build.xml 文件,并把其中的compile.native置为true,这样就可以生成hadoop本地库:
$ ant -Dcompile.native=true <target>
因为不是所有用户都需要Hadoop本地库,所以默认情况下hadoop不生成该库。
你可以在下面的路径查看新生成的hadoop本地库:
$ build/native/<platform>/lib
其中<platform>是下列系统属性的组合 ${os.name}-${os.arch}-${sun.arch.data.model};例如 Linux-i386-32。
注意
- 在生成hadoop本地库的目标平台上必须 安装了zlib和lzo开发包;但是如果你只希望使用其中一个的话,在部署时,安装其中任何一个都是足够的。
- 在目标平台上生成以及部署hadoop本地库时,都需要根据32/64位jvm选取对应的32/64位zlib/lzo软件包。
使用DistributedCache 加载本地库
用户可以通过 DistributedCache 加载本地共享库,并分发和建立库文件的符号链接。
这个例子描述了如何分发库文件并在从map/reduce任务中装载库文件。
- 首先拷贝库文件到HDFS。
bin/hadoop fs -copyFromLocal mylib.so.1 /libraries/mylib.so.1
- 启动作业时包含以下代码:
DistributedCache.createSymlink(conf);
DistributedCache.addCacheFile("hdfs://host:port/libraries/mylib.so.1#mylib.so", conf);
- map/reduce任务中包含以下代码:
System.loadLibrary("mylib.so");
这里要注意:
DistributedCache是
用来分发应用特定的只读文件和一个jar包的,以供Map-Reduce框架在启动任务和运行的时候使用这些缓冲的文件或者是把第三方jar包添加到其classpath路径中去,要注意的是DistributedCache的使用是有一个前提的,就它会认为这些通过urls来表示的文件已经在hdfs文件系统里面。
下面给出一个具体示例:
1.
配置应用程序的cache,把需要使用的文件上传到DFS中去:
$ bin/hadoop fs -copyFromLocal lookup.dat /myapp/
$ bin/hadoop fs -copyFromLocal map.zip /myapp/
$ bin/hadoop fs -copyFromLocal mylib.jar /myapp/
$ bin/hadoop fs -copyFromLocal mytar.tar /myapp/
$ bin/hadoop fs -copyFromLocal mytgz.tgz /myapp/
$ bin/hadoop fs -copyFromLocal mytargz.tar.gz /myapp/
此时Hadoop框架会把这些应用所需要的文件复制到每个准备启动的节点上去,它会把这些复制到mapred.temp.dir配置的目录中去,以供相应的Task节点使用。这里要注意的DistriubtedCache分发的文件分成公有与私有文件,公有文件可以给HDFS中的所有用户使用,而私有文件只能被特定的用户所使用,用户可以配置上传文件的访问权限来达到这种效果。
2.
配置JobConf:
JobConf job = new JobConf();
DistributedCache.addCacheFile(new URI("/myapp/lookup.dat#lookup.dat"),job); // 这里的lookup.dat加了一个符号连接
DistributedCache.addCacheArchive(new URI("/myapp/map.zip", job);
DistributedCache.addFileToClassPath(new Path("/myapp/mylib.jar"), job); // 这里是把相应的jar包加到Task的启动路径上去
DistributedCache.addCacheArchive(new URI("/myapp/mytar.tar", job);
DistributedCache.addCacheArchive(new URI("/myapp/mytgz.tgz", job);
DistributedCache.addCacheArchive(new URI("/myapp/mytargz.tar.gz", job);
3. 在Mapper或者Reducer任务中使用这些文件:
public static class MapClass extends MapReduceBase
implements Mapper<K, V, K, V> {
private Path[] localArchives;
private Path[] localFiles;
public void configure(JobConf job) {
// Get the cached archives/files
localArchives = DistributedCache.getLocalCacheArchives(job); // 得到本地打包的文件,一般是数据文件,如字典文件
localFiles = DistributedCache.getLocalCacheFiles(job); // 得到本地缓冲的文件,一般是配置文件等
}
public void map(K key, V value,
OutputCollector<K, V> output, Reporter reporter)
throws IOException {
// Use data from the cached archives/files here
// ...
// ...
output.collect(k, v);
}
}
另外,
使用新的MP接口要注意的地方:
1. 我们知道,新的MP接口使用了Job这个类来对MP任务进行配置,这里使用的时候要注意一点
Configuration conf = new Configuration();
// 对conf加入配置信息 - 正确方法
Job job = new Job(conf,"word count");
// 对conf加入配置信息 - 这是有问题的,这些配置不会生效,因为这里生成Job的时候它会对conf进行复制,这个看一下Job的源代码就知道。
// 这里可以用job.getConfiguration()来得到其内部的conf对象,这样就不会有问题。
2. 如果你在启动MP任务之前调用了第三方jar包的类,那这就会有问题,会在启动任务的时候找不到这个类。这个问题我还没有找到好的解决办法,一个办法就是把这些类想办法移到MP任务中,如果有朋友知道更加好的办法,请告诉我一下,多谢了。我感觉Nutch中也会有同样的问题,什么时候研究一下Nutch的代码,说不定会有很多关于Hadoop方面的收获。
分享到:
相关推荐
`Hadoop: The Definitive Guide`中可能会讲解如何创建、读取和操作HDFS上的文件,以及如何配置HDFS参数以优化性能。 MapReduce是Hadoop处理大数据的主要计算模型,它将大规模数据处理任务分解为小的“映射”和...
Hadoop: The Definitive Guide, 4th Edition Get ready to unlock the power of your data. With the fourth edition of this comprehensive guide, you’ll learn how to build and maintain reliable, scalable,...
With this digital Early Release edition of Hadoop: The Definitive Guide, you get the entire book bundle in its earliest form – the author’s raw and unedited content – so you can take advantage of ...
《Hadoop:权威指南》是了解和掌握Apache Hadoop生态系统不可或缺的一本著作。这本书由Tom White撰写,全面深入地介绍了Hadoop的各个组件及其工作原理,对于初学者和专业人士来说都是一份宝贵的参考资料。 Hadoop是...
《Hadoop:The Definitive Guide》是O'REILLY出版社出版的一本关于Apache Hadoop的权威指南,目前流行的是第四版。这本书为读者提供了一个全面的Hadoop学习平台,内容涵盖了如何构建和维护一个既可靠又可扩展的...
- **书名**:《Hadoop:The Definitive Guide》(第二版) - **作者**:Tom White - **前言作者**:Doug Cutting - **出版社**:O'Reilly Media, Inc. - **出版日期**:2010年10月 - **版权**:版权所有 © 2011 Tom...
Hadoop是一个由Apache软件基金会开发的开源框架,它允许通过简单的编程模型跨分布式环境存储和处理大数据。其设计目标是可伸缩、高效以及能够从单个服务器的单个机架到数千台机器的大规模商用服务器集群实现容错。...
Hadoop- The Definitive Guide, 4th Edition
The fourth edition covers Hadoop 2 exclusively. The Hadoop 2 release series is the current active release series and contains the most stable versions of Hadoop. There are new chapters covering YARN ...
《Hadoop: The Definitive Guide, Third Edition》是Tom White对于Hadoop的深入剖析之作,涵盖了Hadoop的多个方面,包括它的历史、架构和应用。本书为读者展示了Hadoop的生态系统和核心概念,包括分布式文件系统...
《Hadoop权威指南》是大数据领域的一本经典著作,它详细介绍了Apache Hadoop生态系统的核心组件、工作原理以及实际应用。这本书分为中文版和英文版,为读者提供了双语学习的选择,且带有书签,便于查阅和学习,无需...
EPUB版本: Hadoop -The Definitive Guide, 4th edition.epub
### Hadoop The Definitive Guide知识点总结 #### 1. 了解Hadoop - **数据的重要性**:在当今数字化世界中,数据被视为一种极其宝贵的资源。随着数据量的激增,传统的数据处理方法逐渐显得力不从心。因此,开发出...