美文网首页
Hodoop学习

Hodoop学习

作者: 无羡爱诗诗 | 来源:发表于2018-12-06 13:22 被阅读58次

    一、巨人之肩---他山之石可以攻玉

    参考微博:

    Hadoop源码分析:

    http://www.cnblogs.com/zzjhn/p/3834764.html

    二、自己动手丰衣足食

    下载Hadoop3.0.3的源码,解压后

    工程结构目录

    三、详细分析

    pom.xml中的模块:

    一共14个module

    这14个模块都有自己独立的工程项目,都可以找到相应的pom.xml文件。

    All Hadoop JARs are now compiled targeting a runtime version of Java 8.

    Users still using Java 7 or below must upgrade to Java 8.

    JDK的版本必须是Java8及以上;

    辅助工程

    这个工程看不到源码,是一些新版本的修订和新增功能的介绍;

    1、Support for erasure coding in HDFS

    支持擦除编码技术,适用于储存较冷、较不频繁访问的数据;

    2、YARN Timeline Service v.2

    Apache Hadoop YARN (Yet Another Resource Negotiator,另一种资源协调者)是一种新的 Hadoop 资源管理器,它是一个通用资源管理系统,可为上层应用提供统一的资源管理和调度,它的引入为集群在利用率、资源统一管理和数据共享等方面带来了巨大好处。

    V.2的变革:体现在提高时间线服务的可扩展性和可靠性,以及通过引入流程和聚合来增强可用性。

    3、Shell script rewrite

    The Hadoop shell scripts have been rewritten to fix many long-standing

    bugs and include some new features.  While an eye has been kept towards

    compatibility, some changes may break existing installations.

    翻译就失真,所以贴英文。

    大衣就是The Hadoop shell 脚本被重写了,用于fix Bug ,并且加入了新特性。

    4、Shaded client jars

    This avoids leaking Hadoop's dependencies onto the application's classpath.

    避免Hadoop的依赖和应用程序的类路径扯上关系;

    5、Support for Opportunistic Containers and Distributed Scheduling.

    支持机会性容器和分布式调度;

    6、MapReduce task-level native optimization

    MapReduce has added support for a native implementation of the map output

    collector. For shuffle-intensive jobs, this can lead to a performance

    improvement of 30% or more.   可意会不可言传,不翻译。

    7、Support for more than 2 NameNodes.

    8、Default ports of multiple services have been changed.

    9、Support for Microsoft Azure Data Lake and Aliyun Object Storage System filesystem

    10、Intra-datanode balancer

    11、Reworked daemon and task heap management

    ---------------------

    A series of changes have been made to heap management for Hadoop daemons

    as well as MapReduce tasks.

    [HADOOP-10950](https://issues.apache.org/jira/browse/HADOOP-10950) introduces

    new methods for configuring daemon heap sizes.

    Notably, auto-tuning is now possible based on the memory size of the host,

    and the`HADOOP_HEAPSIZE` variable has been deprecated.

    See the full release notes of HADOOP-10950 for more detail.

    [MAPREDUCE-5785](https://issues.apache.org/jira/browse/MAPREDUCE-5785)

    simplifies the configuration of map and reduce task

    heap sizes, so the desired heap size no longer needs to be specified

    in both the task configuration and as a Java option.

    Existing configs that already specify both are not affected by this change.

    See the full release notes of MAPREDUCE-5785 for more details.

    12、S3Guard: Consistency and Metadata Caching for the S3A filesystem client

    ---------------------

    [HADOOP-13345](https://issues.apache.org/jira/browse/HADOOP-13345) adds an

    optional feature to the S3A client of Amazon S3 storage: the ability to use

    a DynamoDB table as a fast and consistent store of file and directory

    metadata.

    See[S3Guard](./hadoop-aws/tools/hadoop-aws/s3guard.html) for more details.

    13、HDFS Router-Based Federation

    ---------------------

    HDFS Router-Based Federation adds a RPC routing layer that provides a federated

    view of multiple HDFS namespaces. This is similar to the existing

    [ViewFs](./hadoop-project-dist/hadoop-hdfs/ViewFs.html)) and

    [HDFS Federation](./hadoop-project-dist/hadoop-hdfs/Federation.html)

    functionality, except the mount table is managed on the server-side by the

    routing layer rather than on the client. This simplifies access to a federated

    cluster for existing HDFS clients.

    See[HDFS-10467](https://issues.apache.org/jira/browse/HDFS-10467) and the

    HDFS Router-based Federation

    [documentation](./hadoop-project-dist/hadoop-hdfs/HDFSRouterFederation.html) for

    more details.

    14、API-based configuration of Capacity Scheduler queue configuration

    ----------------------

    The OrgQueue extension to the capacity scheduler provides a programmatic way to

    change configurations by providing a REST API that users can call to modify

    queue configurations. This enables automation of queue configuration management

    by administrators in the queue's`administer_queue` ACL.

    See[YARN-5734](https://issues.apache.org/jira/browse/YARN-5734) and the

    [Capacity Scheduler documentation](./hadoop-yarn/hadoop-yarn-site/CapacityScheduler.html) for more information.

    15、YARN Resource Types

    ---------------

    The YARN resource model has been generalized to support user-defined countable resource types beyond CPU and memory. For instance, the cluster administrator could define resources like GPUs, software licenses, or locally-attached storage. YARN tasks can then be scheduled based on the availability of these resources.

    See[YARN-3926](https://issues.apache.org/jira/browse/YARN-3926) and the[YARN resource model documentation](./hadoop-yarn/hadoop-yarn-site/ResourceModel.html) for more information.

    16、Getting Started

    ===============

    The Hadoop documentation includes the information you need to get started using

    Hadoop. Begin with the

    [Single Node Setup](./hadoop-project-dist/hadoop-common/SingleCluster.html)

    which shows you how to set up a single-node Hadoop installation.

    Then move on to the

    [Cluster Setup](./hadoop-project-dist/hadoop-common/ClusterSetup.html)

    to learn how to set up a multi-node Hadoop installation.

    弄清楚都有什么,都新增了什么功能后,不着急先全部搞明白,内容太多了,先把它用起来。

    四、使用Hadoop

    1、目标:Hadoop: Setting up a Single Node Cluster.  建立一个单节点集群。

    2、目的:This document describes how to set up and configure a single-node Hadoop installation so that you can quickly perform simple operations using Hadoop MapReduce and the Hadoop Distributed File System (HDFS).

    这个文档旨在说明如何建立和配置一个单节点 Hadoop installation,快速利用Hadoop MapReduce 和the Hadoop Distributed File System (HDFS)完成一些简单的操作。

    3、对硬件平台的要求:

    GNU/Linux is supported as a development and production platform. Hadoop has been demonstrated on GNU/Linux clusters with 2000 nodes.

    Windows is also a supported platform but the followings steps are for Linux only. To set up Hadoop on Windows, see wiki page.

    支持GNU/Linux平台,也支持Windows,但是本文针对GNU/Linux平台。

    4、对软件的要求:

    Required software for Linux include:

    Java™ must be installed. Recommended Java versions are described at HadoopJavaVersions.

    ssh must be installed and sshd must be running to use the Hadoop scripts that manage remote Hadoop daemons.

    除了相应版本的java,还需要安装ssh和sshd.

    安装软件

    5、To get a Hadoop distribution, download a recent stable release from one of the Apache Download Mirrors.  下载Hadoop distribution, 下载一个近期的稳定的release版本。

    6、准备启动 the Hadoop Cluster

    解压后,要在 the file etc/hadoop/hadoop-env.sh 做一点配置;

    配置

    7、用它支持的三种模式的一种启动Hadoop cluster 

    Local (Standalone) Mode    本地模式

    Pseudo-Distributed Mode   伪-分布式模式

    Fully-Distributed Mode       全-分布式模式

    五、Hadoop是什么?是谁的组成部分?和谁一起配合工作?

    Hadoop是大数据处理引擎,离线数据处理平台,它的竞争者叫:Spark.

    大数据学习、分布式学习

    YARN:另一种资源协调者

    什么是分布式系统?

    分布式系统是由一组通过网络进行通信、为了完成共同的任务而协调工作的计算机节点组成的系统。分布式系统的出现是为了用廉价的、普通的机器完成单个计算机无法完成的计算、存储任务。其目的是利用更多的机器,处理更多的数据。  详细了解请参考:

    https://www.cnblogs.com/xybaby/p/7787034.html(引用该博客内容)

    分布式系统的2点主要思想:分片(partition) 和 冗余或者复制集(Replication)。

    分布式系统挑战

      分布式系统需要大量机器协作,面临诸多的挑战:

      第一,异构的机器与网络:

        分布式系统中的机器,配置不一样,其上运行的服务也可能由不同的语言、架构实现,因此处理能力也不一样;节点间通过网络连接,而不同网络运营商提供的网络的带宽、延时、丢包率又不一样。怎么保证大家齐头并进,共同完成目标,这四个不小的挑战。

      第二,普遍的节点故障:

        虽然单个节点的故障概率较低,但节点数目达到一定规模,出故障的概率就变高了。分布式系统需要保证故障发生的时候,系统仍然是可用的,这就需要监控节点的状态,在节点故障的情况下将该节点负责的计算、存储任务转移到其他节点

      第三,不可靠的网络:

        节点间通过网络通信,而网络是不可靠的。可能的网络问题包括:网络分割、延时、丢包、乱序。

        相比单机过程调用,网络通信最让人头疼的是超时:节点A向节点B发出请求,在约定的时间内没有收到节点B的响应,那么B是否处理了请求,这个是不确定的,这个不确定会带来诸多问题,最简单的,是否要重试请求,节点B会不会多次处理同一个请求。

    总而言之,分布式的挑战来自不确定性,不确定计算机什么时候crash、断电,不确定磁盘什么时候损坏,不确定每次网络通信要延迟多久,也不确定通信对端是否处理了发送的消息。而分布式的规模放大了这个不确定性,不确定性是令人讨厌的,所以有诸多的分布式理论、协议来保证在这种不确定性的情况下,系统还能继续正常工作。

    而且,很多在实际系统中出现的问题,来源于设计时的盲目乐观,觉得这个、那个应该不会出问题。Fallacies_of_distributed_computing很有意思,介绍了分布式系统新手可能的错误的假设。

    一个简化的架构图:

    说明Hadoop的位置

    用一个请求串起来

      用户使用Web、APP、SDK,通过HTTP、TCP连接到系统。在分布式系统中,为了高并发、高可用,一般都是多个节点提供相同的服务。那么,第一个问题就是具体选择哪个节点来提供服务,这个就是负载均衡(load balance)。负载均衡的思想很简单,但使用非常广泛,在分布式系统、大型网站的方方面面都有使用,或者说,只要涉及到多个节点提供同质的服务,就需要负载均衡。

      通过负载均衡找到一个节点,接下来就是真正处理用户的请求,请求有可能简单,也有可能很复杂。简单的请求,比如读取数据,那么很可能是有缓存的,即分布式缓存,如果缓存没有命中,那么需要去数据库拉取数据。对于复杂的请求,可能会调用到系统中其他的服务。

      承上,假设服务A需要调用服务B的服务,首先两个节点需要通信,网络通信都是建立在TCP/IP协议的基础上,但是,每个应用都手写socket是一件冗杂、低效的事情,因此需要应用层的封装,因此有了HTTP、FTP等各种应用层协议。当系统愈加复杂,提供大量的http接口也是一件困难的事情。因此,有了更进一步的抽象,那就是RPC(remote produce call),是的远程调用就跟本地过程调用一样方便,屏蔽了网络通信等诸多细节,增加新的接口也更加方便。

      一个请求可能包含诸多操作,即在服务A上做一些操作,然后在服务B上做另一些操作。比如简化版的网络购物,在订单服务上发货,在账户服务上扣款。这两个操作需要保证原子性,要么都成功,要么都不操作。这就涉及到分布式事务的问题,分布式事务是从应用层面保证一致性:某种守恒关系。

      上面说道一个请求包含多个操作,其实就是涉及到多个服务,分布式系统中有大量的服务,每个服务又是多个节点组成。那么一个服务怎么找到另一个服务(的某个节点呢)?通信是需要地址的,怎么获取这个地址,最简单的办法就是配置文件写死,或者写入到数据库,但这些方法在节点数据巨大、节点动态增删的时候都不大方便,这个时候就需要服务注册与发现:提供服务的节点向一个协调中心注册自己的地址,使用服务的节点去协调中心拉取地址。

      从上可以看见,协调中心提供了中心化的服务:以一组节点提供类似单点的服务,使用非常广泛,比如命令服务、分布式锁。协调中心最出名的就是chubby,zookeeper。

      回到用户请求这个点,请求操作会产生一些数据、日志,通常为信息,其他一些系统可能会对这些消息感兴趣,比如个性化推荐、监控等,这里就抽象出了两个概念,消息的生产者与消费者。那么生产者怎么讲消息发送给消费者呢,RPC并不是一个很好的选择,因为RPC肯定得指定消息发给谁,但实际的情况是生产者并不清楚、也不关心谁会消费这个消息,这个时候消息队列就出马了。简单来说,生产者只用往消息队列里面发就行了,队列会将消息按主题(topic)分发给关注这个主题的消费者。消息队列起到了异步处理、应用解耦的作用。

      上面提到,用户操作会产生一些数据,这些数据忠实记录了用户的操作习惯、喜好,是各行各业最宝贵的财富。比如各种推荐、广告投放、自动识别。这就催生了分布式计算平台,比如Hadoop,Storm等,用来处理这些海量的数据。

      最后,用户的操作完成之后,用户的数据需要持久化,但数据量很大,大到按个节点无法存储,那么这个时候就需要分布式存储:将数据进行划分放在不同的节点上,同时,为了防止数据的丢失,每一份数据会保存多分。传统的关系型数据库是单点存储,为了在应用层透明的情况下分库分表,会引用额外的代理层。而对于NoSql,一般天然支持分布式。

    Hadoop是分布式计算平台,用来处理海量的数据。

    重要概念:

    负载均衡:

        Nginx:高性能、高并发的web服务器;功能包括负载均衡、反向代理、静态内容缓存、访问控制;工作在应用层

        LVS: Linux virtual server,基于集群技术和Linux操作系统实现一个高性能、高可用的服务器;工作在网络层

    webserver:

        Java:Tomcat,Apache,Jboss

        Python:gunicorn、uwsgi、twisted、webpy、tornado

    service: 

        SOA、微服务、spring boot,django

    容器:

        docker,kubernetes

    cache:

        memcache、redis等

    协调中心:

        zookeeper、etcd等

        zookeeper使用了Paxos协议Paxos是强一致性,高可用的去中心化分布式。zookeeper的使用场景非常广泛,之后细讲。

    rpc框架:

        grpc、dubbo、brpc

        dubbo是阿里开源的Java语言开发的高性能RPC框架,在阿里系的诸多架构中,都使用了dubbo + spring boot

    消息队列:

        kafka、rabbitMQ、rocketMQ、QSP

        消息队列的应用场景:异步处理、应用解耦、流量削锋和消息通讯

    实时数据平台:

        storm、akka

    离线数据平台:

        hadoop、spark

        PS: apark、akka、kafka都是scala语言写的,看到这个语言还是很牛逼的

    dbproxy:

        cobar也是阿里开源的,在阿里系中使用也非常广泛,是关系型数据库的sharding + replica 代理

    db:

        mysql、oracle、MongoDB、HBase

    搜索:

        elasticsearch、solr

    日志:

        rsyslog、elk、flume

    其它参考资料:

    Distributed systems for fun and profit  

    刘杰:分布式原理介绍

    Fallacies_of_distributed_computing

    CMU 15-440: Distributed Systems Syllabus

    Distributed Systems Principles and Paradigms

    学习分布式系统需要怎样的知识?

    Hadoop家族产品说明:

    Hadoop家族产品

    Apache Hadoop: 是Apache开源组织的一个分布式计算开源框架,提供了一个分布式文件系统子项目(HDFS)和支持MapReduce分布式计算的软件架构。

    Apache Hive: 是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。

    Apache Pig: 是一个基于Hadoop的大规模数据分析工具,它提供的SQL-LIKE语言叫Pig Latin,该语言的编译器会把类SQL的数据分析请求转换为一系列经过优化处理的MapReduce运算。

    Apache HBase: 是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。

    Apache Sqoop: 是一个用来将Hadoop和关系型数据库中的数据相互转移的工具,可以将一个关系型数据库(MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。

    Apache Zookeeper: 是一个为分布式应用所设计的分布的、开源的协调服务,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,简化分布式应用协调及其管理的难度,提供高性能的分布式服务

    Apache Mahout:是基于Hadoop的机器学习和数据挖掘的一个分布式框架。Mahout用MapReduce实现了部分数据挖掘算法,解决了并行挖掘的问题。

    Apache Cassandra:是一套开源分布式NoSQL数据库系统。它最初由Facebook开发,用于储存简单格式数据,集Google BigTable的数据模型与Amazon Dynamo的完全分布式的架构于一身

    Apache Avro: 是一个数据序列化系统,设计用于支持数据密集型,大批量数据交换的应用。Avro是新的数据序列化格式与传输工具,将逐步取代Hadoop原有的IPC机制

    Apache Ambari: 是一种基于Web的工具,支持Hadoop集群的供应、管理和监控。

    Apache Chukwa: 是一个开源的用于监控大型分布式系统的数据收集系统,它可以将各种各样类型的数据收集成适合 Hadoop 处理的文件保存在 HDFS 中供 Hadoop 进行各种 MapReduce 操作。

    Apache Hama: 是一个基于HDFS的BSP(Bulk Synchronous Parallel)并行计算框架, Hama可用于包括图、矩阵和网络算法在内的大规模、大数据计算。

    Apache Flume: 是一个分布的、可靠的、高可用的海量日志聚合的系统,可用于日志数据收集,日志数据处理,日志数据传输。

    Apache Giraph: 是一个可伸缩的分布式迭代图处理系统, 基于Hadoop平台,灵感来自 BSP (bulk synchronous parallel) 和 Google 的 Pregel。

    Apache Oozie: 是一个工作流引擎服务器, 用于管理和协调运行在Hadoop平台上(HDFS、Pig和MapReduce)的任务。

    Apache Crunch: 是基于Google的FlumeJava库编写的Java库,用于创建MapReduce程序。与Hive,Pig类似,Crunch提供了用于实现如连接数据、执行聚合和排序记录等常见任务的模式库

    Apache Whirr: 是一套运行于云服务的类库(包括Hadoop),可提供高度的互补性。Whirr学支持Amazon EC2和Rackspace的服务。

    Apache Bigtop: 是一个对Hadoop及其周边生态进行打包,分发和测试的工具。

    Apache HCatalog: 是基于Hadoop的数据表和存储管理,实现中央的元数据和模式管理,跨越Hadoop和RDBMS,利用Pig和Hive提供关系视图。

    Cloudera Hue: 是一个基于WEB的监控和管理系统,实现对HDFS,MapReduce/YARN, HBase, Hive, Pig的web化操作和管理。

    这个网站有很多学习内容:http://blog.fens.me/hadoop-family-roadmap/

    相关文章

      网友评论

          本文标题:Hodoop学习

          本文链接:https://www.haomeiwen.com/subject/djmncqtx.html