[Hadoop]MapReduce中的Join

摘自象书 首先,最好用Pig/Hive等做Join,避免手写很多代码 如果不用Pig/Hive,则有两种选择(假设有两个dataset, A和B): 1.Map-Side Joins   比较复杂,可以参见 org.apache.hadoop.examples.Join 2.Reduce-Side Joins   a.使用MultipleInputs将两个dataset都读进来,作为同一个Job的输入   b.两个dataset的mapper使用相同的output key, 以使两个mapper中key相同的output将出现在同一个reducer上 (严格地讲不是同一个key, 这里要自建partitioner来钻个空子,详见象书英文版p251)   c; 在reducer中实现Join逻辑  

hadoop支持的输入、输出类型

摘自象书 1. 文本:TextInpuFormat 2. 关系数据库: DBInputFormat    注意这是单个的数据源,没有Sharding. 如果数据很多,会有多个map task同时读它,可能导致数据库承受不了压力。 3. Hbase: TableInputFormat

[Hadoop]MultiInput和MultiOutput

摘自象书 一个Job里可以从多个同质或异质的输入源读取数据,并使用各自的Mapper MultipleInputs.addInputPath(conf, ncdcInputPath, TextInputFormat.class, MaxTemperatureMapper.class) MultipleInputs.addInputPath(conf, metOfficeInputPath, TextInputFormat.class, MetOfficeMaxTemperatureMapper.class); MultiOutputFormat可以让你按一定规则指定、分隔reduce output的文件名,如 … static class StationNameMultipleTextOutputFormat extends MultipleTextOutputFormat<NullWritable, Text> { private NcdcRecordParser parser = new NcdcRecordParser(); protected String generateFileNameForKeyValue(NullWritable key, Text value, String name) { parser.parse(value); return parser.getStationId(); } } … 另有MultiOutputs类,在此不表

[Hadoop]设置Task的jvm heap size

版本:hadoop 1.0.4 可以在这里设置: <!–mapred-site.xml–> <property> <name>mapred.child.java.opts</name> <value>-Xmx512m</value> </property> 有人说应该改hadoop-env.sh里的HADOOP_HEAPSIZE. 这是错的,HADOOP_HEAPSIZE是给一些HADOOP后台进程用的,不是给task用的

[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 »