hadoop概述

快速步入hadoop世界

文章目录

      • 快速步入hadoop世界
        • 回顾:
        • 今天任务
        • 教学目标
        • 第一节:HADOOP背景介绍
          • 1.1 什么是HADOOP
          • 1.2 HADOOP产生背景
          • 1.3 HADOOP在大数据、云计算中的位置和关系
          • 1.4 国内外HADOOP应用案例介绍
          • 1.5 国内HADOOP的就业情况分析
          • 1.6 HADOOP生态圈以及各组成部分的简介
        • 第二节:分布式系统概述
          • 2.1 分布式软件系统
          • 2.2 常用分布式软件系统举例
        • 第三节:离线数据分析流程介绍
          • 3.1 需求分析
          • 3.2 数据处理流程
          • 3.3 项目最终效果
        • 第四节:伪分布式环境搭建
          • 4.1 HADOOP集群规划
          • 4.2 HADOOP集群安装步骤
        • 第五节:集群环境搭建
          • 4.1 HADOOP集群规划
          • 4.2 HADOOP集群安装步骤
          • 4.3 小案例演示
        • 第六节:集群使用效果演示
          • 5.1 HDFS的基本使用
          • 5.2 MAPREDUCE基本使用

回顾:

今天任务

1.了解HADOOP产生背景及HADOOP生态圈
2.体会HADOOP和大数据、云计算等概念之间的关系
3.了解HADOOP的相关应用案例
4.了解分布式系统的概念

教学目标

首次接触大数据框架,总体是让学生建立起大数据和分布式的感性认识和宏观概念
1、理解hadoop是什么,它的应用场景什么,大体上怎么用
2、通过一个案例的演示说明,理解数据挖掘系统的基本流程和结构

第一节:HADOOP背景介绍

1.1 什么是HADOOP

Apache Hadoop 为可靠的,可扩展的分布式计算开发开源软件。
Apache Hadoop软件库是一个框架,它允许使用简单的编程模型跨计算机群集分布式处理大型数据集(海量的数据)。
包括这些模块:

  • Hadoop Common:支持其他Hadoop模块的常用工具。
  • Hadoop分布式文件系统(HDFS™):一种分布式文件系统,可提供对应用程序数据的高吞吐量访问。
  • Hadoop YARN:作业调度和集群资源管理的框架。
  • Hadoop MapReduce:一种用于并行处理大型数据集的基于YARN的系统。

上述每个模块有自己独立的功能,而模块之间又有相互的关联。

广义上来说,HADOOP通常是指一个更广泛的概念——HADOOP生态圈

1.2 HADOOP产生背景
雏形开始于2002年的Apache的Nutch,Nutch是一个开源Java 实现的搜索引擎。它提供了我们运行自己的搜索引擎所需的全部工具。包括**全文搜索**和**Web爬虫**。Nutch的设计目标是构建一个大型的全网搜索引擎,包括网页抓取、索引、查询等功能,但随着抓取网页数量的增加,遇到了严重的可扩展性问题--------“**如何解决数十亿网页的存储和索引问题**”。
  • 2003年和2004Google先后发表了两篇技术学术论文为解决该问题提供了可行的解决方案。
    1. 谷歌文件系统(GFS):GFS也就是google File System,google公司为了存储海量搜索数据而设计的专用文件系统,解决了海量网页存储的问题。
    2. MapReduce:是一种编程模型,用于大规模数据集(大于1TB)的并行分析运算,解决了海量网页的索引计算的问题。
  • 2004年Nutch创始人Doug Cutting基于Google的GFS论文实现了分布式文件存储系统名为NDFS。
  • 2005年Doug Cutting又基于MapReduce,在Nutch搜索引擎实现了该功能。

1.3 HADOOP在大数据、云计算中的位置和关系

​ 云计算是分布式计算、并行计算、网格计算、多核计算、网络存储、虚拟化、负载均衡等传统计算机技术和互联网技术融合发展的产物。借助IaaS(基础设施即服务)、PaaS(平台即服务)、SaaS(软件即服务)等业务模式,把强大的计算能力提供给终端用户。

​ 现阶段,云计算的两大底层支撑技术为“虚拟化”和“大数据技术”

​ 而HADOOP则是云计算的PaaS层的解决方案之一,并不等同于PaaS,更不等同于云计算本身。

1.4 国内外HADOOP应用案例介绍
  • 大型网站Web服务器的日志分析:一个大型网站的Web服务器集群,每5分钟收录的点击日志高达800GB左右,峰值点击每秒达到900万次。每隔5分钟将数据装载到内存中,高速计算网站的热点URL,并将这些信息反馈给前端缓存服务器,以提高缓存命中率。

  • 运营商流量经营分析:每天的流量数据在2TB5TB左右,拷贝到HDFS上,通过交互式分析引擎框架,能运行几百个复杂的数据清洗和报表业务,总时间比类似硬件配置的小型机集群和DB2快23倍。

  • 城市交通卡口视频监控信息的实时分析:采用基于流式 Stream进行全省范围的交通卡口通过视频监控收录的信息进行实时分析、告警和统计(计算实时路况),对全省范围内未年检车辆或套牌车的分析延时在300毫秒左右,可以做出实时告警,所以开车的朋友最好要按时年检。

1.5 国内HADOOP的就业情况分析

大数据方面的就业主要有三大方向:

  • 数据分析类大数据人才 对应岗位 大数据系统研发工程师
  • 系统研发类大数据人才 对应岗位 大数据应用开发工程师
  • 应用开发类大数据人才 对应岗位 大数据分析师
1.6 HADOOP生态圈以及各组成部分的简介

重点组件:

  • HDFS:分布式文件系统
  • MAPREDUCE:分布式运算程序开发框架
  • HIVE:基于大数据技术(文件系统+运算框架)的SQL数据仓库工具
  • HBASE:基于HADOOP的分布式海量数据库
  • ZOOKEEPER:分布式协调服务基础组件
  • Mahout:基于mapreduce/spark/flink等分布式运算框架的机器学习算法库
  • Oozie:工作流调度框架
  • Sqoop:数据导入导出工具
  • Flume:日志数据采集框架

第二节:分布式系统概述

2.1 分布式软件系统

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

2.2 常用分布式软件系统举例

Web服务器集群
单台服务器的性能和资源都是有限的,支持的连接并发数都有上限,因此必须采用多服务器集群的方法才能提高连接并发数。连接并发数的容量计算也很容易:

连接并发数= 服务器1并发数+服务器2并发数+……+ 服务器n并发数

当然,我们不能都给每台web服务器分配一个域名地址访问,肯定是同一个域名同一个入口,例如百度后面有成百上千台web服务器,但是我们都是使用 www.baidu.com 一个入口,至于这个入口会自动给我们分配一台web服务器访问,我们不会在意这台web服务器的具体地址是多少,这就是负载均衡器的作用。

第三节:离线数据分析流程介绍

一个应用广泛的数据分析系统:“web日志数据挖掘”

3.1 需求分析
  • 案例名称

    网站点击流日志数据挖掘系统

  • 需求描述

    “Web点击流日志”包含着网站运营很重要的信息,通过日志分析,我们可以知道网站的访问量,哪个网页访问人数最多,哪个网页最有价值,广告转化率、访客的来源信息,访客的终端信息等。

  • 数据来源

    本案例的数据主要由用户的点击行为记录

    获取方式:在页面预埋一段js程序,为页面上想要监听的标签绑定事件,只要用户点击或移动到标签,即可触发ajax请求到后台servlet程序,用log4j记录下事件信息,从而在web服务器(nginx、tomcat等)上形成不断增长的日志文件。

    数据效果:
    58.215.204.118 - - [18/Sep/2013:06:51:35 +0000] “GET /wp-includes/js/jquery/jquery.js?ver=1.10.2 HTTP/1.1” 304 0 “http://blog.fens.me/nodejs-socketio-chat/” “Mozilla/5.0 (Windows NT 5.1; rv:23.0) Gecko/20100101 Firefox/23.0”
3.2 数据处理流程
  • 流程图解析

    本案例跟典型的BI系统极其类似,整体流程如下:

    1. 数据采集:定制开发采集程序,或使用开源框架FLUME

    2. 数据预处理:定制开发mapreduce程序运行于hadoop集群

    3. 数据仓库技术:基于hadoop之上的Hive

    4. 数据导出:基于hadoop的sqoop数据导入导出工具

    5. 数据可视化:定制开发web程序或使用kettle等产品

    6. 整个过程的流程调度:hadoop生态圈中的oozie工具或其他类似开源产品

  • 项目架构

  • 项目相关截图

    • Mapreduce程序运行效果

    • hive运行效果

    • 将最终数据导入到mysql中

      | 语句                                                         |
      | ------------------------------------------------------------ |
      | ./sqoop export --connect jdbc:mysql://localhost:3306/weblogdb --username root --password root  --table t_display_xx  --export-dir /user/hive/warehouse/uv/dt=2016-08-03 |
      
3.3 项目最终效果

经过完整的数据处理流程后,会周期性输出各类统计指标的报表,在生产实践中,最终需要将这些报表数据以可视化的形式展现出来,本案例采用web程序来实现数据可视化

效果如下所示:

第四节:伪分布式环境搭建

在一台机器上实现伪分布式hadoop环境的搭建。

4.1 HADOOP集群规划
主机名(hostname) 安装软件 运行进程
pdm hadoop-2.7.1 nameNode、resourceManager、datanode、nodemanager、secondary namenode
4.2 HADOOP集群安装步骤

下面步骤以root用户登陆系统,来进行设置。

1.设置静态ip

Vi /etc/sysconfig/network-scripts/ifcfg-eth0  

#设置内容如下
		DEVICE=eth0
		HWADDR=00:0C:29:82:D8:3B
		TYPE=Ethernet
		UUID=c0d48cdb-2e8f-45ab-8c2a-50526629fefc
		ONBOOT=yes
		NM_CONTROLLED=yes
		BOOTPROTO=static            #开启静态ip设置
		DNS1=192.168.18.2           #域名服务器  根据你自己网络情况配置
		IPADDR=192.168.18.100        #ip地址   据你自己网络情况配置
		NETMASK=255.255.255.0       #子网掩码  据你自己网络情况配置
		GATEWAY=192.168.18.2        #网关   据你自己网络情况配置


2.修改主机名

vim /etc/sysconfig/network
#内容如下
NETWORKING=yes
HOSTNAME=pdm    #自定义的主机名 

#重启机器
reboot

3.修改主机名和IP的映射关系

vim /etc/hosts
#内容如下
	192.168.1.100 pdm 

4.创建一个名为hadoop的用户

useradd hadoop #添加hadoop用户

passwd hadoop #给hadoop用户 设置密码 密码是开机密码

5.为hadoop用户配置sudo权限

非root用户要执行系统管理员(root)的权限命令时,使用sudo放到“要执行的系统命令”之前。但是使用sudo之前,要进行一些配置:

#为/etc/sudoers文件增加一个写权限
chmod u+w /etc/sudoers  
#编辑 /etc/sudoers文件
vi /etc/sudoers

#在文件中的如下位置,为普通用户(如hadoop)添加一行即可
	root ALL=(ALL) ALL 
	hadoop ALL=(ALL) ALL

6关闭防火墙

#查看防火墙状态    centos7版本的linux系统中防火墙软件名  firewall 不是iptables了
service iptables status

#关闭防火墙
service iptables stop

#查看防火墙开机启动状态
chkconfig iptables --list

#关闭防火墙开机启动
chkconfig iptables off
#重启计算机
reboot

7如果机器中没有ssh软件,需要安装此软件

yum list | grep openssh-clients #使用yum来查找出ssh软件包的全名称

#会输出“ openssh-clients.x86_64 5.3p1-122.el6 base”信息

yum install openssh-clients.x86_64 #安装

从下面步骤开始使用名hadoop的用户来进行配置

su hadoop  #切换用户

8在secureCRT(windows中连接linux服务器的客户端软件)中将windows中文件上传到linux服务器?

(1)使用secureCRT连接服务器,使用hadoop用户登陆系统

(2) 在上述界面中可以调出sftp工具:

​ alt+p 调出后,进入如下命令输入行

(3)可以使用鼠标拖动一个windows下的文件hadoop-2.7.1和jdk-7u55-linux-i586.tar.gz包到 SFTP窗口,然后自动上传windows中的文件到linux的当前用户的家目录下(/home/hadoop/)

9安装vim

yum install vim-enhanced.i686

10安装JDK

#(1)解压jdk

#创建文件夹
mkdir /home/hadoop/develop_env

#解压
tar  -zxvf  jdk-7u55-linux-i586.tar.gz  -C  /home/hadoop/develop_env

#(2)将java添加到环境变量中

vim /etc/profile

#在文件最后添加
export JAVA_HOME=/home/hadoop/develop_env/jdk1.7.0_65
export PATH=$PATH:$JAVA_HOME/bin

#刷新配置
source /etc/profile

11.安装hadoop-2.7.1

​ 先上传hadoop的安装包到服务器上去/home/hadoop/

(1)安装:

tar  -zvxf  hadoop-2.7.1.tar.gz -C  /home/hadoop/develop_env/

(2)配置hadoop

伪分布式需要修改5个配置文件:

第一个:$HADOOP_HOME/etc/hadoop/hadoop-env.sh

vim hadoop-env.sh

#在差不多第27行设置jdk的java_home
	export JAVA_HOME=/home/hadoop/app//jdk1.7.0_65

第二个:修改$HADOOP_HOME/etc/hadoop/core-site.xml文件,添加如下内容

#1.编辑 core-site.xml文件
vi $HADOOP_HOME/etc/hadoop/core-site.xml
#内容如下:
    <!-- 指定HADOOP所使用的文件系统schema(URI),HDFS的老大(NameNode)的地址 -->
    <property>
        <name>fs.defaultFS</name>
        <!-- 指定了客户端访问的主机名“pdm”,则该主机的hadoop就是namenode节点了-->
        <value>hdfs://pdm:9000</value>
    </property>

    <!-- 指定hadoop运行时产生文件的存储目录 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/home/hadoop/app/hadoop-2.7.1/data</value>
    </property>

就改pdm为min1 和路径
#2.在$HADOOP_HOME/下创建一个data文件夹
mkdir  data

第三个:设置$HADOOP_HOME/etc/hadoop/hdfs-site.xml 文件,添加如下内容

vi $HADOOP_HOME/etc/hadoop/hdfs-site.xml 

#添加如下内容
<!-- 指定HDFS副本的数量 -->
<property>
	<name>dfs.replication</name>
	<value>1</value>
</property>

第四个:设置$HADOOP_HOME/etc/hadoop/mapredd-site.xml 文件,添加如下内容

#1. 修改文件名
mv $HADOOP_HOME/etc/hadoop/mapred-site.xml.template   $HADOOP_HOME/etc/hadoop/mapred-site.xml
#2. 编辑mapred-site.xml文件
vim  $HADOOP_HOME/etc/hadoop/mapred-site.xml

#添加如下内容
<!-- 指定mr运行在yarn上 -->
<property>
	<name>mapreduce.framework.name</name>
	<value>yarn</value>
</property>

第五个:设置$HADOOP_HOME/etc/hadoop/yarn-site.xml文件,添加如下内容

#编辑/yarn-site.xml
vi $HADOOP_HOME/etc/hadoop/yarn-site.xml

#添加如下内容
<!-- 指定YARN的老大(ResourceManager)的地址 -->
<property>
	<name>yarn.resourcemanager.hostname</name>
	<value>pdm</value>
</property>

<!-- reducer获取数据的方式 -->
<property>
	<name>yarn.nodemanager.aux-services</name>
	<value>mapreduce_shuffle</value>
</property>

(3)将hadoop-2.7.1添加到path变量

vim /etc/proflie

export JAVA_HOME=/home/hadoop/app/jdk1.7.0_65
export HADOOP_HOME=/home/hadoop/app/hadoop-2.7.1
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

source /etc/profile

以上配置步骤执行完毕

(4)格式化namenode

hadoop namenode  -format

#此命令的作用:(是对namenode所在机器的home/hadoop/app/hadoop-2.7.1/data目录下创建相关文件)

#而datanaode所在机器的home/hadoop/app/hadoop-2.7.1/data目录下的相关文件的创建是在datanode启动的时候才创建的。

(5)启动hadoop

(5.1)先启动HDFS (默认hadoop_home目录下没有 log目录,第一次执行此命令时才第一次创建)

start-dfs.sh

通过shell脚本(start-dfs.sh)启动的HDFS服务由三个“守护进程”组成,通过jps和ps -x命令能看到这些进程 。如

从上图可以看是 这三个进程号分别是:2041(NameNode)、2292(secondaryNameNode)、2152(Datanode)

(5.2)再启动YARN

start-yarn.sh

(6)验证是否启动成功

#使用jps命令验证
jps
#显示如下进程信息
	27408 NameNode
	28218 Jps
	27643 SecondaryNameNode
	28066 NodeManager
    27803 ResourceManager
    27512 DataNode

http://192.168.18.100:50070 (HDFS管理界面) 通过浏览器可以访问

http://192.168.18.100:8088 (YARN管理界面)通过浏览器可以访问

12.配置ssh免登陆

#(配置自己到自己的免密登陆,因为集群中namenode那台机器要实现到另一台datanode机器的免密登陆

#而本机配置hadoop环境是伪分布式环境,namenode和datanode在同一机器中,因此要配 “自己到自己的免密登陆”)

#生成ssh免登陆密钥

#进入到我的home目录

#(1)在/home/hadoop目录下执行下面命令,生成密钥对

	ssh-keygen -t rsa (四个回车)

#执行完这个命令后,会生成两个文件id_rsa(私钥)、id_rsa.pub(公钥)
#执行完此命令后,在/home/hadoop/.ssh目录生成id_rsa和id_rsa.pub
#前者是私钥,后者是公钥

#(2) 将公钥拷贝到要免登陆的机器上
#在/home/hadoop/.ssh目录执行如下命令
	ssh-copy-id localhost

//===上面是部署了一个伪分布式hadoop集群,就一台机器=

第五节:集群环境搭建

4.1 HADOOP集群规划
主机名(hostname) 安装软件 运行进程
min1 hadoop-2.7.1 nameNode、resourceManager
min2 hadoop-2.7.1 dataNode、nodeManager
min3 hadoop-2.7.1 dataNode、nodeManager
4.2 HADOOP集群安装步骤
  1. 准备三台Centos6.7 64bit虚拟机,虚拟机名分别为:

    • Centos6.7_min1

    • Centos6.7_min2

    • Centos6.7_min3

      注意 三台机器使用root用户登陆系统

  2. 分别修改虚拟机的主机名(hostname)

    • 在Centos6.7_min1机器中执行修改hostname命令

      vi   etc/sysconfig/network		#编辑network文件
      

    • 在Centos6.7_min2机器中执行修改hostname命令

      vi   etc/sysconfig/network		#编辑network文件
      

    • 在Centos6.7_min3机器中执行修改hostname命令

      vi   etc/sysconfig/network		#编辑network文件
      

    • 分别重启机器

  3. 分别配置三台机器的静态ip

    • 规划三台机器的静态ip地址

      Centos6.7_min1 192.168.18.64
      Centos6.7_min2 192.168.18.65
      Centos6.7_min3 192.168.18.66
    • 以centos6.7_min1为例配置静态ip地址,其他机器配置步骤一致

      vi /etc/sysconfig/network-scripts/ifcfg-eth0   #编辑ifcfg-eth0文件
      

      (注意:此IPADDR、DNS1、GATEWAY具体的值要跟你自己的虚拟机NAT网络的值相匹配 )

      查看自己的NAT信息的步骤如下图:

    • 分别重启机器

  4. 分别修改三台机器hosts

    vi /etc/hosts   #在每台机器的hosts文件添加ip与hostname的映射
    

  5. 分别为每台机器创建一个名为“hadoop”的用户

    useradd hadoop  #添加hadoop用户
    passwd  hadoop  #给hadoop用户 设置密码 
    
  6. 分别为每台机器的“hadoop”用户配置sudo权限

    chmod  u+w /etc/sudoers   #为sudoers文件添加一个“可以写入”的权限
    vi /etc/sudoers    #用root用户编辑sudoers文件
    

  7. 关闭每台机器的防火墙

    service iptables stop		#关闭防火墙
    chkconfig iptables off		#关闭防火墙开机启动
    

  8. 安装 jdk-7u55-linux-i586.tar.gz

    #(1)解压jdk
    
    #创建文件夹
    mkdir /home/hadoop/develop_env
    
    #解压
    tar  -zxvf  jdk-7u55-linux-i586.tar.gz  -C  /home/hadoop/develop_env
    
    #(2)将java添加到环境变量中
    
    vim /etc/profile
    
    #在文件最后添加
    export JAVA_HOME=/home/hadoop/develop_env/jdk1.7.0_65
    export PATH=$PATH:$JAVA_HOME/bin
    
    #刷新配置
    source /etc/profile
    
  9. 三台机器分别切换为hadoop用户并创建一个名为develop_env的文件夹

    su - hadoop     #切换到hadoop用户
    mkdir develop_env      #在hadoop的家目录下创建一个develop_env文件
    

    下面的步骤都是以hadoop用户来完成

  10. 上传hadoop-2.7.1.tar.gz到Centos6.7_min1机器的/home/hadoop/develop_env目录下

  11. 解压hadoop-2.7.1.tar.gz安装包

    cd /home/hadoop/develop_env		#切换到/home/hadoop/develop_env目录
    tar -zxvf  hadoop-2.7.1.tar.gz  -C  /home/hadoop/develop_env	#解压
    
  12. 设置hadoop-env.sh配置文件

    cd   /home/hadoop/develop_env/hadoop-2.7.1/etc/hadoop  #切换目录
    vi   hadoop-env.sh  #添加如下内容
    

  13. 设置core-site.xml配置文件

    mkdir  /home/hadoop/develop_env/hadoop-2.7.1/data   #创建一个名为的文件夹
    vi core-site.xml   #添加如下内容
    

  14. 设置hdfs-site.xml配置文件(该文件默认即可,今天就不用配置此文件了)

    vi hdfs-site.xml  #添加如下内容
    

  15. 设置mapred-site.xml配置文件

    mv  mapred-site.xml.template   mapred-site.xml  #默认mapred-site.xml不存在,使用
    											#mapred-site.xml.template生成
    vi  mapred-site.xml  #添加如下内容
    

  16. 设置yarn-site.xml配置文件

    vi   yarn-site.xml   #添加如下内容
    

  17. 设置slaves配置文件

    vi  slaves    #修改后显示如下内容
    

  18. 配置Centos6.7_min1到Centos6.7_min2、Centos6.7_min3的免密登陆

    # 注意  如果机器中没有安装ssh-client软件,先需要安装,安装步骤如下:
        1.yum list | grep openssh-clients  #使用yum方法操作软件包
        	#输出“ openssh-clients.x86_64      5.3p1-122.el6         base”
        2.yum install openssh-clients.x86_64   #安装
    

    1. 在Centos6.7_min1中生成密钥对

      cd ~    #切换到/home/hadoop目录
      ssh-keygen -t rsa     #此命令要接收用户输入,直接输入“三次回车”即可
      

    2. 将公钥分别拷贝到要min2和min3机器中

      cd .ssh   #切换到 .ssh目录
      ssh-copy-id min1
      ssh-copy-id min2
      ssh-copy-id min3
      

  19. 将develop_env目录下的所有文件分别拷贝到Centos6.7_min2、Centos6.7_min3

    cd ~/develop_env        #切换到/home/hadoop/develop_env目录下
    scp -r /home/hadoop/develop_env/hadoop-2.7.1  min2:/home/hadoop/
    scp -r /home/hadoop/develop_env/hadoop-2.7.1  min3:/home/hadoop
    
  20. 分别在三台机器上将hadoop添加到环境变量

    (1)vim  /etc/proflie
    (2)source  /etc/profile
    (3)分别重启三台机器
    

4.3 小案例演示
  • 启动集群

    1. 格式化HDFS 因为HDFS也是文件系统,第一次使用一个文件系统都要格式化

      hadoop  namenode  -format      #在min1机器上执行格式化命令
      

    2. 启动hdfs集群(注意启动集群时,最好将集群中所有机器的时间设置一致)

      start-dfs.sh    #在min1机器上执行启动hdfs集群命令
      #注意启动集群时,最好将集群中所有机器的时间设置一致
      date -s 'yyyy-mm-dd HH:MM:SS'
      

      在min1启动namenode成功显示:

      在min2和min3启动datanode成功显示:

    3. 启动yarn集群

      start-yarn.sh       #在min1机器上执行启动yarn集群命令	
      

      在min1启动resourcemanager成功显示:

      在min2和min3启动nodemanager成功显示:

    4. 使用web查看集群的状态

      使用浏览器打开 http://192.168.18.11:8088/

  • hdfs简单操作演示

    #浏览hdfs服务器上的文件列表
     hadoop fs -ls /		#在三台机器中任何机器上执行此操作都可以 显示hdfs的根目录下的所有文件
      					   #由于第一次执行查询根目录下文件内容,所以为空
    
    #在hdfs服务器上创建一个文件夹
      hadoop   fs  -mkdir  -p  /wordcount/input		#在三台机器中任何机器上执行此操作都可以
      											 #在根目录下创建一个名为input的文件夹
    #上传本地文件到hdfs服务器上
      hadoop   fs  -put /home/hadoop/wordcount_content.txt /wordcount/input 
      							#在三台机器中任何机器上执行此操作都可以
      							#将本地的/home/hadoop/test.txt文件上传到hdfs的/input目录下
    
  • 系统自带mapreduce案例演示

     #启动系统自带的名为“wordcount”的mapreduce程序
      hadoop  jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.1.jar wordcount /wordcount/input /wordcount/output   #执行一个mapreduce例子
    

第六节:集群使用效果演示

5.1 HDFS的基本使用
  • 查看集群状态

    1. 打开web控制台查看HDFS集群信息,在浏览器打开http://192.168.18.64:50070/

      hadoop-web

    2. 使用命令查看:hdfs dfsadmin -report

  • 使用shell命令操作hdfs

    从HDFS下载文件

    hadoop fs -get /wordcount/input/wordcount_content.txt   #下载wordcount_content.txt到本地当前路径
    
  • 使用java api操作hdfs

    public void testUpload() throws Exception {
    		Configuration conf = new Configuration();
    		//可以直接传入 uri和用户身份
    		FileSystem fs = FileSystem.get(new URI("hdfs://192.168.18.64:9000"),conf,"hadoop"); //最后一个参数为用户名
    		Thread.sleep(2000);
    		fs.copyFromLocalFile(new Path("d:/cc.txt"), new Path("/access.log"));
    		fs.close();
    	}
    

5.2 MAPREDUCE基本使用

上面演示mapreduce的demo是hadoop提供的,下面演示一个使用代码编写一个wordcount的例子

  1. 需求

    从大量文本文件中,统计出每一个单词出现的总次数
    
  2. 思路

    Map阶段:
    
    1. 从HDFS的源数据文件中逐行读取数据
    2. 将每一行数据切分出单词
    3. 为每一个单词构造一个键值对  如(单词,1)
    4. 将键值对发送给reduce
    
    Reduce阶段:
    
    1. 接收map阶段输出的单词键值对
    2. 将相同单词的键值对汇聚成一组
    3. 对每一组,遍历组中的所有“值”,累加求和,即得到每一个单词的总次数
    4. 将(单词,总次数)输出到HDFS的文件中
    
  3. 代码实现

    • 编写mapper类

      package edu.qianfeng.mr.day05.wordcount;
      
      import java.io.IOException;
      
      import org.apache.hadoop.io.LongWritable;
      import org.apache.hadoop.io.Text;
      import org.apache.hadoop.mapreduce.Mapper;
      
      public class MyMapper extends Mapper<LongWritable, Text, Text, Text>{
      	Text word = new Text();
      	Text one = new Text("1");
      	@Override
      	protected void map(LongWritable key, Text value,Context context)
      			throws IOException, InterruptedException {
      		//获取行数据
      		String line = value.toString();
      		//对数据进行拆分   [hello,qianfeng,hi,qianfeng] [hello,1603] [hi,hadoop,hi,spark]
      		String []  words = line.split(" ");
      		//循环数组
      		for (String s : words) {
      			word.set(s);
      			context.write(word, one);
      		}
      	}
      }
      
      

    • 编写reducer类

      package edu.qianfeng.mr.day05.wordcount;
      
      import java.io.IOException;
      
      import org.apache.hadoop.io.Text;
      import org.apache.hadoop.mapreduce.Reducer;
      
      public class MyReducer extends Reducer<Text, Text, Text, Text>{
      	Text sum = new Text();
      	@Override
      	protected void reduce(Text key, Iterable<Text> value,Context context)
      			throws IOException, InterruptedException {
      		//定义一个计数器
      		int counter = 0;
      		//循环奇数
      		for (Text i : value) {
      			counter += Integer.parseInt(i.toString());
      		}
      		sum.set(counter+"");
      		//reduce阶段的最终输出
      		context.write(key, sum);
      	}
      
      }
      

    • 编写主类,来描述job并提交job

      package edu.qianfeng.mr.day05.wordcount;
      
      import java.io.IOException;
      import org.apache.hadoop.conf.Configuration;
      import org.apache.hadoop.fs.Path;
      import org.apache.hadoop.io.Text;
      import org.apache.hadoop.mapreduce.Job;
      import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
      import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
      
      public class WordCount {
      
      	public static void main(String[] args) {
      		try {
      			//获取配置对象
      			Configuration conf = new Configuration();
      			//创建job
      			Job job = new Job(conf, "wordcount");
      			//为job设置运行主类
      			job.setJarByClass(WordCount.class);
      			
      			//设置map阶段的属性
      			job.setMapperClass(MyMapper.class);
      			job.setMapOutputKeyClass(Text.class);
      			job.setMapOutputValueClass(Text.class);
      			FileInputFormat.addInputPath(job, new Path(args[0]));
      			
      			
      			//设置reduce阶段的属性
      			job.setReducerClass(MyReducer.class);
      			job.setOutputKeyClass(Text.class);
      			job.setOutputValueClass(Text.class);
      			FileOutputFormat.setOutputPath(job, new Path(args[1]));
      			
      			//提交运行作业job 并打印信息
      			int isok = job.waitForCompletion(true)?0:1;
      			//退出job
      			System.exit(isok);
      			
      		} catch (IOException | ClassNotFoundException | InterruptedException e) {
      			e.printStackTrace();
      		}
      	}
      }
      
  4. 程序打包

    • 第一步

    • 第二步

    • 第三步

  5. 准备测试数据

    将wordcount_content.txt文件上传到hdfs

    hadoop  fs  mkdir  -p  /wordcount/input	#在hdfs上创建输入数据文件夹
    hadoop  fs  –put  /wordcount_content.txt  /wordcount/input   #wordcount_content.txt上传到hdfs上
    

  6. 将程序jar包上传到集群的任意一台服务器上

  7. 使用命令执行wordcount程序

    hadoop jar wordcount.jar edu.qianfeng.mr.day05.wordcount.WordCount /wordcount/input /wordcount/output
    
  8. 查看处理结果

你可能感兴趣的:(Hadoop)