hadoop

hadoop

制作人:全心全意

Hadoop简介

  Hadoop是一种开源的适合大数据的分布式存储和处理的平台。作为一种大规模分布式数据处理平台,Hadoop已成为许多程序员的一项重要技能。

  Hadoop本身就是一个并行处理系统

  Hadoop是Apache基金会旗下的一个开源的分布式计算平台,是基于Java语言开发的,有很好的跨平台特性,并且可以部署在廉价的计算机集群中。用户无需了解分布式底层细节,就可以开发分布式程序,充分利用集群的威力进行高速运算和存储。

  最初,Hadoop的核心技术是HDFS和MapReduce。

  HDFS是Hadoop分布式文件系统(Hadoop Distributed File System)的简称,它具有较高的读写速度,很好的容错性和可伸缩性,为海量的数据提供了分布式存储,其冗余数据存储的方式很好的保证了数据的安全性。

  MapReduce是一种用于并行处理大数据集的软件框架(编程模型)。用户可在无需了解底层细节的情况下,编写MapReduce程序进行分析和处理分布式文件系统上的数据,MapReduce保证了分析和处理数据的高效性。

  因其在分布式环境下提供了高效的,海量的数据的优秀处理能力,Hadoop被公认为大数据行业中的标准开源软件。几乎所有主流的厂商如谷歌,雅虎,微软,淘宝等等这样的大公司都是围绕Hadoop进行提供开发工具,开源软件,商业化工具或技术服务的。

  在Hadoop2.0以后,又引入了另一个核心技术:YARN(Yet Another Resource Negotiator)。它是一个任务调度和集群资源管理系统,主要有两类长期运行的守护线程来提供自己的核心服务:一类是用于管理集群上资源使用的资源管理器(Resouce Manager),另一类是运行在集群中各个节点上且能够启动和监控容器(container)的节点管理器(Node Manager)。

  Hadoop Common:由原来的Hadoop core更名而来。以前的版本中core包含HDFS、MapReduce及其其他公共部分。后来HDFS和MapReuce被分离出来作为独立的子项目,剩下的公共部分更名为Common。主要包括系统配置工具Configuration、远程过程调用RPC、序列化机制和Hadoop抽象文件系统FileSystem等。它们为在通用硬件上搭建云计算环境提供基本的服务,并为运行在该平台上的软件开发提供了所需的API。
  Hadoop HDFS:Hadoop的核心技术之一,分布式文件系统
  Hadoop YARN:Hadoop2.0以后新增的一个核心技术,资源管理系统
  Hadoop MapReduce:Hadoop的核心技术之一,编程模型,用于大规模数据集的并行计算。
  Hadoop Ozone:HDFS的一个扩展方向,对象存储技术。

Hadoop的作用 

  1)搜索引擎:这也正是Doug Cutting设计Hadoop的初衷,为了针对大规模的网页快速建立索引;

  2)大数据存储:利用Hadoop的分布式存储能力,例如数据备份、数据仓库等;

  3)大数据处理:利用Hadoop的分布式处理能力,例如数据挖掘、数据分析等;

  4)科学研究:Hadoop是一种分布式的开源框架,对于分布式系统有很大程度地参考价值。

 

Hadoop的特点

  Hadoop因为是基于Java语言开发的,因此最理想的运行平台就是Linux系统了。它也支持多种编程语言,如C++,PHP等等。

  

  高可靠型:Hadoop按位存储和处理数据的能力值得人们信赖。
  高效性:Hadoop能够在节点之间动态地移动数据,并保证各个节点的动态平衡,因此处理速度非常快,可以处理PB级数据。
  高可扩展性:Hadoop的设计目标是可以高效的稳定的运行在廉价的计算机集群上,可以扩展到数以千计的计算机节点。
  高容错性:采用冗余数据存储方式,自动保存数据的多个复本,并且能够自动将失败的任务进行重新分配
  成本低:Hadoop采用廉价的计算机集群,成本比较低,普通用户也可以使用自己的电脑来搭建Hadoop环境

Hadoop的生态系统

  Hadoop生态系统图

  Ambari:用于供应,管理和监控Apache Hadoop集群的基于Web的工具。Ambari目前已支持大多数Hadoop组件,包括HDFS、MapReduce、Hive、Pig、 Hbase、Zookeper、Sqoop和Hcatalog等。Ambari还提供了一个用于查看集群健康状况的仪表板,例如热图以及可视化查看MapReduce,Pig和Hive应用程序的功能以及用于诊断其性能特征的功能,以方便用户使用。

  Avro:数据序列化系统。可以将数据结构或者对象转换成便于存储和传输的格式,其设计目标是用于支持数据密集型应用,适合大规模数据的存储与交换。Avro提供了丰富的数据结构类型、快速可压缩的二进制数据格式、存储持久性数据的文件集、远程调用RPC和简单动态语言集成等功能。

  Cassandra:可扩展的多主数据库,没有单点故障。是一套开源分布式NoSQL数据库系统

  Chukwa:于管理大型分布式系统的数据收集系统(2000+以上的节点, 系统每天产生的监控数据量在T级别)。它构建在Hadoop的HDFS和MapReduce基础之上,继承了Hadoop的可伸缩性和鲁棒性。Chukwa包含一个强大和灵活的工具集,提供了数据的生成、收集、排序、去重、分析和展示等一系列功能,是Hadoop使用者、集群运营人员和管理人员的必备工具。

  Hbase:是一个可扩展的分布式数据库,支持大型表格的结构化数据存储。 HBase是Apache的Hadoop项目的子项目。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。另一个不同的是HBase基于列的而不是基于行的模式。Hbase可以也可以不工作的HDFS上,但一般主要设计就是工作在HDFS中的。

  Hive:数据仓库基础架构,提供数据汇总和临时查询,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。Hive提供的是一种结构化数据的机制,定义了类似于传统关系数据库中的类SQL语言:Hive QL,通过该查询语言,数据分析人员可以很方便地运行数据分析业务。

  Mahout:Apache旗下的一个开源项目,可扩展的机器学习和数据挖掘库

  Pig:用于并行计算的高级数据流语言和执行框架。它简化了使用Hadoop进行数据分析的要求,提供了一个高层次的、面向领域的抽象语言:Pig Latin。

  Spark:Hadoop数据的快速和通用计算引擎。 Spark提供了一个简单而富有表现力的编程模型,支持广泛的应用程序,包括ETL,机器学习,流处理和图计算。

  Tez:一个基于Hadoop YARN的通用数据流编程框架,它提供了一个强大而灵活的引擎,可执行任意DAG任务来处理批处理和交互式用例的数据Hado™生态系统中的Hive™,Pig™和其他框架以及其他商业软件(例如ETL工具)正在采用Tez,以替代Hadoop™MapReduce作为底层执行引擎。

  ZooKeeper:一个面向分布式应用程序的高性能协调服务,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

  Oozie(工作流调度器):一个可扩展的工作体系,集成于Hadoop的堆栈,用于协调多个MapReduce作业的执行。它能够管理一个复杂的系统,基于外部事件来执行,外部事件包括数据的定时和数据的出现。

  Pig(ad-hoc脚本):由yahoo!开源,设计动机是提供一种基于MapReduce的ad-hoc(计算在query时发生)数据分析工具,通常用于进行离线分析。它定义了一种数据流语言—Pig Latin,它是MapReduce编程的复杂性的抽象,Pig平台包括运行环境和用于分析Hadoop数据集的脚本语言(Pig Latin)。

  Sqoop(数据ETL/同步工具):Sqoop是SQL-to-Hadoop的缩写,主要用于传统数据库和Hadoop之前传输数据。数据的导入和导出本质上是Mapreduce程序,充分利用了MR的并行化和容错性。

  Flume(日志收集工具):Cloudera开源的日志收集系统,具有分布式、高可靠、高容错、易于定制和扩展的特点。它将数据从产生、传输、处理并最终写入目标的路径的过程抽象为数据流,在具体的数据流中,数据源支持在Flume中定制数据发送方,从而支持收集各种不同协议数据。同时,Flume数据流提供对日志数据进行简单处理的能力,如过滤、格式转换等。

  Kafka(分布式消息队列):Kafka是Linkedin于2010年12月份开源的消息系统,它主要用于处理活跃的流式数据。这些数据包括网站的pv、用户访问了什么内容,搜索了什么内容等。这些数据通常以日志的形式记录下来,然后每隔一段时间进行一次统计处理。

 

Hadoop的MapReduce

  MapReduce是一种编程框架

  详细内容参考:Hadoop系列之四:MapReduce进阶    Hadoop系列之五:MapReduce进阶(2)

 

Hadoop的HDFS文件系统

  HDFS设计用来存储大文件,对于海量小文件的存储不太适用

  用户空间的文件系统

  HDFS不支持修改,较新的版本支持追加

  HDFS文件系统不支持挂载,并通过系统调用进行访问(只能使用专用访问接口,如专用的命令行工具、API)

 

了解流程

  安装配置HDFS

  安装配置MapReduce

  HBase

  Hive

  sqoon

  flume/scribe/chukwa

 

HDFS:(集群最少4个节点,1个控制端,3个数据存储的副本)

  本地模式:直接利用本地系统

  伪分布式:使用1个节点

  完全分布式:4个以上的节点

 

Hadoop的版本

  hadoop每个版本之间的区别是非常大的,其中0.20之前的版本使用的MapReduce框架是旧版本的,之后的版本及1都是新版本的。

 

Hadoop的进程说明

  JobTracker

  TaskTracker

  NameNode

  SecondaryNameNode

  DataNode

 

Hodoop配置文件

  core-site.xml:核心配置文件

    配置项:

      hadoop.tmp.dir:定义Hadoop的临时目录,默认为/tmp/hadoop-${username}

      fs.default.name:HDFS的名称节点和其默认的文件系统,其值是一个URI。(HDFS默认的名称节点路径)

  mapred-site.xml:MapReduce配置文件

      fs.trash.interval:定义HDFS的回收站功能,默认情况下禁用,定义删除文件的保留时长,单位为分钟,0位禁用回收站

    配置项:

      mapred.job.tracker:定义JobTracker监听的地址(或主机名)和端口(默认为8021)。可以接受多个以逗号分隔路径列表作为值,并会以轮流的方式将数据分散存储到这些文件系统上。

      mapred.local.dir:定义保存中间数据的临时目录,其默认值为${hadoop.tmp.dir}/mapred/local

      mapred.system.dir:定义为TaskTracker保存元数据的目录,其默认值为${hadoop.tmp.dir}/mapred/system

  hdfs-site.xml:HDFS配置文件

    配置项:

      dfs.name.dir:定义HDFS元数据持久存储路径,默认为${hadoop.tmp.dir}/dfs/name

      dfs.data.dir:定义DataNode用于存储数据块的目录路径,默认为${hadoop.tmp.dir}/dfs/data

      fs.checkpoint.dir:定义SecondaryNameNode用于存储检查点文件的目录,默认为${hadoop.tmp.dir}/dfs/namesecondary

      dfs.replication:定义HDFS在几个几点上保存同一个数据块的副本,默认为3个。(伪分布式使用1个

  配置内容保存在<configuration></configuration>中

    格式为:

      <property>

        <name></name>  #配置项

        <value></value>  #配置值

      </property>

 

  hadoop-env.sh:启动前的环境配置文件

    默认情况下,Hadoop为每个进程分配1000MB的内存空间,可以在hadoop-env.sh文件中通过HADOOP_HEAPSIZE环境变量进行调整。也可以使用HADOOP_NAMENODE_OPTS、HADOOP_SECONDARYNAMENODE_OPTS、HADOOP_DATANODE_OPTS、HADOOP_BALANCER_OPTS、HADOOP_JOBTRACKER_OPTS变量别为对应的5类进程设定运行参数。

    TaskTracker会为worker主机上的每个map或reduce任务分别启动一个JVM,这些JVM都需要在进程的HEAP中申请用到的内存空间,每个TaskTracker可同时运行的map任务总数和reduce任务总数分别由mapred.tasktracker.map.tasks.maximum和mapred.tasktracker.reduce.tasks.maximun这两个属性进行指定,它们的默认值都为2。用于运行map或reduce任务的JVM可用内存大小可由mapred.child.java.opts属性指定,其默认设置为-Xmx200m,意指每个任务可以使用最多200MB的内存空间。由此算来,每个worker主机默认使用2800MB的内存空间,除了使用mapred.child.java.opts为每个JVM的map和reduce任务设定相同可用内存属性之外,还可以使用mapreduce.map.java.opts和mapreduce.reduce.java.opts分别设定map任务和reduce任务的JVM可用内存。

Hodoop的部署

  本地模式

    准备JDK和Hadoop的安装包,上传到服务器中

#安装jdk,并配置环境变量
[root@localhost ~]# cd /home/zq/
[root@localhost zq]# tar xf jdk-8u181-linux-x64.tar.gz
[root@localhost zq]# vi /etc/profile
export JAVA_HOME=/home/zq/jdk1.8.0_181
export PATH=$PATH:$JAVA_HOME/bin
[root@localhost zq]# source /etc/profile
[root@localhost zq]# java -version
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)

[root@localhost zq]# tar xf hadoop-0.20.203.0rc1.tar.gz
[root@localhost zq]# vi /etc/profile
export HADOOP_HOME=/home/zq/hadoop-0.20.203.0
export PATH=$HADOOP_HOME/bin:$PATH

[root@localhost zq]# useradd hduser
[root@localhost zq]# passwd hduser
[root@localhost zq]# chown -R hduser.hduser hadoop-0.20.203.0/

  

  伪分布式

    需要指定NameNode节点,对MapReduce来讲,谁是JobTracker

#完成本地模式部署,进行下面的操作
[root@localhost ~]# mkdir /hadoop/tmp -p
[root@localhost ~]# chown -R hduser.hduser /hadoop/tmp/

#配置核心配置文件
[hduser@localhost ~]$ vi /home/zq/hadoop-0.20.203.0/conf/core-site.xml 
<configuration>
        <property>
                <name>hadoop.tmp.dir</name>
                <value>/hadoop/tmp</value>
        </property>
        <property>
                <name>fs.default.name</name>
                <value>hdfs://localhost:8020</value>
        </property>
</configuration>

#配置MapReduce配置文件
[hduser@localhost ~]$ vi /home/zq/hadoop-0.20.203.0/conf/mapred-site.xml
<configuration>
        <property>
                <name>mapred.job.tracker</name>
                <value>localhost:8021</value>
        </property>
</configuration>

#配置hdfs配置文件
[hduser@localhost ~]$ vi /home/zq/hadoop-0.20.203.0/conf/hdfs-site.xml
<configuration>
        <property>
                <name>dfs.replication</name>
                <value>1</value>
        </property>
</configuration>

  启动hadoop

#创建ssh秘钥认证
[hduser@localhost ~]$ ssh-keygen -t rsa -P ''
[hduser@localhost ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub hduser@localhost

#格式HDFS文件系统
[hduser@localhost bin]$ hadoop namenode -format

#启动
[hduser@localhost bin]$ start-all.sh

#确认节点
[hduser@localhost bin]$ jps
57680 JobTracker
57792 TaskTracker
57889 Jps
57368 NameNode
57595 SecondaryNameNode
57469 DataNode

  

 

HDFS文件系统的使用 

#hadoop fs
-put:将本地文件上传到hdfs中
-get:将hdfs中的文件下载到本地
-rmr:删除目录
-rm:删除文件
-cp:hdfs中从源到目标

  

Hadoop的作业

  作业:提交给MapReduce的任务

#hadoop job
-status:查看作业的状态
-list:查看作业列表

  

 

#查看jar包说明
[hduser@localhost ~]$ hadoop jar /home/zq/hadoop-0.20.203.0/hadoop-examples-0.20.203.0.jar

#查看jar包功能用法
[hduser@localhost ~]$ hadoop jar /home/zq/hadoop-0.20.203.0/hadoop-examples-0.20.203.0.jar wordcount

#运行mapreduce任务(out必须是以前没有的目录)
[hduser@localhost ~]$ hadoop jar /home/zq/hadoop-0.20.203.0/hadoop-examples-0.20.203.0.jar wordcount /test /testout

  

Hadoop进程监听的地址及端口

Hadoop启动时,会运行两个服务进程,一个用于Hadoop各进程之间进行通信的RPC服务器,另一个提供了便于管理员查看Hadoop集群各进程相关信息页面的HTTP服务

用于定义各RPC服务器所监听的地址和端口的属性如下:

  fs.default.name:定义HDFS的NameNode用于提供URI所监听的地址和端口,默认端口为8020

  dfs.detanode.ipc.address:DataNode上RPC服务器监听的地址和端口,默认为0.0.0.0:50020

  mapred.job.tracker:JobTracker的RPC服务器所监听的地址和端口,默认端口为8021

  mapred.task.tracker.report.address:TaskTracker的RPC服务器监听的地址和端口;TaskTracker的子JVM使用此端口与TaskTracker进行通信,它仅需要监听在本地回环地址127.0.0.1上,因此可以使用任何端口;只有在当本地没有回环接口时才需要修改此属性的值

除了RPC服务器之外,DataNode还会运行一个TCP/IP服务器用于数据块传输,其监听的地址和端口可以通过dfs.datanode.address属性来定义,默认为0.0.0.0:50010

可用于定义各HTTP服务器的属性有如下几个:

  mapred.job.tracker.http.address:JobTracker的HTTP服务器地址和端口,默认为0.0.0.0:50030

  mapred.task.tracker.http.address:TaskTracker的HTTP服务器地址和端口,默认为0.0.0.0:50060

  dfs.http.address:NameNode的HTTP服务器地址和端口,默认为0.0.0.0:50070

  dfs.datanode.http.address:DataNode的HTTP服务器地址和端口,默认为0.0.0.0:50075

  dfs.secondary.http.address:SecondaryNameNode的HTTP服务器地址和端口,默认为0.0.0.0:50090

 

  完全分布式

     master:

      JobTracker

      NameNode

    snn:

      SecondaryNameNode

    slave:

      TaskTracker

      DataNode

#主节点配置
#配置主节点
[root@localhost conf]# vi masters
snn.zq.com
#配置从节点
[root@localhost conf]# vi slaves
slave.zq.com

#配置核心配置文件,拷贝到所有节点中
[root@localhost conf]# vi core-site.xml
<configuration>
        <property>
                <name>hadoop.tmp.dir</name>
                <value>/hadoop/tmp</value>    #此目录所有节点都需要创建,并修改权限
        </property>
        <property>
                <name>fs.default.name</name>
                <value>hdfs://master.zq.com:8020</value>
        </property>
</configuration>

#配置mapreduce配置文件,拷贝到所有节点中
[root@localhost conf]# vi mapred-site.xml
<configuration>
        <property>
                <name>mapred.job.tracker</name>
                <value>master.zq.com:8021</value>
        </property>
</configuration>

#配置HDFS配置文件,拷贝到所有节点中
[root@localhost conf]# vi hdfs-site.xml
<configuration>
        <property>
                <name>dfs.replication</name>
                <value>1</value>
        </property>
</configuration>

#格式化HDFS文件系统
[root@localhost conf]# hadoop namenode -format

  

Hadoop日志

Hadoop的系统日志默认存放于其安装目录中的logs子目录,如需自定义,可以在hadoop-env.sh中设定HADOOP_LOG_DIR环境变量来指定新位置。Hadoop的每个进程都会生成两个日志文件,一个是由log4j生成的以.log为后缀的日志文件,另一个是以.out为后缀的日志文件,负责记录发往标准输出和错误输出的信息。

大多数应用的日志均发往.log类的文件中,因此在故障排查时其也是最需要关注的日志文件。hadoop为log4j提供的默认配置中,其每天会自动做一次日志滚动,并且永远不会删除日志文件,因此,管理员需要手动归档并删除老旧的日志文件。.out类的日志文件中很少出现信息,而且,Hadoop的每次重启都会导致日志自动滚动,并只会保存最近5次的滚动日志版本。

 

posted @ 2020-06-07 21:43  全心全意_运维  阅读(1207)  评论(0编辑  收藏  举报