代码改变世界

hadoop笔记2012-03

2012-05-01 11:03  金融与IT的极速狂想曲  阅读(198)  评论(0)    收藏  举报

2012.2.28
pssh -h ~/machines -P 'sleep ${HOSTNAME:1}; scp s1:~/hadoop-0.23.0.tar.gz ~/'


2012.2.29
1。inputsplit的大小一般都是一个块的大小,也就是64M,一个inputsplit需要一个map任务来处理。

2012.3.8
1.hadoop 0.23中,hadoop-config.sh中的变量都来自hadoop-env.sh
2.hadoop 0.23中,所有的节点的配置都是相同的,没有必要分别为namenode,datanode进行配置。
3。namenode存放元数据,fsimage和log文件,融合成新的fsimage.SNN过一个checkpoint会自动的产生新的fsimage.Backupnode实现namenode的热备份,只要log文件发生变化,会自动更新backupnode的log文件。

4.那些是namenode,那些是datanode,在HADOOP_CONF_HOME/slaves就可以判断的出来。
5.hadoop 0.23中,因为有多个namespace,所以操作时应该指明namespace,若没有指明,则用默认的namenode,参数在FS.default标明。eg.bin/hadoop -ls hdfs://s2:9000/


2012.3.9
1.MR v1.V2 FailOut
共同点:task failure,默认task超过4次失败,jobtracker(从tasktracker的heartbeat得到的,)就将该任务视为失败,不会再被重试。
不同点:. V1中的tasktracker失败后,将会重启所有的task,只要这个task所在的job还未完成。而V2中的applicationMaster或nodeManager失败后,不需要重启task,因为新的会保留运行的状态,直接会从原来运行的状态中直接恢复。
.V1中的jobtracker一失败,那集群就完了,因为他是单点失败,所有的job都得重启。而V2中的RM他的状态,例如,ApplicationMaster和NodeManager的状态都能保存,也就是说不需从头做起,而是从中间的某个状态做起。

2.job Scheduling:V1 用FiFO,V2 用capacity Schedule,默认。capacity schedule 是 fairSchedule 和Fifo的结合体,采取多队列优先级调度,队列之间采取FIFo,每个队列采取Fair Schedule.

*3.map产生的中间结果会在job完成之后才会删除,还有V1版的jobtracker知道 map与Hosts的对应映射关系。而V2版的没有这种信息。

2012,3.14
1.hadoop0.23配置的新发现,未验证。
-》启动dfs时,hadoop只会查hadoop-env.sh的变量; 然而启动yarn时,hadoop会先查hadoop-env,然后在再查yarn-env,也就是说yarn-env.sh对yarn来说优先级更高。
-》设置环境变量,只在hadoop-env.sh,尽量不要在其他地方设。

2012.3.16
1.partitioner,作用是将map产生的key-value对分配到特定的reducer(分区)中,系统默认的方法是hashPartitioner。reducers数量的设置可以在配置文件中,也可以在作用驱动程序中的setNumReduceTask(int n)设置;http://samwalt.iteye.com/blog/1150665
2.也要注意shuffle的过程,它包括partitition的过程,其实partition的过程它还有一个内排序的过程。是在partitioner当中。如果还有combine的过程的话,那么它只会针对已经排好序的partitioner进行操作。


2012.3.19
1.chained MR实现方法:MR1|MR2,也就是在MR1的JobClient.run(job)之后,启动另外一个MR2的jobConf,第二个输入即是第一个的输出。
2.如果C依赖A,B。那你只能在C中的jobconf job.addAppendingJob(A,B),它的作用是只有A,B同时完成时,C才会启动。
3.处理需要对数据进行预处理或者是后处理的应用时,例如格式:m1,m2,r1,m3,m4时,就需要用到ChainedMapper和ChainedReducer。
。ChainedMapper.addMapper(byValue),byValue设置为true,表明mapper1的输出数据的格式会做处理,以对应mapper2的输入格式。

JOIN
ReduceSide
group key,就是join key; tag,表示该记录属于哪张表。
TaggedMapoutput类,作用,将tag绑定记录,是一个数据类型。

4.DataJoinMapperBase:generateInputTag(),主要在map阶段产生tags,一般都是文件名。
5.DataJoinReducerBase,实现了Reducer-join其他的功能,用户只需要完成combine()方法就成,该方法过滤不必要的record,连接相同key的record.过滤方法:若combine()方法中tags[]数组没有包含所有的tags,就把它过滤掉。连接的时候,要注意,将原来的join key从字符串中剔出来,不然,连接的结果会出现多个join key.
MapSide
*6.只需在map端进行join操作,那就意味着,还需针对数据集进行partition操作,并且给定适当的inputFormat和RecordReader,就可以了。但是,repartition的代价会影响效率。
7。mapper类初始化时,会调用configure()方法,也就是mapper方法前的准备工作。

8。bin/hadoop -jar -files file1,file2..,实现了DistrubutedCache的功能,能将file1,file2..copy到该集群所有的task nodes上。

2012.3.22
1job.set("mapred.textoutputformat.separator",","),job为jobConf的实例,它其实调用的是Configuration的set方法,主要是设置属性。。
2,jobConf job=new JobConf(false),该jobConf不会使用默认的设置。

2012.3.23
INPUTFORMAT 和 OUTPUTFORMAT
1.mapreduce默认的一些东西:
。输入格式,textInputFormat,key为LongWritable,value为这条记录。
。patitioner,默认的是HashPatitioner,按照key Partition。
。输出格式,textOutputFormat,将key和value转换成字符串,中间用tab进行分隔。
2。NullWritable,如果你不想输出key或value的话,可以用它了。
3。不想切分文件,那就在InputFormat中的splitable()方法中设置为false.
4.CombineInputFormat是一个抽象类,他主要处理小文件,能将若干个小文件压缩到一个文件中。(尽量选择一些可以切分的压缩算法)

2012。3。24
INPUTFORMAT 和OUTPUTFORMAT
1。处理单行文本,用KeyValueTextInputFormat,其中的key.value.separator.in.input.line指定分隔符。新版的是mapreduce.input.keyvaluelinerecordreader.key.value.separator.
2。NLineInputFormat,指定一个mapper处理多少行,N默认为1,设置是由属性mapred.line.input.format,linspermap控制。
3。处理XML文本时,Hadoop也有独特的处理方式。inputFormat为StreamInputFormat,RecordReader为StreamXmlRecordReader。设置相应的属性,决定StreamXmlRecordReader的开始标签和结束标签。
4。textinputformat.record.delimiter,属性,决定text的每一行的限定符

2012.3.25
1.减少Split,也是提高Hadoop性能的一个很好的法子。因为减少Split,意味着map的数量相应的减少,从而减少了管理Mapper涉及的任务管理和启动开销。

2.MapFile的概念:
Open Declaration org.apache.hadoop.io.MapFile

A file-based map from keys to values.

A map is a directory containing two files, the data file, containing all keys and values in the map, and a smaller index file, containing a fraction of the keys. The fraction is determined by Writer.getIndexInterval().

The index file is read entirely into memory. Thus key implementations should try to keep themselves small.

Map files are created by adding entries in-order. To maintain a large database, perform updates by copying the previous version of a database and merging in a sorted change list, to create a new version of the database in a new file. Sorting large change lists can be done with SequenceFile.Sorter.

3.2012.3.28
cassandra与hadoop的比较:http://www.bloorresearch.com/blog/IM-Blog/2012/1/cassandra-hadoop.html
1。cassandra是column store, hdfs是key-value store
2.cassandra有realTime,而hadoop没有。cassandra能解决单点失败问题,而hadoop没有(目前来说,以后未知)
3。cassandra比较难启动,安装困难。

2012.3.29
1.hadoop eclipse插件的编译
在eclipse中通过导入hadoop\src\contrib\eclipse-plugin\build.xml新建工程eclipse-plugin,
在hadoop\src\contrib\build-contrib.xml中添加:
<property name="version" value="1.0.0"/>
<property name="eclipse.home" location="E:/soft/develop/java/eclipse/"/> //设置你自己的eclipse路径
复制代码
使用ant编译即可生成

2012.4.3
1.avro解决了writable的不足:语言的移植性差,只适合java。
2.MapFile是排过序的SequenceFile.