Hadoop入门篇

  快速入门

HADOOP快速入门

HADOOP快速入门

HADOOP产生背景

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

国内外HADOOP应用案例介绍

国内HADOOP的就业情况分析及课程大纲介绍

分布式系统概述

HADOOP生态圈以及各组成部分的简介

Hive快速入门

Hive快速入门

Hive基本介绍

Hive的使用

数据仓库基本知识

数据分析案例演示

需求分析

案列:定义需求、介绍数据格式

数据获取

企业中获取数据的几种方式

将文件直接导入到数据仓库

将数据库的数据导入到数据仓库(sqoop)

数据处理

使用Hive对数进行清洗(ETL的过程)

数据计算

使用Hive对数据进行计算

数据展现

将结果数据导出到mysql(sqoop)

 学习目标:

总目标建立起大数据和分布式的宏观概念

1、理解hadoop是什么,用于做什么,大体上怎么用

2、理解hive是什么,用于做什么,大体上怎么用

3、理解数据挖掘系统的基本流程和结构


背景介绍

什么是HADOOP

1.      HADOOP是apache旗下的一套开源软件平台

2.      HADOOP提供的功能:利用服务器集群,根据用户的自定义业务逻辑,对海量数据进行分布式处理

3.      HADOOP的核心组件有

A.      HDFS(分布式文件系统)

B.    YARN(为mapreduce程序分配运算硬件资源调度的系统,确定mapreduce在哪运行,配置yarn时要配置yarn的resourcemanager和yarn为mapreduce提供的服务)

C.      MAPREDUCE(分布式运算编程框架)

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

产生背景

1.      HADOOP最早起源于Nutch。Nutch的设计目标是构建一个大型的全网搜索引擎,包括网页抓取、索引、查询等功能,但随着抓取网页数量的增加,遇到了严重的可扩展性问题——如何解决数十亿网页的存储和索引问题。

2.      2003年、2004年谷歌发表的两篇论文为该问题提供了可行的解决方案

——分布式文件系统(GFS),可用于处理海量网页的存储

——分布式计算框架MAPREDUCE,可用于处理海量网页的索引计算问题。

3.      Nutch的开发人员完成了相应的开源实现HDFS和MAPREDUCE,并从Nutch中剥离成为独立项目HADOOP,到2008年1月,HADOOP成为Apache顶级项目,迎来了它的快速发展期。

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

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

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

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

HADOOP就业职位要求

大数据是个复合专业,包括应用开发、软件平台、算法、数据挖掘等,因此,大数据技术领域的就业选择是多样的,但就HADOOP而言,通常都需要具备以下技能或知识:

A.      HADOOP分布式集群的平台搭建

B.      HADOOP分布式文件系统HDFS的原理理解及使用

C.      HADOOP分布式运算框架MAPREDUCE的原理理解及编程

D.      Hive数据仓库工具的熟练应用

E.      Flume、sqoop、oozie等辅助工具的熟练使用

F.       Shell/python等脚本语言的开发能力

 生态圈以及各组成部分的简介

重点组件:

HDFS:分布式文件系统

MAPREDUCE:分布式运算程序开发框架

HIVE:基于大数据技术(文件系统+运算框架)的SQL数据仓库工具

HBASE:基于HADOOP的分布式海量数据库

ZOOKEEPER:分布式协调服务基础组件

Mahout:基于mapreduce/spark/flink等分布式运算框架的机器学习算法库

Oozie:工作流调度框架

Sqoop:数据导入导出工具

Flume:日志数据采集框架

2 分布式系统概述

注:由于大数据技术领域的各类技术框架基本上都是分布式系统,因此,理解hadoopstormspark等技术框架,都需要具备基本的分布式系统概念

2.1 分布式软件系统(Distributed Software Systems)

该软件系统会划分成多个子系统或模块,各自运行在不同的机器上,子系统或模块之间通过网络通信进行协作,实现最终的整体功能

比如分布式操作系统、分布式程序设计语言及其编译(解释)系统、分布式文件系统和分布式数据库系统等。

2.2 分布式软件系统举例:solrcloud

A.      一个solrcloud集群通常有多台solr服务器

B.      每一个solr服务器节点负责存储整个索引库的若干个shard(数据分片)

C.      每一个shard又有多台服务器存放若干个副本互为主备用

D.      索引的建立和查询会在整个集群的各个节点上并发执行

E.      solrcloud集群作为整体对外服务,而其内部细节可对客户端透明

总结:利用多个节点共同协作完成一项或多项具体业务功能的系统就是分布式系统。


集群搭建

集群搭建

集群简介

HADOOP集群具体来说包含两个集群:HDFS集群和YARN集群,两者逻辑上分离,但物理上常在一起

HDFS集群:

负责海量数据的存储,集群中的角色主要有NameNode / DataNode

YARN集群:

负责海量数据运算时的资源调度,集群中的角色主要有 ResourceManager /NodeManager

(mapreduce是什么呢?它其实是一个应用程序开发包)

本集群搭建案例,以5节点为例进行搭建,角色分配如下:

hdp-node-01    NameNode  SecondaryNameNode

hdp-node-02    ResourceManager

hdp-node-03            DataNode    NodeManager

hdp-node-04            DataNode    NodeManager

hdp-node-05            DataNode    NodeManager

4.1.2服务器准备

本案例使用虚拟机服务器来搭建HADOOP集群,所用软件及版本:

Vmware 11.0

Centos  6.5 64bit

网络环境准备

采用NAT方式联网

网关地址:192.168.33.1

3个服务器节点IP地址:192.168.33.101、192.168.33.102、192.168.33.103

子网掩码:255.255.255.0

服务器系统设置

添加HADOOP用户

为HADOOP用户分配sudoer权限

同步时间

设置主机名

hdp-node-01

hdp-node-02

hdp-node-03

配置内网域名映射:

192.168.33.101          hdp-node-01

192.168.33.102          hdp-node-02

192.168.33.103          hdp-node-03

配置ssh免密登陆

配置防火墙

环境安装

上传jdk安装包

规划安装目录  /home/hadoop/apps/jdk_1.7.65

解压安装包

配置环境变量 /etc/profile

安装部署

上传HADOOP安装包

规划安装目录  /home/hadoop/apps/hadoop-2.6.1

解压安装包

修改配置文件  $HADOOP_HOME/etc/hadoop/

最简化配置如下:

vi hadoop-env.sh

# The java implementation to use.

export JAVA_HOME=/home/hadoop/apps/jdk1.7.0_51(因为分布式默认情况下不能通过$()获取集群上的JAVA_HOME

vi  core-site.xml

<configuration>

<property>

<name>fs.defaultFS</name>

<value>hdfs://hdp-node-01:9000</value>

</property>

<property>

<name>hadoop.tmp.dir</name>

<value>/home/HADOOP/apps/hadoop-2.6.1/tmp</value>

</property>

</configuration>

vi  hdfs-site.xml

<configuration>

<property>

<name>dfs.namenode.name.dir</name>

<value>/home/hadoop/data/name</value>

</property>

<property>

<name>dfs.datanode.data.dir</name>

<value>/home/hadoop/data/data</value>

</property>

 

<property>

<name>dfs.replication</name>

<value>3</value>

</property>

 

<property>

<name>dfs.secondary.http.address</name>

<value>hdp-node-01:50090</value>

</property>

</configuration>


vi  mapred-site.xml

<configuration>

<property>

<name>mapreduce.framework.name</name>

<value>yarn</value>

</property>

</configuration>

vi  yarn-site.xml

<configuration>

<property>

<name>yarn.resourcemanager.hostname</name>

<value>hadoop01</value>

</property>

 

<property>

<name>yarn.nodemanager.aux-services</name>

<value>mapreduce_shuffle</value>

</property>

</configuration>

 

vi  salves

hdp-node-01

hdp-node-02

hdp-node-03

 

 

启动集群

初始化HDFS

bin/hadoop  namenode  -format

启动HDFS

sbin/start-dfs.sh

启动YARN

sbin/start-yarn.sh

测试

1、上传文件到HDFS

从本地上传一个文本文件到hdfs的/wordcount/input目录下

[HADOOP@hdp-node-01 ~]$ HADOOP fs -mkdir -p /wordcount/input

[HADOOP@hdp-node-01 ~]$ HADOOP fs -put /home/HADOOP/somewords.txt  /wordcount/input

2、运行一个mapreduce程序

在HADOOP安装目录下,运行一个示例mr程序

cd $HADOOP_HOME/share/hadoop/mapreduce/

hadoop jar mapredcue-example-2.6.1.jar wordcount /wordcount/input  /wordcount/output

5 集群使用初步

5.1 HDFS使用

1、查看集群状态

命令:   hdfs  dfsadmin –report

可以看出,集群共有3个datanode可用

也可打开web控制台查看HDFS集群信息,在浏览器打开http://hdp-node-01:50070/

2、上传文件到HDFS

查看HDFS中的目录信息

命令:   hadoop fs  –ls  /

上传文件

命令:   hadoop fs  -put  ./ scala-2.10.6.tgz  to  /

从HDFS下载文件

命令:  hadoop  fs -get  /yarn-site.xml

5.2 MAPREDUCE使用

mapreduce是hadoop中的分布式运算编程框架,只要按照其编程规范,只需要编写少量的业务逻辑代码即可实现一个强大的海量数据并发处理程序

5.2.1 Demo开发——wordcount

1、需求

从大量(比如T级别)文本文件中,统计出每一个单词出现的总次数

2、mapreduce实现思路

Map阶段:

a)      从HDFS的源数据文件中逐行读取数据

b)      将每一行数据切分出单词

c)       为每一个单词构造一个键值对(单词,1)

d)      将键值对发送给reduce

Reduce阶段:

a)      接收map阶段输出的单词键值对

b)      将相同单词的键值对汇聚成一组

c)       对每一组,遍历组中的所有“值”,累加求和,即得到每一个单词的总次数

d)      将(单词,总次数)输出到HDFS的文件中

4、 具体编码实现

(1)定义一个mapper

//首先要定义四个泛型的类型

//keyin:  LongWritable    valuein: Text

//keyout: Text            valueout:IntWritable

 

public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable>{

         //map方法的生命周期:  框架每传一行数据就被调用一次

         //key :  这一行的起始点在文件中的偏移量

         //value: 这一行的内容

         @Override

         protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {

                  //拿到一行数据转换为string

                  String line = value.toString();

                  //将这一行切分出各个单词

                  String[] words = line.split(" ");

                  //遍历数组,输出<单词,1>

                  for(String word:words){

                          context.write(new Text(word), new IntWritable(1));

                  }

         }

}

(2)定义一个reducer

            //生命周期:框架每传递进来一个kv 组,reduce方法被调用一次

            @Override

            protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {

                       //定义一个计数器

                       int count = 0;

                       //遍历这一组kv的所有v,累加到count

                       for(IntWritable value:values){

                                   count += value.get();

                       }

                       context.write(key, new IntWritable(count));

            }

}

(3)定义一个主类,用来描述job并提交job

public class WordCountRunner {

            //把业务逻辑相关的信息(哪个是mapper,哪个是reducer,要处理的数据在哪里,输出的结果放哪里。。。。。。)描述成一个job对象

            //把这个描述好的job提交给集群去运行

            public static void main(String[] args) throws Exception {

                       Configuration conf = new Configuration();

                       Job wcjob = Job.getInstance(conf);

                       //指定我这个job所在的jar

//                   wcjob.setJar("/home/hadoop/wordcount.jar");

                       wcjob.setJarByClass(WordCountRunner.class);

                      

                       wcjob.setMapperClass(WordCountMapper.class);

                       wcjob.setReducerClass(WordCountReducer.class);

                       //设置我们的业务逻辑Mapper类的输出keyvalue的数据类型

                       wcjob.setMapOutputKeyClass(Text.class);

                       wcjob.setMapOutputValueClass(IntWritable.class);

                       //设置我们的业务逻辑Reducer类的输出keyvalue的数据类型

                       wcjob.setOutputKeyClass(Text.class);

                       wcjob.setOutputValueClass(IntWritable.class);

                      

                       //指定要处理的数据所在的位置

                       FileInputFormat.setInputPaths(wcjob, "hdfs://hdp-server01:9000/wordcount/data/big.txt");

                       //指定处理完成之后的结果所保存的位置

                       FileOutputFormat.setOutputPath(wcjob, new Path("hdfs://hdp-server01:9000/wordcount/output/"));

                      

                       //yarn集群提交这个job

                       boolean res = wcjob.waitForCompletion(true);

                       System.exit(res?0:1);

            }


5.2.2 程序打包运行

1.      将程序打包

2.      准备输入数据

vi /home/hadoop/test.txt

Hello tom

Hello jim

Hello ketty

Hello world

Ketty tom

在hdfs上创建输入数据文件夹:

hadoop   fs mkdir  -p  /wordcount/input

将words.txt上传到hdfs上

         hadoop  fs  –put  /home/hadoop/words.txt  /wordcount/input

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

4.      使用命令启动执行wordcount程序jar包

$ hadoop jar wordcount.jarcn.itcast.bigdata.mrsimple.WordCountDriver /wordcount/input /wordcount/out

5.      查看执行结果

$ hadoop fs –cat/wordcount/out/part-r-00000


一些说明:

bin是hadoop自己的一些命令程序

sbin是系统启动管理的命令

include和lib是本地库和第三方依赖

share里面放的是架包

etc是配置文件

注意ssh启动时${}获取不到变量值

只需要在其中一台机器配置namenode(在hdfs配置文件中,指定namenode是谁,端口是多少,它的property是fs.defaultFS,value是hdfs://mini1:9000,namenode记录文件目录的位置),然后将配置完成的软件包直接scp到其他机器,这样其他机器中都知道namenode的位置,当在sbin里面通过hadoop-deamon.sh start datanode时便可以根据配置文件知道namenode的位置,完成握手!

/bin/hadoop fs –ls /       //这是查看hadoop文件系统的根目录

hadoop fs –put test.txt /                 //把文件test.txt发送到hadoop文件系统的根目录下

hadoop fs –get test.txt           //每个block块有它的大小,如果一个文件过大,会被自动分块存储在每个datanode上面,当在客户端get的时候hdfs会自动帮你在hdfs上寻找分块的位置,并按顺序传送到get文件的位置。这其实就是hdfs起到的一个重要作用。

客户端上传一个文件,要先找namenode,namenode告诉客户端你要写到哪台机器上,并记录在namenode上(建个表,文件名对应位置),下载的时候也是一样,客户端也要先找namenode,知道文件的所有块在哪些机器上,并按顺序连续下载。

hadoop fs –setrep 10 /aaa/a.txt   //如果集群里面只有3台机器,其实只有3个副本,如果再加一台机器,会变成4个,所以设置的副本数只是记录在namenode的元数据中,是否有这么多副本还是得看datanode的数量

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值