Month: November 2012

[Hadoop]宁要少量大文件,不要大量小文件

摘自象书 宁要少量大文件,不要大量小文件(比如HDFS block还小若干量级) 因为:   1.一个文件就要一个map task   2.文件太多就需要很多map task   3.运行map task有额外开销   4.运行大量map task会带来过多开销 所以:   不要大量小文件

搭建Hadoop的Pseudo-Distributed Mode环境(二) — 运行一个Map/Reduce任务

在 上一篇文章里我们说了怎么搭建Pseudo环境本身,现在应该在这个环境上真正跑一下MapReduce任务了。 关于MapReduce程序,我们可以直接用 这里贴的代码,有些地方要改一下: 将输入、输出文件改成hdfs://localhost/… //Coupon11LogJobMain String inputFile = “hdfs://localhost/home/kent/coupon11/coupon11.log”; String outDir = “hdfs://localhost/home/kent/coupon11/output” + System.currentTimeMillis(); 当然,你要把输入文件复制到hdfs系统中 $hadoop dfs -copyFromLocal /home/kent/coupon11/coupon11.log hdfs://localhost/home/kent/coupon11/coupon11.log 配置maven assembly插件,以便把程序以及所有lib打包成一个单个的jar文件 <!– pom.xml –> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>2.3</version> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> </plugin> 编译打包 $mvn assembly:assembly 将jar文件提交给MapReduce执行 $hadoop jar coupon11logs-1.0-SNAPSHOT-jar-with-dependencies.jar coupon11log.Coupon11LogJobMain 最后,从web控制台监控job/task的状态: http://localhost:50030/

hadoop入门者可能会犯的一个低级错误:为什么页面上看不到正在运行的job?

我按pseudo mode启动了hadoop, 在java代码里将input/output文件都改成了hdfs://localhost/…, 在eclipse里启动Job也成功了,但为什么 http://localhost:50030/jobtracker.jsp里看不到我的job呢? 这个错误的确很低级。对hadoop服务器来说,hdfs服务和mapreduce服务是两个独立的服务,你启动Job成功了,只意味着你的客户端成功连上了hdfs服务,不代表你正在使用hadoop的mapreduce服务。。。

[Hadoop]常用hdfs shell 命令

http://hadoop.apache.org/docs/r0.17.2/hdfs_shell.html copyFromLocal Usage: hadoop dfs -copyFromLocal <localsrc> URI ls Usage: hadoop dfs -ls <args> cat Usage: hadoop dfs -cat URI [URI …] copyToLocal Usage: hadoop dfs -copyToLocal [-ignorecrc] [-crc] URI <localdst> 待续

m2eclipse误报”Missing artifact”

m2eclipse报告"Missing artifact XXX:XXX",但实际上maven repository里却有这个artifact,这是为什么? 先说下后果:误报也可能意味着maven解析dependency失败,导致eclipse project的build path里丢失很多库,最终结果就是是在eclipse里无法运行main程序或jetty/tomcat. 而如果在eclipse外面通过maven命令来编译打包程序,却不会有问题,这是为什么? 以下两个因素结合起来可能导致这样的问题出现:    1. maven repository中某些artifact没有pom文件    2. 你的外部maven程序是maven2 maven2对"某些artifact没有pom文件"这种事比较能忍,所以打包仍能成功;但m2eclipse总是使用maven3来做依赖管理(即使你让它指向了外部的maven2),而maven3不能忍受“没有pom文件”. 当m2eclipse发现有东西让它不能忍时,就会乱报这个丢失那个没有之类的。 一个常见的“没有pom文件”的artifact是opensymphony-quartz, 官方maven repository中就没有这个pom. 临时的解决办法是搞一个pom文件丢到maven repository中,如 引用 I finally found a workaround. It is surely a bug in m2eclipse, however the problem disappeared when I added quartz-1.6.0.pom next to quartz-1.6.0.jar in .m2\repository\opensymphony\quartz\1.6.0\ The pom is not present at …

m2eclipse误报”Missing artifact” Read More »

eclipse里无法把一个包直接拖到另一个包下,怎么办?

eclipse里如果把一个包直接拖到另一个包下,它会提示你是不是要把包命名为“com.xxx.copy”;这根本不是我们想要的。 StackOverflow里有人给出了正确的做法:重命名包–把com.xxx改成com.yyy.xxx . 他说: 引用 Use the package explorer view and rename the package. It asks for renaming updating references, renaming sub packages, update textual references in comments and and also non-Java text files. Click on the preview and then ok.