hadoop原理学习记录

1.hdfs:

靠谱:有备份写入hdfs系统时,生成一个校验和,传输数据时再生成一个校验和,传输完成时又生成一个校验和。对比上传前后校验和。

每个datanote运行一个守护线程datablockscanner数据块扫描器。

2.namenode刚启动工作过程:

      进入安全模式,加载fsimage和edit日志(镜像和编辑日志)。如果满足最小副本条件(99.9%的块存在一个副本,默认值是1)

      datanode节点向namenode注册,namenode会生成一个dataNode集合。datanode不断向namenode发送心跳,

相邻的两个心跳间隔大于namenode设定的间隔时,则默认断链。datanode在发送心跳时也可以包含其他的信息,

TaskTracker定期向JobTracker发送心跳,除了保持活动以外,还会报告TaskTracker当前可以执行的Map和Reduce的剩余配额(还剩下多少数据待处理)。

Hadoop优先追求Map的Data-local,也就是输入数据存放在本地。如果不能满足,则退而求其次,追求Rack-local,也就是输入数据存放在同一机架的其他机器上,

这样的话网络开销对性能影响一般不会太大

3.MR运行原理:job配置+job执行

      1.与spark类似,spark会创建新的RDD,然后交由master分配executor。job会根据配置(读取文件路径,mapper输入KEY、Value类型等)先计算出分片等生成临时文件,存放

      到hdfs上,资源管理器根据生成的分片等信息分配datanote

      2.如果处理的文件小时,启动map和reduce线程占用作业的时间比就会很大,增大了资源管理器的开销。

      3.mapper输出的结果会写到磁盘里面,spark优先是对着内存进行操作的

4.MR执行过程:

split -> map -> spill -> partition ->shuffle(排序、分组) -> [combiner] -> reduce

map reduce作业初始化的时间是比较长的

在map根据默认key的hash值往分区写key-value时,shuffle可以并行执行key排序及分组,都是在磁盘上做的操作

全排序(采样器),二次排序-组合key(客户文件和订单文件,同一个客户下的订单放到同一个分区里).重写分区类,使同一个key分到同一个分区内,这样在reduce里就不用聚合用一个key的values值,节省reduce时间。

      InputFormat(定义数据源)->RecordReader -> map -> shuffle[排序、分组、聚合] -> reduce ->OutputFormat

5.切片法则:

在切片最大值、切片最小值、blocksize中选择一个max(splitMinx,min(blocksize, splitMax))。确定好切片大小之后,根据文件总大小,除于切片大小,得出分片数量

6.当job启动的mapper数量太多

而超出了系统限制时,就会导致Hadoop抛出异常。该场景有:

      1.输入文件size巨大,切片不是很大,导致有很多的分区

      2.输入文件数量巨大,但都是小文件。MR默认一个文件对应一个map作业。

7.分片:

使用fileSplit进行InputFormat文件划分,有文件存放位置Path file,有起始文件既偏移量,分片长度既大小,所属服务器集合。

可能一个分片包含了多个block(例如combineFileInputFormat)。继承InputFormat,里面有个划分片的接口.

8.分布式缓存:

如果一方数据集文件量小时,可以直接加载到内存中。比如客户文件和订单文件。客户文件较小,就可以直接放到内存中。

//将hdfs上的文件加入分布式缓存

job.addCacheFile(new URI("hdfs://url:port/filename#symlink"));

之后在map/reduce函数中可以通过context来访问到缓存的文件,一般是重写setup方法来进行初始化

protected void setup(Context context) throws IOException, InterruptedException {

        super.setup(context);

        if (context.getCacheFiles() != null && context.getCacheFiles().length > 0) {

        String path = context.getLocalCacheFiles()[0].getName();

        File itermOccurrenceMatrix = new File(path);

        FileReader fileReader = new FileReader(itermOccurrenceMatrix);

        BufferedReader bufferedReader = new BufferedReader(fileReader);

        String s;

        while ((s = bufferedReader.readLine()) != null) {

            //TODO:读取每行内容进行相关的操作

        }

        bufferedReader.close();

        fileReader.close();

    }

}

9.chainMapper链条Mapper

在job配置中,连续两次job.addMapper即可。

11.hadoop模块

Common hdfs mapreduce yarn

12.部署模式

独立/本地模式:解压缩包就是了

伪分布式:在一台服务器做了配置

完全分布式:在多台服务器上做了配置

13.hadoop优化:

1.分布式缓存

2.防止启动过多的mapper线程和reduce线程(包含数据量过大或小文件过多两种情况)。因为他们初始化时间太长,增加系统开销。

3.防止数据倾斜,合理进行分区,避免出现一台数据节点忙死,一台数据节点闲死。

hadoop优化这一块写的不是太详细,后续会跟hive结合起来做一次优化记录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值