了解物联网架构之Hadoop

本文深入探讨了大数据的基本概念,重点介绍了Hadoop的起源、特点和运行模式,涵盖了HDFS分布式文件系统、MapReduce计算模型以及Hadoop的部署与实战示例。通过WordCount案例演示了如何利用Hadoop进行数据处理。
摘要由CSDN通过智能技术生成

一、认识大数据

1.1 大数据定义

  • 指无法在一定时间范围内用常规软件工具进行捕捉、管理 和处理的巨量数据集合

  • 需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产数据

1.2 大数据特点

  • 数据体量巨大。数据量大是大数据的显著特点,按目前的发展趋势看,大数据的体量已经达到 PB 甚至 EB级。

  • 大数据的数据类型多样,以非结构化数据为主。如:网络日志、音频、视频、 图片、地理位置信息、交易数据、社交数据等。

  • 价值密度低。有价值的数据仅占到数据总量相当小的一部分。比如一段监控视频中真正有价值的画面可能只有几秒钟。

  • 产生和要求处理速度快。这是大数据区分于传统数据挖掘最显著的特征。

1.3 常见大数据处理系统

名称类型说明
Hadoop开源Apache 基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下, 开发分布式程序,为本门课程重点讲解的系统
Spark开源类似 Hadoop MapReduce 的并行框架
Stom开源实时的、分布式以及具备高容错的计算系统
MongoDB开源面向文档的 NoSql 数据库
IBM PureData商用基于 Hadoop, 属于 IBM 专家集成系统 PureSystem家族中的组成部分, 主要面向大数据应用
Oracle Exadata商用Oracle 的新一代数据库云服务器
SAP Hana商用提供高性能的数据查询功能, 用户可以直接对大量实时业务数据进行查询和分析
Teradata AsterData商用非结构化数据解决方案
EMC GreenPlum商用采用了大规模并行处理, 支持 50PB 级海量存储与管理
HP Vertica商用列式大数据分析数据库

二、了解Hadoop

2.1 Hadoop简介

  • Hadoop 源自于 Google 在 2003 到 2004 年公布的关于 GFS ( Google File System)、MapReduce 和 BigTable 三篇论文, 创始人是 Doug Cutting。Hadoop 现在是 Apache 基金会顶级项目,“Hadoop”是一个虚构的名字, 由 Doug Cutting 的孩子为其黄色玩具大象所命名。

  • Hadoop是Apache基金会旗下的分布式系统基础架构

  • 用户可以在不了解分布式底层细节的情况下,开发分布式程序

  • 充分利用集群的威力进行高速运算和存储

 

2.2 Hadoop特点

  • 高可靠性

  • 高扩展性

  • 高效性

  • 高容错性

  • 低成本

  • 可构建在廉价机器上

2.3 Hadoop运行模式

  • 单机模式:无须配置, Hadoop 被视为一个非分布式模式运行的独立 Java进程

  • 伪分布式模式:只有一个节点的集群,这个节点既是 Master(主节点、主服务器) 也是 Slave(从节点、从服务器),可在此单节点上以不同的 Java 进程模拟分布式中的各类节点

  • 完全分布式模式:对于 Hadoop,不同的系统会有不同的节点划分方式。在 HDFS 看来分为 NameNode( 管理者) 和 DataNode( 工作者), 其中 NameNode只有一个,DataNode 可有多个;在 MapReduce 看来节点又分为 JobTracker (作业调度者)和 TaskTracker(任务执行者),其中 JobTracker 只有一个, TaskTracker 可以有多个。NameNode 和 JobTracker 可以部署在不同的机器上, 也可以部署在同一机器上。部署 NameNode 和 JobTracker 的机器是Master,其余的机器都是 Slave

2.4 Hadoop 体系结构

  • Hadoop框架的核心构成

    • 分布式文件系统(HDFS

    • 分布式计算系统(MapReduce

    • 分布式资源管理系统(YARN

  • Hadoop 生态圈

    • HDFS:分布式文件系统,是整个 Hadoop 体系的基石。

    • MapReduce/YARN: 并行编程模型。YARN 是下一代的 MapReduce 框架。从 Hadoop 0.23.01 版 本 后 , MapReduce 被 重 构 。 通 常 YARN 也 称 为MapReduceV2,老版本 MapReduce 称为 MapReduce V1。

    • Hive: 建立在 Hadoop 上的数据仓库。提供类似 SQL 语言的查询方式查询Hadoop 中的数据。

    • Pig:一个对大型数据集进行分析、评估的平台。主要作用类似于数据库里的 存储过程。

    • HBase: 全称 Hadoop Database。Hadoop 分布式、面向列的数据库来源于Google 关于 BigTable 的论文,主要用于需要随机访问、实时读写的大数据。在后面章节还会详细介绍。

    • ZooKeeper:是一个为分布式应用所设计的协调服务。主要为用户提供同步、 配置管理、分组和命名等服务,减轻分布式应用程序所承担的协调任务。

    • Sqoop:主要用于 Hadoop 与传统数据库(MySQL 等)间的数据传递。

    • Flume:日志采集系统。

    • Spark: 前面提过, 是一个相对独立于 Hadoop 的大数据处理系统, 可单独进行分布式处理。在这里列出来是因为它可以和 HDFS 很好的结合。

    • Oozie:可以将多个 MapReduce 作业组合到一个逻辑工作单元中,进行工作计划的安排,类似于工作流管理引擎。

    • Ambari:支持 Hadoop 集群管理、监控的 Web 工具。

三、分布式文件系统 HDFS

3.1 HDFS定义

  • 是一个主/从体系结构的、以分布式进行存储的分布式文件系统

  • 主要负责群集数据的存储与读取

3.2 HDFS优缺点

  • 优点

    存储超大文件
    标准流式访问
    可构建在廉价机器上

  • 缺点

    不适合低延迟数据访问
    不适合小文件存取
    不适合并发写入,文件随机修改

3.3 HDFS体系结构

  • HDFS群集组成 一个NameNode节点 多个DateNode节点

  • HDFS集群数据读写流程

    数据读流程
    1.由客户端向NameNode请求访问某个文件,NameNode返回该文件所在DataNode,然后客户端向DataNode读取数据

  • 数据写流程:
    1.客户端向NameNode发出文件写请求,NameNode告诉客户该向哪个DataNode写入文件
    2.客户将文件写入该DataNode节点
    3.DataNode将自动复制数据到其它DataNode节点上,默认3份拷贝

 

3.4 HDFS相关基础概念

  • 元数据节点(NameNode) 负责管理文件系统的命名空间 将所有文件和文件夹的元数据保存至一个文件系统树中

  • 元数据存放目录 NameNode节点的hadoop/dfs/name/current目录中 由hdfs-site.xml中的dfs.namenode.name.dir属性指定

  • 目录中包括具体文件类型 fsimage_*、edits_*VERSION、...

  • 数据节点(DateNode) 文件系统中真正存储数据的地方 一个文件被拆分成多个数据块后,分别存储至对应的数据节点上

  • 数据存储目录 DateNode节点的hadoop/dfs/data目录中 由hdfs-site.xml中的dfs.datanode.data.dir属性指定

  • 目录中包括具体文件类型 blk_<id>、blk_<id>.meta、...

  • 从元数据节点(Secondary NameNode) 1.用于周期性备份NameNode节点上的元数据 2.可以用来恢复NameNode节点,但不能作为备用节点 3.为了防止宕机,通常是将Secondary NameNode和NameNode设置为不同的主机 4.使用hdfs-site.xml中配置的dfs.namenode.secondary.http-address属性值可以通过浏览器查看Secondary NameNode运行状态

四、分布式计算系统 MapReduce

4.1MapReduce介绍

  • Hadoop 的 MapReduce 框架源自于 Google 的 MapReduce 论文。在 Google 发表论文时,MapReduce 最大成就是重写了Google 的索引文件系统。现在,MapReduce被广泛地应用于日志分析、海量数据排序、在海量数据中查找特定模式等场景中。

  • MapReduce是一个实现了并行计算编程模型,用以进行大数据量的计算

  • MapReduce包括 map(映射):map负责把任务分解成多个任务 reduce(归约):负责把分解后多任务的处理结果进行汇总

  • MapReduce框架设计包括

    执行MapReduce 作业的机器也有两个角色:JobTrackerTaskTracker

    • JobTracker:是一个 Master 服务,用于作业( Job)的管理和调度工作。一个 Hadoop 集群中只有一台 JobTracker。一般情况下,应该把它部署在单独的机器上。JobTracker 负责创建、调度作业中的每一个子任务( MapTask 或 ReduceTask) 运行于 TaskTracker 上, 并监控它们。如果发现有失败的任务就重新运行它。

    • TaskTracker : 是 运 行 于 多 个 节 点 上 的 Slave 服 务 , 用 于 执 行 任 务 。TaskTracker 需要运行在 HDFS 的 DataNode 上。

4.2 MapReduce工作原理

  1. input:由 JobTracker 创建该 Job,并根据 Job 的输入计算输入分片(Input Split)。这里要求待处理的数据集必须可以分解成许多小的数据集, 且每一个小的数据集都可以完全并行地进行处理。输入目录中文件的数量决定了分片的数量,如果对于单个文件超过 HDFS 默认块大小(64MB),将按块大小进行分割。

  2. split:作业调度器获取 Job 的输入分片信息,对输入分片中的记录按照一定规则解析成键值对,“键”(key)是每一行的起始位置,以字节为单位,“值”(value) 是本行文本内容。最后每个分片创建一个 MapTask 并分配到某个 TaskTracker。

  3. map:TaskTracker 开始执行 MapTask,处理输入的每一个键值对。如何处理取决于在该阶段的程序代码,处理完成后产生新的键值对,保存在本地。

  4. shuffle:混洗。将 MapTask 的输出有效地作为 ReduceTask 的输入过程。从图中可以看出该过程会在各 TaskTracker Node 之间进行数据交换, 按照 key 进行分组。

  5. reduce:读取 Shufflling 阶段的输出, 开始执行 ReduceTask, 处理输入的每一个键值对。同样, 如何处理取决于该阶段的程序代码。最后输出最终结果。

 

4.3 MapReduce 作业在 MapReduce 框架中的工作原理

  1. 编写 MapReduce 程序。包括 Mapper 处理、Reducer 处理以及为执行这些处理而定义的作业,首先将所有这些程序打包后运行作业。

  2. 获取作业 ID。

  3. 复制作业资源。

  4. 提交作业资源。

  5. 初始化作业。

  6. 获取输入分片。

  7. 心跳通信。TaskTracker 运行一个简单的循环来定期发送“心跳”给JobTracker,表明 TaskTracker 是否还存活,同时也充当两者之间的消息通道。

  8. 获取作业资源。

  9. 分配任务。

  10. 运行任务 MapTask 或 ReduceTask,最后输出 MapReduce 任务处理结果。

 

五、部署Hadoop系统

基础环境

  • 修改主机名

     hostnamectl set-hostname node1
     hostnamectl set-hostname node2
     hostnamectl set-hostname node3
  • 所有节点添加hosts解析

     cat >> /etc/hosts << EOF
     172.16.10.10 node1
     172.16.10.11 node2
     172.16.10.12 node3
     EOF
  • 关闭防火墙

     systemctl stop firewalld
     systemctl disable firewalld
  • 关闭内核安全机制

     sed -i "s/.*SELINUX=.\*/SELINUX=disabled/g" /etc/selinux/config
  • 时间同步

     yum -y install chrony
     systemctl start chronyd
     chronyc sources -v

5.1 创建用户和组

  • 所有node节点都需要执行

 # 创建Hadoop组
 groupadd hadoop
 ​
 # 创建hduser用户
 useradd -g hadoop hduser
 ​
 # 为hduser用户设置密码
 passwd hduser
 更改用户 hduser 的密码 。
 新的 密码:
 无效的密码: 密码少于 8 个字符
 重新输入新的密码:
 passwd:所有的身份验证令牌已经成功更新。
 ​
 # 为hduser用户添加sudo权限
 vim /etc/sudoers
 在 root  ALL=(ALL)  ALL 下面添加如下内容:
 hduser ALL=(ALL)  NOPASSWD:ALL
 ## 保存是需要使用 :wq!

5.2 部署JDK环境

  • 所有node节点都需要执行

 # 上传安装包并安装
 rpm -ivh jdk-8u171-linux-x64.rpm
 ​
 # 配置环境变量
 echo 'export JAVA_HOME=/usr/java/jdk1.8.0_171-amd64' >> /etc/profile
 echo 'export CLASSPATH=$JAVA_HOME/lib:$CLASSPATH' >> /etc/profile
 echo 'export PATH=$JAVA_HOME/bin:$PATH' >> /etc/profile
 # 刷新环境变量
 source /etc/profile
 # 查看Java版本
  java -version

5.3 配置免密登录

  • 仅在node1节点执行

 ssh-keygen
 ssh-copy-id node1
 ssh-copy-id node2
 ssh-copy-id node3

5.4 部署Hadoop

5.4.1 安装配置Hadoop

  • 所有node节点都需要执行

 # 安装Hadoop
 tar zxf hadoop-2.6.5.tar.gz -C /home/hduser/
 # 修改目录名
 mv /home/hduser/hadoop-2.6.5/ /home/hduser/hadoop
 # 配置环境变量
 cat >> /etc/profile << 'EOF'
 export HADOOP_HOME=/home/hduser/hadoop
 export PATH=$HADOOP_HOME/bin:$PATH
 EOF
 # 刷新环境变量
 source /etc/profile

5.4.2 修改Hadoop相关配置文件

 # 编辑/home/hduser/hadoop/etc/hadoop/hadoop-env.sh 文件
 vim /home/hduser/hadoop/etc/hadoop/hadoop-env.sh 
 # 注释掉原本的export JAVA_HOME,然后再添加下面内容:
 export JAVA_HOME=/usr/java/jdk1.8.0_171-amd64
 ​
 # 编辑/home/hduser/hadoop/etc/hadoop/yarn-env.sh 文件
 vim /home/hduser/hadoop/etc/hadoop/yarn-env.sh 
 # 添加下面内容:
 export JAVA_HOME=/usr/java/jdk1.8.0_171-amd64
 ​
 # 编辑/home/hduser/hadoop/etc/hadoop/slaves 文件
 vim /home/hduser/hadoop/etc/hadoop/slaves 
 ##清空原内容,然后输入如下内容
 node2
 node3
 ​
 # 编辑/home/hduser/hadoop/etc/hadoop/core-site.xml
 ##该文件是 Hadoop 全局配置
 vim /home/hduser/hadoop/etc/hadoop/core-site.xml 
 # 末行添加:
 <configuration>
     <property>
         <name>fs.defaultFS</name>
         <value>hdfs://node1:9000</value>
     </property>
     <property>
         <name>hadoop.tmp.dir</name>
         <value>file:/home/hduser/hadoop/tmp</value>
     </property>
 </configuration>
 ​
 # 编辑/home/hduser/hadoop/etc/hadoop/hdfs-site.xml
 ##该文件是 HDFS 的配置
 vim /home/hduser/hadoop/etc/hadoop/hdfs-site.xml
 # 末行添加:
 <configuration>
     <property>
         <name>dfs.namenode.secondary.http-address</name>
         <value>node1:50090</value>
     </property>
     <property>
         <name>dfs.namenode.name.dir</name>
         <value>file:/home/hduser/hadoop/dfs/name</value>
     </property>
     <property>
         <name>dfs.datanode.data.dir</name>
         <value> file:/home/hduser/hadoop/dfs/data</value>
     </property>
     <property>
         <name>dfs.replication</name>
         <value>2</value>
     </property>
     <property>
         <name>dfs.webhdfs.enabled</name>
         <value>true</value>
     </property>
 </configuration>
 ​
 # 编辑/home/hduser/hadoop/etc/hadoop/mapred-site.xml
 ##该文件是 MapReduce的配置,可从模板文件 mapred-site.xml.template 复制
 cp  /home/hduser/hadoop/etc/hadoop/mapred-site.xml.template  /home/hduser/hadoop/etc/hadoop/mapred-site.xml
 vim /home/hduser/hadoop/etc/hadoop/mapred-site.xml
 # 末行添加:
 <configuration>
     <property>
         <name>mapreduce.framework.name</name>
         <value>yarn</value>
     </property>
     <property>
         <name>mapreduce.jobhistory.address</name>
         <value>node1:10020</value>
     </property>
     <property>
         <name>mapreduce.jobhistory.webapp.address</name>
         <value>node1:19888</value>
     </property>
 </configuration>
 ​
 # 编辑/home/hduser/hadoop/etc/hadoop/yarn-site.xml
 ##如果在 mapred-site.xml配置了使用YARN框架,那么YARN框架使用此文件中的配置
 vim /home/hduser/hadoop/etc/hadoop/yarn-site.xml 
 # 末行添加:
 <configuration>
     <property>
         <name>yarn.nodemanager.aux-services</name>
         <value>mapreduce_shuffle</value>
     </property>
     <property>
         <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
         <value>org.apache.hadoop.mapred.ShuffleHandler</value>
     </property>
     <property>
         <name>yarn.resourcemanager.address</name>
         <value>node1:8032</value>
     </property>
     <property>
         <name>yarn.resourcemanager.scheduler.address</name>
         <value>node1:8030</value>
     </property>
     <property>
         <name>yarn.resourcemanager.resource-tracker.address</name>
         <value>node1:8035</value>
     </property>
     <property>
         <name>yarn.resourcemanager.admin.address</name>
         <value>node1:8033</value>
     </property>
     <property>
         <name>yarn.resourcemanager.webapp.address</name>
         <value>node1:8088</value>
     </property>
 </configuration>
 ​
 ​
 ## 将修改完的配置文件推送分别到node2、node3节点
 scp -r /home/hduser/hadoop/* node2:/home/hduser/
 scp -r /home/hduser/hadoop/* node3:/home/hduser/

5.5 Hadoop相关管理

 # 切换到Hadoop安装目录下
 cd /home/hduser/hadoop/
 # 格式化,必须要做的!!
 bin/hdfs namenode -format
 # 启动hdfs
 sbin/start-dfs.sh
 # 启动yarn
 sbin/start-yarn.sh
 # 也可以使用start-all.sh全部启动
 sbin/start-all.sh
 # 全部停止 
 sbin/stop-all.sh 
 # 查看集群状态
 bin/hdfs dfsadmin -report
 # 查看Java进程
 jps
 # 查看50070端口
 netstat -nlpt | grep 50070

5.6 运行Hadoop 的WordCount 程序

5.6.1 在/home/hduser/file 目录下创建 file1.txt、file2.txt

 # 在/home/hduser/file 目录下创建 file1.txt、file2.txt
 mkdir /home/hduser/file
 echo "Hello World hi HADOOP" > /home/hduser/file/file1.txt
 echo "Hello hadoop hi CHINA" > /home/hduser/file/file2.tx

5.6.2 将 file1.txt、file2.txt 保存到 HDFS 中

 # 创建 HDFS 目录/input2
 bin/hadoop fs -mkdir /input2
 bin/hadoop fs -ls /
 # 将 file1.txt、file2.txt 上传到 HDFS 中
 bin/hadoop fs -put /home/hduser/file/file* /input2
 # 查看
 bin/hadoop fs -ls /input2
 bin/hadoop fs -cat /input2/*

5.6.3 执行 WordCount 程序并查看结果

 # 执行 WordCount 程序
 bin/hadoop jar /home/hduser/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.5.jar  wordcount /input2/ /output2/wordcount1
 # 查看执行结果
 bin/hadoop fs -ls /
 bin/hadoop fs -ls /output2
 bin/hadoop fs -cat /output2/wordcount1/*
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值