Hadoop机器的典型配置
摘自象书 Processor 2 quad-core 2-2.5GHz CPUs, 一共8核 Memory 16-24 GB ECC RAM Storage 4 × 1TB SATA disks Network Gigabit Ethernet 1.使用多核CPU,可以让单台worker机器起多个task,充分压榨机器的能力 2.除了NameNode,其他结点不需要使用RAID,因为HDFS自己会做replication
摘自象书 Processor 2 quad-core 2-2.5GHz CPUs, 一共8核 Memory 16-24 GB ECC RAM Storage 4 × 1TB SATA disks Network Gigabit Ethernet 1.使用多核CPU,可以让单台worker机器起多个task,充分压榨机器的能力 2.除了NameNode,其他结点不需要使用RAID,因为HDFS自己会做replication
摘自象书 首先,最好用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逻辑
摘自象书 1. 文本:TextInpuFormat 2. 关系数据库: DBInputFormat 注意这是单个的数据源,没有Sharding. 如果数据很多,会有多个map task同时读它,可能导致数据库承受不了压力。 3. Hbase: TableInputFormat
摘自象书 一个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 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用的
摘自象书 宁要少量大文件,不要大量小文件(比如HDFS block还小若干量级) 因为: 1.一个文件就要一个map task 2.文件太多就需要很多map task 3.运行map task有额外开销 4.运行大量map task会带来过多开销 所以: 不要大量小文件
摘自象书: 引用 map: (K1,V1) => list(K2,V2) reduce: (K2,list(V2)) => (K3, V3)
在 上一篇文章里我们说了怎么搭建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/
我按pseudo mode启动了hadoop, 在java代码里将input/output文件都改成了hdfs://localhost/…, 在eclipse里启动Job也成功了,但为什么 http://localhost:50030/jobtracker.jsp里看不到我的job呢? 这个错误的确很低级。对hadoop服务器来说,hdfs服务和mapreduce服务是两个独立的服务,你启动Job成功了,只意味着你的客户端成功连上了hdfs服务,不代表你正在使用hadoop的mapreduce服务。。。
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> 待续