大数据:Hadoop新手入门

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Android_Mrchen/article/details/84344173

大数据:Hadoop入门
一:什么是大数据

  1. 什么是大数据:
    (1.)大数据是指在一定时间内无法用常规软件对其内容进行抓取,管理和处理的数据集合,简而言之就是数据量非常大,大到无法用常规工具进行处理,如关系型数据库,数据仓库等。这里“大”是一个什么量级呢?如在阿里巴巴每天处理数据达到20PB(即20971520GB).
    2.大数据的特点:
    (1.)体量巨大。按目前的发展趋势来看,大数据的体量已经到达PB级甚至EB级。
    (2.)大数据的数据类型多样,以非结构化数据为主,如网络杂志,音频,视屏,图片,地理位置信息,交易数据,社交数据等。
    (3.)价值密度低。有价值的数据仅占到总数据的一小部分。比如一段视屏中,仅有几秒的信息是有价值的。
    (4.)产生和要求处理速度快。这是大数据区与传统数据挖掘最显著的特征。
    3.除此之外还有其他处理系统可以处理大数据。
    Hadoop (开源)
    Spark(开源)
    Storm(开源)
    MongoDB(开源)
    IBM PureDate(商用)
    Oracle Exadata(商用)
    SAP Hana(商用)
    Teradata AsterData(商用)
    EMC GreenPlum(商用)
    HP Vertica(商用)
    注:这里我们只介绍Hadoop。
    二:Hadoop体系结构
  2. Hadoop来源:
    Hadoop源于Google在2003到2004年公布的关于GFS(Google File System),MapReduce和BigTable的三篇论文,创始人Doug Cutting。Hadoop现在是Apache基金会顶级项目,“Hadoop”一个虚构的名字。由Doug Cutting的孩子为其黄色玩具大象所命名。
  3. Hadoop的核心:
    (1.)HDFS和MapReduce是Hadoop的两大核心。通过HDFS来实现对分布式储存的底层支持,达到高速并行读写与大容量的储存扩展。
    (2.)通过MapReduce实现对分布式任务进行处理程序支持,保证高速分区处理数据。
    3.Hadoop子项目:
    (1.)HDFS:分布式文件系统,整个Hadoop体系的基石。
    (2.)MapReduce/YARN:并行编程模型。YARN是第二代的MapReduce框架,从Hadoop 0.23.01版本后,MapReduce被重构,通常也称为MapReduce V2,老MapReduce也称为 MapReduce V1。
    (3.)Hive:建立在Hadoop上的数据仓库,提供类似SQL语音的查询方式,查询Hadoop中的数据,
    (4.)Pig:一个队大型数据进行分析和评估的平台,主要作用类似于数据库中储存过程。
    (5.)HBase:全称Hadoop Database,Hadoop的分布式的,面向列的数据库,来源于Google的关于BigTable的论文,主要用于随机访问,实时读写的大数据。
    (6.)ZooKeeper:是一个为分布式应用所设计的协调服务,主要为用户提供同步,配置管理,分组和命名等服务,减轻分布式应用程序所承担的协调任务。
    还有其它特别多其它项目这里不做一一解释了。
    HDFS架构
    1 Master(NameNode/NN) 带N个slaves(DataNode/DN)
    HDFS/YARN/HBase
    1个文件会被拆分成多个Block
    blocksize:128M
    130==>2个Block: 128M和2M
    NN:
    1)负责客户端请求的响应
    2)负责元数据(文件的名称、副本系数、block存放的DN)的管理
    DataNode:
  1. 存储用户的文件对应的数据块
    2)要定期向name node发送心跳信息,汇报本身及其所有的block信息,健康状况
    name node+n 个 datanode
    建议:NAME node和data node是部署在不同的节点上
    HDFS
    所有的block 除了最后一块 其他大小都一样
    namenode(filename,numReplicas(副本系数),block_ids)
    副本存放策略:
    1st replica. 如果写请求方所在机器是其中一个datanode,则直接存放在本地,否则随机在集群中选择一个datanode.
    2nd replica. 第二个副本存放于不同第一个副本的所在的机架.
    3rd replica.第三个副本存放于第二个副本所在的机架,但是属于不同的节点.

A typical deployment has a dedicated machine that runs only the NameNode software.
Each of the other machines in the cluster runs one instance of the DataNode software.
The architecture does not preclude running multiple DataNodes on the same machine
but in a real deployment that is rarely the case.

NameNode + N个DataNode
建议:NN和DN是部署在不同的节点上

replication factor:副本系数、副本因子

All blocks in a file except the last block are the same size

Hadoop1.x时:
MapReduce:Master/Slave架构,1个JobTracker带多个TaskTracker

JobTracker: 负责资源管理和作业调度
TaskTracker:
定期向JT汇报本节点的健康状况、资源使用情况、作业执行情况;
接收来自JT的命令:启动任务/杀死任务

YARN:不同计算框架可以共享同一个HDFS集群上的数据,享受整体的资源调度

XXX on YARN的好处:
与其他计算框架共享集群资源,按资源需要分配,进而提高集群资源的利用率
XXX: Spark/MapReduce/Storm/Flink

YARN架构:
1)ResourceManager: RM
整个集群同一时间提供服务的RM只有一个,负责集群资源的统一管理和调度
处理客户端的请求: 提交一个作业、杀死一个作业
监控我们的NM,一旦某个NM挂了,那么该NM上运行的任务需要告诉我们的AM来如何进行处理

  1. NodeManager: NM
    整个集群中有多个,负责自己本身节点资源管理和使用
    定时向RM汇报本节点的资源使用情况
    接收并处理来自RM的各种命令:启动Container
    处理来自AM的命令
    单个节点的资源管理

  2. ApplicationMaster: AM
    每个应用程序对应一个:MR、Spark,负责应用程序的管理
    为应用程序向RM申请资源(core、memory),分配给内部task
    需要与NM通信:启动/停止task,task是运行在container里面,AM也是运行在container里面

  3. Container
    封装了CPU、Memory等资源的一个容器
    是一个任务运行环境的抽象

  4. Client
    提交作业
    查询作业的运行进度
    杀死作业

YARN环境搭建
1)mapred-site.xml

mapreduce.framework.name
yarn

2)yarn-site.xml

yarn.nodemanager.aux-services
mapreduce_shuffle

  1. 启动YARN相关的进程
    sbin/start-yarn.sh

4)验证
jps
ResourceManager
NodeManager
http://hadoop000:8088

5)停止YARN相关的进程
sbin/stop-yarn.sh

提交mr作业到YARN上运行:
/home/hadoop/app/hadoop-2.6.0-cdh5.7.0/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0-cdh5.7.0.jar

hadoop jar

hadoop jar hadoop-mapreduce-examples-2.6.0-cdh5.7.0.jar pi 2 3

wordcount: 统计文件中每个单词出现的次数

需求:求wc

  1. 文件内容小:shell
    2)文件内容很大: TB GB ??? 如何解决大数据量的统计分析

> url TOPN < wc的延伸
工作中很多场景的开发都是wc的基础上进行改造的

借助于分布式计算框架来解决了: mapreduce

分而治之

(input) <k1, v1> -> map -> <k2, v2> -> combine -> <k2, v2> -> reduce -> <k3, v3> (output)

核心概念
Split:交由MapReduce作业来处理的数据块,是MapReduce中最小的计算单元
HDFS:blocksize 是HDFS中最小的存储单元 128M
默认情况下:他们两是一一对应的,当然我们也可以手工设置他们之间的关系(不建议)

InputFormat:
将我们的输入数据进行分片(split): InputSplit[] getSplits(JobConf job, int numSplits) throws IOException;
TextInputFormat: 处理文本格式的数据

OutputFormat: 输出

MapReduce1.x的架构
1)JobTracker: JT
作业的管理者 管理的
将作业分解成一堆的任务:Task(MapTask和ReduceTask)
将任务分派给TaskTracker运行
作业的监控、容错处理(task作业挂了,重启task的机制)
在一定的时间间隔内,JT没有收到TT的心跳信息,TT可能是挂了,TT上运行的任务会被指派到其他TT上去执行

2)TaskTracker: TT
任务的执行者 干活的
在TT上执行我们的Task(MapTask和ReduceTask)
会与JT进行交互:执行/启动/停止作业,发送心跳信息给JT

3)MapTask
自己开发的map任务交由该Task出来
解析每条记录的数据,交给自己的map方法处理
将map的输出结果写到本地磁盘(有些作业只仅有map没有reduce==>HDFS)

4)ReduceTask
将Map Task输出的数据进行读取
按照数据进行分组传给我们自己编写的reduce方法处理
输出结果写到HDFS

使用IDEA+Maven开发wc:
1)开发
2)编译:mvn clean package -DskipTests
3)上传到服务器:scp target/hadoop-train-1.0.jar hadoop@hadoop000:~/lib
4)运行
hadoop jar /home/hadoop/lib/hadoop-train-1.0.jar com.imooc.hadoop.mapreduce.WordCountApp hdfs://hadoop000:8020/hello.txt hdfs://hadoop000:8020/output/wc

相同的代码和脚本再次执行,会报错
security.UserGroupInformation:
PriviledgedActionException as:hadoop (auth:SIMPLE) cause:
org.apache.hadoop.mapred.FileAlreadyExistsException: 
Output directory hdfs://hadoop000:8020/output/wc already exists
Exception in thread "main" org.apache.hadoop.mapred.FileAlreadyExistsException: 
Output directory hdfs://hadoop000:8020/output/wc already exists

在MR中,输出文件是不能事先存在的
1)先手工通过shell的方式将输出文件夹先删除
	hadoop fs -rm -r /output/wc
2) 在代码中完成自动删除功能: 推荐大家使用这种方式
    Path outputPath = new Path(args[1]);
    FileSystem fileSystem = FileSystem.get(configuration);
    if(fileSystem.exists(outputPath)){
        fileSystem.delete(outputPath, true);
        System.out.println("output file exists, but is has deleted");
    }

Combiner
hadoop jar /home/hadoop/lib/hadoop-train-1.0.jar com.imooc.hadoop.mapreduce.CombinerApp hdfs://hadoop000:8020/hello.txt hdfs://hadoop000:8020/output/wc

使用场景:
求和、次数 +
平均数 X

Partitioner
hadoop jar /home/hadoop/lib/hadoop-train-1.0.jar com.imooc.hadoop.mapreduce.ParititonerApp hdfs://hadoop000:8020/partitioner hdfs://hadoop000:8020/output/partitioner

用户行为日志:用户每次访问网站时所有的行为数据(访问、浏览、搜索、点击…)
用户行为轨迹、流量日志

日志数据内容:
1)访问的系统属性: 操作系统、浏览器等等
2)访问特征:点击的url、从哪个url跳转过来的(referer)、页面上的停留时间等
3)访问信息:session_id、访问ip(访问城市)等

2013-05-19 13:00:00 http://www.taobao.com/17/?tracker_u=1624169&type=1 B58W48U4WKZCJ5D1T3Z9ZY88RU7QA7B1 http://hao.360.cn/ 1.196.34.243

数据处理流程
1)数据采集
Flume: web日志写入到HDFS

2)数据清洗
脏数据
Spark、Hive、MapReduce 或者是其他的一些分布式计算框架
清洗完之后的数据可以存放在HDFS(Hive/Spark SQL)

3)数据处理
按照我们的需要进行相应业务的统计和分析
Spark、Hive、MapReduce 或者是其他的一些分布式计算框架

4)处理结果入库
结果可以存放到RDBMS、NoSQL

5)数据的可视化
通过图形化展示的方式展现出来:饼图、柱状图、地图、折线图
ECharts、HUE、Zeppelin

UserAgent

hadoop jar /home/hadoop/lib/hadoop-train-1.0-jar-with-dependencies.jar com.imooc.hadoop.project.LogApp /10000_access.log /browserout

spark启动:spark-shell --master local[2]

spark实现wc:
val file = sc.textFile(“file:///home/hadoop/data/hello.txt”)
val a = file.flatMap(line => line.split(" "))
val b = a.map(word => (word,1))
Array((hadoop,1), (welcome,1), (hadoop,1), (hdfs,1), (mapreduce,1), (hadoop,1), (hdfs,1))

val c = b.reduceByKey(_ + _)
Array((mapreduce,1), (welcome,1), (hadoop,3), (hdfs,2))

sc.textFile(“file:///home/hadoop/data/hello.txt”).flatMap(line => line.split(" ")).map(word => (word,1)).reduceByKey(_ + _).collect

Flink运行
./bin/flink run ./examples/batch/WordCount.jar
–input file:///home/hadoop/data/hello.txt --output file:///home/hadoop/tmp/flink_wc_output

Beam运行:
#direct方式运行
mvn compile exec:java -Dexec.mainClass=org.apache.beam.examples.WordCount
-Dexec.args="–inputFile=/home/hadoop/data/hello.txt --output=counts"
-Pdirect-runner

#spark方式运行
mvn compile exec:java -Dexec.mainClass=org.apache.beam.examples.WordCount
-Dexec.args="–runner=SparkRunner --inputFile=/home/hadoop/data/hello.txt --output=counts" -Pspark-runner

#flink方式运行

猜你喜欢

转载自blog.csdn.net/Android_Mrchen/article/details/84344173