安装ecilpse hadoop插件:

  1. 下载hadoop-eclipse-plugin-1.1.2.jar放在eclipse plugins下.
  2. 进入eclipse 打开window—>preferences里配置hadoop Map/Reduce里hadoop的安装路径(就是hadoop解压后的文件目录,最后要的其实是jar包)
  3. 如果在window里远程调用haodop集群编程,那么需重新编译hadoop解压后根目录的hadoop-core-1.1.2.jar(注释掉checkReturnValue方法),网上一般有人编译好的。
  4. 打开 Map/Reduce Locations这个窗口,新建一个连接就可以连接dfs了。
    (注意端口:Map/Reduce Master为:config/mapred-site.xml里的mapred.job.tracker的值,DFS Master:为config/core-site.xml里fs.default.name的值)。
  5. 注意必须将config/hdfs-site.xml/里dfs.permissions设置为false才能够连接上。(如遇其他问题,请百度)
  6. 新建一个map/reduce项目,放入hadoop自带的wordcount就可以运行了。

了解MapReduce:

  1. MapReduce:编程模型,主要用来做数据分析.
    执行流程:
    用户程序代码
    ——》Inputformat(默认TextInputformat,针对文本文件。作用:分解数据,切分成小数据集InputSplit,key:行在文本中的位置,value:每一行的数据,一个InputSplit由一个mapper处理)
    ——》map(自己编写的程序代码)
    ——》(combine)(map段合并,减少机架间数据的传输)
    ——》partition(Mapper最终处理的键值对,是需要送到Reducer去合并的,合并的时候,
    有相同key的键/值对会送到同一个Reducer那。哪个key到哪个Reducer的分配过程,是由Partitioner规定的。它只有一个方法(getPartition(Text key, Text value, int numPartitions))
    输入是Map的结果对和Reducer的数目,输出则是分配的Reducer(整数编号)。
    就是指定Mappr输出的键值对到哪一个reducer上去。
    系统缺省的Partitioner是HashPartitioner,它以key的Hash值对Reducer的数目取模,得到对应的Reducer。
    这样保证如果有相同的key值,肯定被分配到同一个reducre上。如果有N个reducer,编号就为0,1,2,3……(N-1)。)
    ——》copy&merge
    ——》sort
    ——》reduce(如果没自定义partition,默认相同key的会被送到一个reduce上)——》outputformat(输出)
  2. 复杂的map,reduce函数
    MapReduce分为:map和reduce,那么分别对应map task和reduce task,一般我们自己写的map类继承Mapper类,重写map方法来编写我们对数据的处理,数据格式为,key为当前这行数据在文本中的偏移量,value为当前这一行的数据。
    一般我们重写Mapper类的map方法,特殊需要可重写setup(task启动之前调用,可以设置一些全局变量,初始化,监控task启动),
    cleanup(task结束之前调用),run(真正调用map的方法)方法.
  3. MapReduce job中共享全局变量
    由于map和reduce都是相对独立的,并且是跨jvm的,所以通过代码级别的共享是不能过做的。以下提供几种方法:
    第一种:读取hdfs文件,可以事先约定好一个文件,都去读取,来时变量共享。这样变量即可读也可写,但需注意并发写的时候。但这样无疑增加了I/O操作。
    第二种:设置job属性,通过config.set(“myName”, “shenjixiang”);//在config中设置全局变量。
    config.get(“myName”);//取得在config中设置的全局变量。这种在小数据可行且消耗资源小,但大数据量就有点乏力了。
    第三种:使用DistributedCache(是mapreduce为mapreduce提供的缓存文件的只读工具),可以缓存文本文件、压缩文件和jar文件等。

  4. hadoop job Scheduler:
    hadoop默认的调度器是基于队列的fifo调度器。
    所有用户的作业都被提交到一个队列中,jobtracker按照先后优先级高低,再按照提交时间先后执行。
    优点:调度算法简单明了,jobtrscker工作负担轻。
    缺点:忽略了不同作业的需求差异。
    hadoop有自己的io机制,io类都必须实现Wridtable接口.

  5. jobTracker失败:很严重。用zookeeper来协作JobTracker
    taskTracker失败:由于崩溃或运行过于缓慢,它会向JobTracker发送心跳
    如果有未完成的作业,JobTracker会重新把这些任务分配给其他taskTracker.
    即使taskTracker没有失败也可以被JobTracker列入黑名单。

MapReduce作业调优:

  1. Mapreduce:在执行mapreduce之前,原数据将被分割成多个split,
    每个split作为一个map任务的输入,在map执行过程中split会被分解成一个个记录(key-value对),map会依次处理每一个记录。
    一个1G的文件,会被分成16个64M的split并分配16个map任务处理。而1000个100kb的文件会被1000个map处理。自定义输入格式:继承FileInputFormat,重写isSplitable(。。)
  2. 重写getRecordReader()方法。输出:MultipleOutputFormat(一个reduce产生多个输出,用的多)TextOutputFormat:默认的输出(用的多)。
  3. 小文件优化解决:
    小文件合并、hadoop本身提共的压缩(gzip(用的多),bzip2,lzo(用的多))
    jvm重用 方法:开启jvm重用
    mapred.reduce.parallel.copies 方法:默认5,修改20

  4. mapper的数量:尽量将输入数据切分成数据块的整数倍。
    如有太多小文件,则考虑CombineFileInputFormat

  5. redudcer的数量:集群中reducer数应该略小于reducer的任务数
  6. combiner:充分使用合并函数减少map和reduce之间传递的数据量,combiner在map后运行。
  7. 中间值的压缩:conf.setCompressMapOutput(true)和setMapOutputCompressorClass(GzipCodec.class)
  8. 自定义序列:如果使用自定义的Writable对象或自定义的comparator,则必须确保已实现RawComparator.
文章目录
  1. 1. 安装ecilpse hadoop插件:
  2. 2. 了解MapReduce:
  3. 3. MapReduce作业调优:

Sides

IT技术分享博客