Hadoop入门(慕课网:认识Hadoop–基础篇笔记)-不古出品

1.初识Hadoop

大数据时代已经到来,越来越多的行业面临着大量数据需要存储以及分析的挑战。Hadoop,作为一个开源的分布式并行处理平台,以其高扩展、高效率、高可靠等优点,得到越来越广泛的应用。本课旨在培养学员理解Hadoop的架构设计以及掌握Hadoop的运用能力。

1.1前言

1.1.1课程名称

Hadoop大数据平台架构与实践

1.1.2主要内容

  • 1.大数据的相关概念
  • 2.Hadoop的架构和运行机制
  • 3.实战:Hadoop的安装和配置
  • 4.实战:Hadoop开发

1.1.3学习目标

  • 掌握大数据存储与处理技术的原理(理论知识)
  • 掌握Hadoop的使用和开发能力(实践能力)

1.1.4 课程学习建议

  • 1.结合书本,知识点更加系统全面
    对应的书本:hadoop技术详解、hadoop权威指南
  • 2.实践经验很重要,边听课边实践。

1.1.5课程预备知识:

  • linux常用命令
  • java编程基础

1.2Hadoop的前世今生

1.2.1Hadoop基本概念

Hadoop是解决大数据的分布式集成架构。
当数据达到一定规模时,单机的存储和分析就变得非常困难,存储量和效率都无法达到用户的需求。
所以,为了解决大数据的存储和处理,Google提出了三大技术:

  • MapReduce

    • 概念:"Map(映射)“和"Reduce(归约)”,它们的主要思想,都是从函数式编程语言里借来的,还有从矢量编程语言里借来的特性。它极大地方便了编程人员在不会分布式并行编程的情况下,将自己的程序运行在分布式系统上。 当前的软件实现是指定一个Map(映射)函数,用来把一组键值对映射成一组新的键值对,指定并发的Reduce(归约)函数,用来保证所有映射的键值对中的每一个共享相同的键组。
  • BigTable

    • 是Google设计的分布式数据存储系统,用来处理海量的数据的一种非关系型的数据库
  • GFS

    • 是一个可扩展的分布式文件系统,用于大型的、分布式的、对大量数据进行访问的应用。它运行于廉价的普通硬件上,并提供容错功能。它可以给大量的用户提供总体性能较高的服务。

Hadoop是模仿Google三大技术的开源实现。相比于Google之前的解决方案,它有如下优势:

  • (1)降低成本,能用PC机就不用大型机和高端存储;
  • (2)因为用的是PC机,所以经常发生硬件错误,所以通过软件来保证高可靠性;
  • (3)简化了并行分布式计算。

1.2.2为什么取名Hadoop

创作者以他儿子一个黄色的玩具小象命名
Hadoop

1.3Hadoop的功能与优势

1.3.1 Hadoop是什么

是一个开源的、分布式存储和分布式计算平台

1.3.2Hadoop的两个核心组件

  • 1.HDFS,分布式文件系统,存储海量数据。
  • 2.MapReduce,并行处理框架,实现任务分解和调度。

1.3.3Hadoopk可以做什么

搭建大型数据仓库,PB级数据的存储、处理、分析、统计等业务。
在这里插入图片描述

1.3.3Hadoopk的优势

  • 1.高扩展,理论上无限扩展
  • 2.低成本
  • 3.成熟的生态圈
    Hadop生态圈

1.3.4Hadoopk的应用

1.4Hadoop的生态系统与版本

应用在这里插入图片描述

1.4.1hadoop生态系统

  • 1.hdfs分布式存储系统
  • 2.mapreduce 大数据编程模型
  • 3.相关开源工具:
    • (1)hive:将sql语句转化为hadoop任务,降低使用hadoop的门槛
    • (2)HBASE:存储结构化数据的分布式数据库,放弃事务特性,追求更高的扩展,它提供数据的随机读写和实时访问,实现对表数据的读写功能
    注:和传统的关系型数据库的区别是放弃事务特性,追求更高的扩展、和HDFS的区别就是habse提供数据的随机读写和实时访问,实现对表数据的读写功能
    
    • (3)zookeeper:监控Hadoop集群里的每个节点的状态,管理整个集群的配置,维护数据节点之间的一致性

1.4.2hadoop版本

  • 1.x:稳定
  • 2.x:不稳定

2.Hadoop的安装

  • Step1:准备liunx环境;
  • Step1:安装JDK;
  • Step1:配置hadoop;

2.1准备liunx环境

两种方式:

  • 1.本机先安装虚拟机,再安装linux
  • 2.租用云主机,申请公网IP

2.2安装JDK

Linux 下下载安装JDK (centos)


//1、下载  : 
yum install java-1.7.0-openjdk
//查看可升级下载的软件包
yum search java|grep jdk

//2、配置环境变量: 
vim /etc/profile
export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH  

//3、让配置生效
source /etc/profile

//4、测试 
java -version

注解:
1.Linux下用冒号 : 分割路径
2.$PATH / $JAVA_HOME / $JRE_HOME 是用来引用原来环境变量的值,在设置环境变量时不能把原来的值给覆盖掉
3.$CLASSPATH 中 当前目录 “.”不能丢
4.export 是把这4个变量导出为全局变量

2.3配置Hadoop

2.3.1安装总结

  • 1.下载hdoop按照包并进行解压
  • 2.配置hdoop-env.sh文件,目的是配置jdk,并在profile配置haddoop的安装位置
  • 3.配置core-site.xml文件:hdoop的核心文件,里面有关于hdoop的节点端口与主机端口
  • 4.配置hdfs-site.xml文件:hdoop的文件存储的基本信息与目录
  • 5.配置mapred-site.xml文件:hadoop的计算节点的端口号
  • 6.启动hadoop:start-all.sh
  • 7.查看端口:jps,可以看到五大守护进程说明正确
  • 8.停止hdoop:stop-all.sh

2.3.2安装细节

  • 1、下载Hadoop安装包 ,两种方式
    • 方式一:官网下载好后,通过Xftp上传到Linux上,下载地址http://mirror.bit.edu.cn/apache/hadoop/common/hadoop-1.2.1/hadoop-1.2.1.tar.gz
    • 方式一:通过 wget命令直接下载到Linux服务器上
      $ wget http://mirror.bit.edu.cn/apache/hadoop/common/hadoop-1.2.1/hadoop-1.2.1.tar.gz
  • 2、解压到指定目录下;
    • 移动文件:
      $ mv 文件 /opt
    • 解压:
      $ tar -zxvf hadoop-1.2.1.tar.gz
  • 3、配置hadoop-env.sh、core-site.xml、hdfs-site.xml、mapred-site.xml四个文件
//1、hadoop-env.sh
配置java 环境变量的地址
export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64

//2、 core-site.xml
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>/hadoop</value>
</property>
</configuration>
<property>
<name>dfs.name.dir</name>
<value>/hadoop/name</value>
</property>
<property>
<name>fs.default.name</name>
<value>hdfs://imooc:9000</value>
</property>

//3、hdfs-site.xml配置
<property>
<name>dfs.data.dir</name>
<value>/hadoop/data</value>
</property>

//4、mapred-site.xml配置
<property>
<name>mapred.job.tracker</name>
<value>imooc:9001</value>
</property>

  • 4、编辑/etc/profile文件,配置hadoop相关的环境变量
vim /etc/profile
添加hadoop的HADOOP_PATH
export HADOOP_PATH="安装目录"
PATH里面添加$HADOOP_HOME/bin:$PATH
//让配置生效
source /etc/profile
//测试是否安装成功
hadoop
  • 5、第一次使用hadoop先进行格式化
//对namenode 进行格式化
$ hadoop namenode -format;
  • 6、启动hadoop
    start-all.sh
  • 7、检查进程:jpsjps
// 查看hadoop文件系统下下有哪些文件
hadoop fs -ls

3.Hadoop的核心-HDFS简介

3.1HDFS基本概念

  • HDFS设计架构:
    • 块:文件以“块”进行存储,HDFS默认块大小为64M
    • namenode:是管理节点,存放文件元数据,包括文件与数据块的映射表、数据块与数据节点的映射表
    • datenode:工作节点,真正存储数据块
      最终体系结构:由block、namenode、datanode、secondarynamenode、client组成

HDFS的文件被分成块进行存储,HDFS块默认大小是64MB,块是整个文件存储处理的逻辑单元。

HDFS最终体系结构:由block、namenode、datanode、secondarynamenode、client组成。
HDFS架构图

3.2HDFS数据管理与容错

为保证硬件上的容错,数据块有多份冗余。

  • 数据块副本:每个数据块3个副本,分布在2机架3节点上(容错性)
  • 心跳检测:DataNode定期向NameNode发心跳消息。
  • 二级NameNode:NameNdoe定期同步元数据映像文件到二级NameNode(secondryNameNode),一旦故障,备胎转正。

3.2HDFS读写文件的流程

  • HDFS读取文件的流程:
    • (1)客户端向namenode发起独立请求,把文件名,路径告诉namenode;
    • (2)namenode查询元数据,并把数据库返回客户端;
    • (3)此时客户端就明白文件包含哪些块,这些块在哪些datanode中可以找到;
      HDFS读取文件的流程
  • HDFS写文件流程:
    • (1)客户端把文件拆分成固定大小64M的块,并通知namenode;
    • (2)namenode找到可用的datanode返回给客户端;
    • (3)客户端根据返回的datanode,对块进行写入;
    • (4)通过流水线管道流水线复制;
    • (5)更新元数据。告诉namenode已经完成了创建心的数据块,保证了namenode中的元数据都是最新的状态。
      HDFS写文件流程

3.2HDFS的特点

  • HDFS特点:
    • 1、数据冗余,硬件容错(一式三份来保证)。
    • 2、流式数据访问:写一次,读多次,一旦写入无法修改,只能通过写入到新的块删除旧文件。
    • 3、存储大文件(特适合,因为小文件多,势必加重NameNode的负担)。
  • HDFS适用性及局限性:
    • 1、适合数据批量读写,吞吐量高;
    • 2、不适合交互式应用、低延迟很难满足;
    • 3、适合一次写入多次读取、顺序读写;
    • 4、不支持多用户并发写相同文件。
  • HDFS优缺点:
    • 优点:存储块大,吞吐量高,为存储大文件设计;
    • 缺点:延迟高,不适合交互式访问,不支持多用户同时操作一个块。

3.3HDFS的使用

  • 提供了 shell 接口,可以进行命令行操作
hadoop namenode -format	#格式化namenode
hadoop fs -ls / #打印 / 目录文件列表
hadoop fs -mkdir input #创建目录 input
hadoop fs -put hadoop-env.sh input/ #上传文件 hadoop-env.sh 到 input 目录下
hadoop fs -get input/abc.sh hadoop-envcomp.sh #从 input 目录中下载文件
hadoop fs -cat input/hadoop-env.sh #查看文件 input/hadoop-env.sh 
hadoop dfsadmin -report #dfs报告

4.Hadoop的核心-MapReduce原理与实现

4.1MapReduce的原理

  • MapReduce原理:分而治之,一个大任务分成多个子任务(map),并行执行之后,合并结果(reduce)。
eg:做统计的时候,把统计的文件拆分,然后分别统计每一个数据出现的次数,然后合并拆分项,就可以统计每一个数据出现的总次数。
  • MapReduce处理数据过程主要分成2个阶段:Map阶段和Reduce阶段。首先执行Map阶段,再执行Reduce阶段。Map和Reduce的处理逻辑由用户自定义实现,但要符合MapReduce框架的约定。

  • 正式执行Map前,需要将输入数据进行”分片”。所谓分片,就是将输入数据切分为大小相等的数据块,每一块作为单个Map Worker的输入被处理,以便于多个Map Worker同时工作。分片完毕后,多个Map Worker就可以同时工作了。每个Map Worker在读入各自的数据后,进行计算处理,最终输出给Reduce。Map Worker在输出数据时,需要为每一条输出数据指定一个Key。这个Key值决定了这条数据将会被发送给哪一个Reduce Worker。Key值和Reduce Worker是多对一的关系,具有相同Key的数据会被发送给同一个Reduce Worker,单个Reduce Worker有可能会接收到多个Key值的数据。

  • 在进入Reduce阶段之前,MapReduce框架会对数据按照Key值排序,使得具有相同Key的数据彼此相邻。如果用户指定了”合并操作”(Combiner),框架会调用Combiner,将具有相同Key的数据进行聚合。Combiner的逻辑可以由用户自定义实现。这部分的处理通常也叫做”洗牌”(Shuffle)。
    接下来进入Reduce阶段。相同的Key的数据会到达同一个Reduce Worker。同一个Reduce Worker会接收来自多个Map Worker的数据。每个Reduce Worker会对Key相同的多个数据进行Reduce操作。最后,一个Key的多条数据经过Reduce的作用后,将变成了一个值。

MapReduce原理

4.2MapReduce的运行流程

流程

4.2.1. 原理

  • 分而治之 的思想,一个大任务分成多个小任务(map),并行执行后,合并结果(reduce).

4.2.2 运行流程

执行过程

  • 基本概念:
    • Job & Task:
      一个 Job(任务、作业) 被切分为多个 Task,Task 又分为 MapTask 和 ReduceTask
    • JobTracker
      作业调度
      分配任务、监控任务
      监控 TaskTracker 的状态
    • TaskTracker
      执行任务
      向 JobTracker 汇报任务状态

4.2.3 容错机制

  • 重复执行:
    默认重复执行 4 次,若还是失败,则放弃执行
  • 推测执行:
    可以保证任务不会因为某1-2个机器错误或故障而导致整体效率下降

5.开发Hadoop应用程序

5.1WordCount单词计数(上)

  • 计算文件中出现每个单词的频数,输入结果按照字母顺序进行排序。利用mapReduce的思想,来计算输入的单词的个数。
  • Map过程:分而治之
  • Reduce过程:合并
    Map过程Reduce过程

5.2WordCount单词计数(中)

  • 分析源代码
  • 代码其实在hadoop的安装目录下有example,一般的目录是/hadoop/src/examples/org/apache/hadoop/examples/WordCount.jar
  • 源代码 http://hadoop.apache.org/docs/r1.0.4/cn/mapred_tutorial.html

5.3WordCount单词计数(下)

5.3.1整体流程

  • 1.编写WordCount.java,包含Mapper类和Reducec类;
  • 2.编译WordCount.java,java -classpath ;
  • 3.打包 jar -cvf WordCount.jar classes/*;
  • 4.作业提交 hadoop jar WordCount.jar WordCount input output;
  • 提交到hadoop中运行,指定输入文件 ,指定输出文件。

5.3.2具体流程


//(1)启动hadoop
 start -all.sh
 
//(2)rz把某某.java类放到根目录下/opt/根目录下边或者根目录下任意文件
cd /mkdir project_hadoop/
rz 类路径添加

//(3)cd 新创建的文件,创建file1和file2
mkdir input
vi file1
vi file2
ls project_hadoop

//(4)创建文件
 hadoop fs -mkdir input_wordcount

//(5)创建目录:
hadoop fs -mkdir input
//查看文件:
 hadoop fs -ls     
 hadoop fs -ls input_wordcount 
 
//(6)把file1和file2文件放到input_wordcount
提交输入文件给hadoop
hadoop fs -put 文件路径 提交后的路径
//例:
hadoop fs -put input/input_wordcount/

//(7)查看文件
hadoop fs -ls input_wordcount
fs -cat input_wordcount/file1
fs -cat input_wordcount/file2

//(8)编译java文件
javac -classpath /opt/hadoop-1.2.1/hadoop-core-1.2.1.jar:/opt/hadoop-1.2.1/lib/commons-cli-1.2.jar -d 编译后地址 编译文件

//(9)打包指令
jar -cvf 打包后文件名.jar 某某.class
jar -cvf wordcount.jar *.class

//(10)提交jar给hadoop执行
hadoop jar jar包路径 执行的主函数名(主类名,main方法所在类名) 输入目录名 输出目录名
//例:
hadoop jar project_hadoop/wordcount.jar WordCount input_wordcount output_wordcount

//(11)查看通过算法计算出单词个数的结果
fs -cat output_wordcount/part-r-00000

5.4利用MapReduce进行排序(上)

  • 先分片,再排序
    分片排序

5.5利用MapReduce进行排序(下)

  • 分析代码
    在这里插入图片描述
    注:配合慕课网视频使用更佳
    链接: 点击跳转.
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇

)">
下一篇>>