您的位置:首页 > 运维架构

hadoop in action 读书笔记-第123章

2016-03-16 10:28 225 查看
第一章

    需要处理的数据变的超多,且增长速度也在增长,一种利用多机器的分布式和可扩展计算框架是迫切需求。这个大数据的时代的程序员必须有拥有处理大数据的能力

    pc组成的服务器矩阵比大型机小型机廉价且易得

        hadoop对其硬件基础-pc矩阵-采取了硬件容错策略,容许某个节点的不可用.包括数据节点和计算阶段。

        hadoop的架构可以直接添加硬件,以获得线性的计算能力

        MapReduce框架能容易开发出高效的并行程序

        不必自行分割数据

        不必分配调度执行节点

    在pc集群基础上,hadoop讲计算和数据都分作多个部分,多台机器同时参与数据IO和计算。而且,考虑到大数据之大,pc间传递的是计算任务不是被计算的数据。这个被称为计算向数据移动。

    比较传统的数据库应用,

        1数据库数据向计算移动

        2吞吐的提升采用替换高级硬件,扩容有限

        3关系数据模型不够灵活

        4查询sql,但mapreduce可以完成更复杂的数据查询功能

        5实时随机读写,离线批量读取

    hadoop的底层文件系统设计决定了hadoop处理的以一次写入多次读取为主。

    理解Map和Reduce 编程模型

        将一个对数据的计算任务拆作两部,map和reduce。

        map是将一个数据源分作多个数据源,在小规模数据上进行计算,同时过滤与转换

        reduce接过map的输出,将接过并归,输出最终的形式,这一步也是同时聚合

        工业上在map和reduce中间一般加入分区和归约阶段,进一步降低处理数据的规模。

第二章

    Hadoop结构

        在Hadoop集群中,有的角色仅仅对应单个服务器,有的角色对应多个服务器

        

        hadoop的计算和存储都采用主从结构。

        角色NameNode|Secondary NameNode

            NameNode在HDFS的主端,指导从端的DataNode执行IO任务。

            跟踪文件分割成block,大小

            block又被哪些从端存储

            监控整个分布文件系统的运行状态

            为了防止NameNode的单点失效,SecondaryNameNode

        角色DataNode

            DataNode存在于集群上的每个机器。

            负责在HDFS读取block,或者将block写入本地文件系统的实际文件中

            NameNode告知客户端一个文件的block分布哪些DataNode中。

            客户端直接访问DataNode,进行读取或写入。一个DataNode写入完毕,会负制两份,其中一份在本机架上。写入和复制是一个事务有完成性保证。

            

        角色JobTracker

            JobTracker执行提交的作业。

            决定处理那些文件

            为不同的任务分配节点

            监控任务运行

            如果任务失败,重新启动任务

            任务过慢,安排新的执行

            集群中只有一个JobTracker,小型集群和NameNode在一个个机器上,大型集群各自独立

        角色TaskTracker

            和DataNode一样,存在于集群中的每台机器。意思就是说有数据的地方就有计算,要计算的时候,身边必须有数据。牢记一句话,在大数据语境下计算向数据移动。

            执行JobTracker分配的单项任务。

            虽然每台机器仅有一个TaskTracker,但一个TaskTracker可以启动多个jvm进程

            管理任务在从节点上的执行情况。

            向JobTracker心跳通信

            

    3种工作模式

        安装Hadoop集群,需要专门一个主节点。存在NameNode和JobTracker

        Hadoop集群机器之间的通信,依赖SSH协议,不是普通的tcp协议

        主节点和从节点的通信依赖无口令的SSH协议。公钥存在每个节点,私钥在主节点。

        定义一个公共账号,集群中每台机器都使用这个账号执行管理Hadoop

        安装OpenSSH

        在主节点生成SSH密钥对 不输入口令

            ssh-keygen -t rsa

                enter file in which to the key {/home/$USER/.ssh/id_rsa}

            私钥为 /home/$USER/.ssh/id_rsa

            公钥为 /home/$USER/.ssh/id_rsa.pub

        逐一将公钥复制到主节点及每个从节点上

            scp ~/.ssh/id_rsa.pub $USER/@target:~/master_key

        在目标节点上将刚刚的公钥设置为授权密钥

            cat ~/master_key >> ~/.ssh/authorized_keys

        从主节点上连接从节点作测试

            ssh target

        必要配置

            HADOOP_HOME/conf/hadoop-env.sh

                export JAVA_HOME=/usr/share/jdk

        单机配置

            最小配置,不需要和其他节点交互,也不需要HDFS,主要用户开发调试

            HADOOP_HOME/conf/core-site.xml

            HADOOP_HOME/conf/hdfs-site.xml

            HADOOP_HOME/conf/mapred-site.xml

        伪集群配置

            在一台机器上模拟一个集群,允许检查内存使用,使用HDFS IO,允许节点之间相交互

            as 从节点

            HADOOP_HOME/conf/core-site.xml

                <property>

                    <name>fs.default.name

                    <value>hdfs://localhost:9000

                    <description>

                </property>

            as 从节点

            HADOOP_HOME/conf/hdfs-site.xml

                <property>

                    <name>dfs.replication

                    <value>1

                    <description>

                </property>

            as 从节点

            HADOOP_HOME/conf/mapred-site.xml

                <property>

                    <name>mapred.job.tracker

                    <value>localhost:9001

                    <description>

                </property>

            as 从节点

            在文件masters中指定SNN的位置

            as 主节点

            在文件slaves中指定从节点的位置

        集群配置

            HADOOP_HOME/conf/core-site.xml

                <property>

                    <name>fs.default.name

                    <value>hdfs://$master:9000

                    <description>

                </property>                

            HADOOP_HOME/conf/hdfs-site.xml

                <property>

                    <name>dfs.replication

                    <value>3

                    <description>

                </property>                

            HADOOP_HOME/conf/mapred-site.xml

                <property>

                    <name>mapred.job.tracker

                    <value>$master:9001

                    <description>

                </property>    

            在文件masters中指定SNN的位置

            在文件slaves中指定从节点的位置    

            复制配置到每台机器

            master$ HADOOP_HOME/bin/hadoop namenode-format        

            master$ HADOOP_HOME/bin/start-all.sh

    web工具

        集群监控

第三章

    管理HDFS

        数据文件在别处生成

        合成大文件,HDFS存储,被分割成N个block分散在集群内部

        JobTracker根据文件所在,安排Mapreduce的工作地址,所谓计算向数据移动嘛

        对于mapreduce任务来说,其输入数据也就是对文件的读取一般是由Hadoop框架完成的

        通常来说处理一个大文件要比处理若干小文件有效率。

        Hadoop Api

        FileSystem hdfs=FileSystem.get();

        FileSystem disk=FileSystem.getLocal();

        Path uri= new Path("schema://path");

        FileStatus file;

        FSDataInputStream stream = filesystem.open(path);

        stream.close();

        FSDataOutputStream stream = filesystem.create(path);

        stream.close();

    MapReduce框架

        MapReduce框架 输入数据和输出数据都是以键值对为基础

        其中键要求实现WritableComparable可以序列化可以比较

        其中值要求实现Writable可以序列化

        文件被分割成若干小块,离散存储在集群内

        选择输入格式,来执行数据分割

            InputFormat<K,V>

                InputSplit[] getSplits(JobConf,int numSplits);

                RecordReader<K,V> getRecordRead(InputSplit,JobConf,Reporter);

            确定了对输入数据何如分片,小于HDFS中一个块的大小大于mapred.min.split.size字节,一般一个分片就是一个块

            每个MapReduce任务被分配一个分片

            循环提取分片中的记录,解析为预定义的键值对    

            TextInputFormat 一行为一个记录 <字节偏要,行文本>

            KeyValueTextInputFormat 一行为一个记录 <分隔符前文本,分隔符后文本>

            SequenceFileInputFormat<K,V> Hadoop专用的压缩二进制文件,专用作业 间的传递

            NLineInputFormat TextInputFormat相同,每个分片有N行

            conf.setInputFormat(xxxFormat.class);

        开始map过程 void map(K1,V1,OutputCollection<K2,V2>,Report)throw IOException;

            该函数处理一个给定的键值对

            生成一个键值对列表,这是输出的结果

            report是对任务的报告

            IdentityMapper   直接映射

            InverseMapper    反转

            RegexMapper      为每个表达式的匹配生成一个计数为1的对

            TokenCountMapper

        在输出键值对列表前,我们可以将一个键的多项值进行合并

            可以求合

            也可以其他计算

            OutputFormat<K,V>

        分区,重定向mapper的输出,

            如何确定map的输出分给哪一个节点?

            默认是对键是默认的散列取值,相同的hash值分配到同一个节点

            Interface Partitioner<Key,Writable>

                public int getPartition(Key,Writable,int numberPartitions);

        洗牌 这个过程是各个job节点间唯一通信的阶段,是扩展的瓶颈所在

            在经过合并和分区之后,Reduce节点要拉取数据进入reduce计算

            数据通过http从JobTracker获取,

            在map阶段我们为了reduce能快速计算,对每个输出的keyvalue做了分区,标记了keyvalue属于哪个reduce节点

            jobTracker告知reduce节点,在哪个DataNode上去拉取哪些keyvalue。

            如果在map阶段有过排序,那么reduce的拉取就会集中在某一range,减少随机读,可以提高效率

            reduce节点将拉取到的数据merge成一个文件可能在内存也可能在磁盘,将这个文件应用于reduce计算

            整个过程表现 没有对map节点的结果全盘接受,而是不同reduce节点在每个map节点选择的性的拉取了部分数据,看上去像洗牌

            合并,减小数据量

            排序,减少随机读,促成批量顺序读

            尽量将一个map节点的数据,对应一个reduce节点,避免两组机器通信的笛卡尔乘积

        开始reduce过程 void reduce(K2,Iterator<V2>,OutputCollection<K3,V3>,Report)throw IOException;

            接受来吧各个Mapper的数据,按照键进行排序,并对相同键的值进行归并。

            然后再调用reduce函数,迭代处理相关的值列表

            report报告任务进度
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hadoop MapReduce