您的位置:首页 > 运维架构

hadoop的学习笔记(入门版)(应试版)(hadoop实战精华)和一点hadoop相关资料

2017-05-05 16:04 676 查看
写在前边,这是在毫无大数据基础下花一天看完了hadoop实战记录的笔记,也总算有一点点概念了,后续还要好好学习吼吼!

概念:

hadoop:可编写和运行分布式应用处理大规模数据的框架。

hadoop及相关大数据框架都是运行在linux环境下的。

hadoop集群:拥有许多并行的计算机,用以处理大规模数据。
分布式文件存储系统(HDFS):数据分布在集群内的多台机器上,集群并行读取数据。
hadoop数据传输理念:传统的是客户端与服务器之前是数据传输,而hadoop把代码迁移到集群内的机器上去,集群内的机器收集到数据在放在HDFS上去供集群使用。
hadoop针对的数据是非结构化数据。sql是结构化数据。hadoop的数据最终都被转换为键值对以供处理。
MapReduce:hadoop使用MapReduce编程处理数据,MapReduce是制定数据的处理步骤的程序方式。
MapReduce分为mapping和reducing两个阶段,其中mapping获取输入数据并装进mapper,reducing阶段处理数据并给出输出结果。
MapReduce使用列表和键值对作为数据原语。首先<k1,v1>输入mapper经过转换的到<k2,v2>,集群聚合mapper的输出的到<k2,list<v2>>作为reduce的输入,经过reducing的处理得到reduce的输出<k3,v3>.MapReduce然后把这些输出存在HDFS上。

Hadoop的构造模块
运行Hadoop的程序就意味着在集群内的服务器上进行一组守护进程,这一组守护进程多多个角色,有的存在于单个服务器,有的运行在多个服务器上。

NameNode位于HDFS系统的主端,指导从端的DataNode执行底层的I/O任务。它跟踪文件如何被分块又被哪些节点存储,以及实时监控HDFS系统整体运行状态是否正常。此节点不存储数据或执行MapReduce程序。每一个集群一个守护进程。
DataNode存在于集群上的所有从节点,处理HDFS系统内数据块的读写及备份任务。当文件被分隔后有NameNode负责分配由哪个dataNode存储并告知客户端存储的打她Node节点,然后客户端直接与dataNode节点进行通信。
Secondary NameNode用于检测HDFS集群状态的辅助守护进程,每一个集群一个,不实时的接收数据,它是与NameNode通信,时间间隔内获取HDFS系统的数据快照,主要用来降低风险,当NameNode出现故障时可以恢复数据。

JobTracker是应用程序与Hadoop之间的纽带,当代码提交到集群上,由JobTracker确定执行计划,包括决定处理哪些文件等。监测MapReduce作业的整个执行进程。每个集群有一个JobTracker守护进程。
TaskTracker负责执行JobTracker分配的单个任务,每个集群从节点都有一个,且每个TaskTracker都能生成多个JVM并发的执行多个任务。



集群拓扑图



节点间的交互

构建Hadoop集群
需要制定一个服务器作为主节点,这个服务器通常会驻留NameNode和JobTracker的守护进程,并作为一个基站,负责联络并激活从节点上的DataNode和TaskTracker守护进程。节点间的通信采用SSH协议。所有节点服务器采用一个公共账号,有相同的用户名,这个账号仅用作管理Hadoop集群。具体的mapReduce程序由其他的账号运行。

1.所有节点上安装jdk

2.所有节点安装SSH并设置成无密码公钥模式

3.所有节点都安装好hadoop

5.所有服务器用一个公共账号,只用来管理集群

4.配置hadoop,就是设定主从节点守护进程之类的,然后配置文件每个节点放一份。

5.然后在主节点服务器上启动集群。

Hadoop的三个模式
单机模式:完全运行在本地,不使用HDFS,不与其他节点交互,仅用于开发调试MapReduce的程序逻辑,不与守护进程交互。
此配置下的三个xml文件配置都为空。

伪分布模式:所有的节点都分布在一台服务器上,但是可以代码调试,允许检查内存使用情况,也与其他的守护进程交互。
在core-site.xml中置顶NameNode的主机名和端口,在mapred-site.xml中置顶JobTracker的主机名和端口。在hdfs-site中指定HDFS的默认副本数,在需要在文件masters中指定SNN的位置。



全分布模式:从节点分布在多台服务器上,master:集群的主节点,主流NameNode和JobTracker守护进程。 backup:驻留SNN守护进程的节点. hadoop1,hadoop2···从节点,驻留dataNode和TaskTracker守护进程。

配置文件相较于伪分布式模式需要定位文件系统的NameNode,以及JobTracker主节点,以及增大HDFS的备份数。

更新masters和slaves文件来置顶其他守护进程的位置。

将所有文件更新完后需要复制到集群上的所有节点服务器,然后要格式化HDFS。

之后就能够启动Hadoop的守护进程了。到此一个集群就建成了。

模式之间的切换:为每一种模式分别生成一个配置目录,并放上合适的xml文件,然后使用i-s conf.cluster conf命令就能在多种配置也就是模式间切换,但是需要保证这些模式在HDFS系统上有不同的文件存储位置,且切换前应该停止所有的守护进程。

通过端口50070提供常规报告。http://cloud-1:50030/jobtracker.jsp

文件操作
Hadoop对于本机和HDFS上的文件都能够操作,文件路径格式是scheme://authority/path
本机:file://用户名/user/example.txt
HDFS:hdfs://NameNode的主机名/文件路径
文件列表:hadoop fs -ls
显示文件内容:hadoop fs -cat example.txt
HDFS默认的工作目录是/user/$USER,需要自己创建:hadoop fs -mkdir/user/用户名
查看当前目录内的文件信息:hadoop fs -ls /
查看根目录下所有子目录信息:hadoop fs -lsr /
放一个文件到默认的工作目录:hadoop fs -put example.txt . (.指的是默认的工作目录/user/用户名)
把HDFS中的文件复制到本地的当前工作目录中去:hadoop fs -get example.txt. .
显示HDFS中的文件:hadoop fs -cat example.txt
快速检查HDFS的内容:hadoop fs -cat example.txt | head
查看文件的最后一千字节:hadoop fs -tail example.txt
删除文件:hadoop fs -rm example.txt

Java操作HDFS







数据类型
Hadoop的数据类型只能是实现了hadoop接口的类,比如实现了Writable接口的可以是值,实现了writableComparable<T>接口的可以是值也可以是键。
BooleanWritable  布尔变量的封装
ByteWritable     单字节数的封装
DoubleWritable   双字节数的封装
FloatWritable     浮点数的封装
IntWritable      整数的封装
LongWritable     long的封装
Text             UTF8格式的文本封装
NullWritable     无键值时的占位符
自定义数据类型:只需要实现Writable或WritableComparable<T>接口

编程:

mapper:如果一个类要作为一个mapper需要继承MapReduceBase并实现Mapper接口。
Mapper接口:Mapper<k1,v1,k2,v2> 参数为输入键、输入值、输出建、输出值、

map函数:
void map(K1 key,V1 value,OutputCollector<K2,V2>output,Reporter reporter)throws IOException
IdentityMapper<K,V> 实现Mapper<K,V,K,V>将输入直接作为输出 
InverseMapper<K,V>  实现mapper<K,V,V,K>反转键值对
RegexMapper<K,V> 实现Mapper<K,Text,Text,LongWritable>为每个常规表达式的匹配项生成一个(match,1)对。
TokenCountMapper<K> 实现Mapper<K,Text,Text,LongWritable>当输入的值为分词时生成一个(token,1)对

Reducer:也需要实现MapReduce的Reducer接口。它收到mapper的输出值按照键进行排序并将相同键的值归并,然后调用reduce()函数迭代处理数据。

IdentityReducer<K,V> 实现ReDucer<K,V,K,V>将输入直接映射成输出
LongSumReducer<K> 实现<K,LongWritable,K,LongWritable>计算与给定键的相应的所有值的和。
注意:mapper将输出给不同的reducer
如何确定该输送给哪个reducer?默认做法事对键进行散列来确定reducer,HashPartitioner类能够强制执行这一策略。

patitioner:实现mapper输出结果到reduce的分配。需要继承Partitioner<>接口并实现configure()和getPartition()两个函数。前者将作业的配置应用在patitioner上,后者返回一个介于0到reduce任务数的整数,指向键值对将要发送的reducer。

HDFS的文件系统处理的类:FSDataInputStream
Hadoop分割与读取文件的方式被定义在InputFormat接口的一个实现中,默认的实现是TextInputFormat.
TextInputFormat  在文本文件的每一行均为一个记录,键为一行的字节偏移,值为一行的内容。key:LongWritable value:Text
KeyValueTextInputFormat  每行为一个记录,以第一个分隔符为界,前边是键,后边是值。
SequenceFileInputFormat<K,V> ,用于读取序列文件,键值自定义,序列文件为Hadoop专用的压缩二进制文件格式
NLineInputFormat  与TextInputFormat类似,但是每个分片一定有n行,n可以设定默认为1

每个完整的作业被单独包含在一个类中,reducer和mapper类被包含在这个类里面作为内部类。我们假设将它命名为MyJob
class MyJob(){
class MapperClass(){};
class Reduce(){};
run();
main();
}

Driver(也就是run()方法):run()方法实例化、配置并传递一个JobConf对象命名的作业给JobClient.runJob()用来启动MapReduce作业。JobConf对象将保存作业运行所需要的全部配置。润方法中需要给每个方法定制基本参数,包括输入路径、输出路径、mapper和reduce以及重置作业的默认属性如InputFormat、OutputFormat等。 用Jobconf对象的set方法可以修改任意的参数,一旦jobConf被传递到JonClient去,jobConf就成了作业的整体规划决定作业如何运作。
配置文件可以配置jobConf的默认参数。

class MapperClss extends MapReduceBase implementd Mapper<K1,V1,K2,V2>{
map();
}
class Reduce extends MapReduceBase implementd reduce<K2,V2,K3,V3>{
reduce();
}

map方法调用K1,V1类型的值并转换成K2,V2之后输出
reduce方法调用K2,V2类型的值并转换之后输出K3、V3。注意K2/V2的类型要和map()中的K2/V2一样。

combiner:可以放在mapper和reducer之间,减少mapper的输出来缓解压力,但不影响reducer的输出,也就是说拿开combiner之后reducer得输出值也是一样,只是效率变低
使用combiner之前需要对mapper和reducer进行重构,即给mapper增加一个计数,在输出之间就先进行一轮统计。此外driver也需要给jobConf指定combiner类。

MapReduce作业链
Job和JobController类管理非线性作业之间的链接
Job是作业的表现形式。Job对象通过传递一个JobConf对象到作业的构造函数中实现实例化。Job通过设定addDependingJob()实现两个作业之间的依赖。
x.addDependingJob(y)表示x在y完成之前不会启动。
JobController类管理和监控作业:addJob()方法可以给JobController添加作业,当作业和依赖添加完成之后,就生成一个线程来提交并执行。JobController有allFinished()和getFailedJobs这样的方法监控作业的执行。
预处理和后处理:将预处理和后处理写成标准的mapper.
把多个mapper和reduce链接成一个作业:
driver先创建一个全局的jobConf,然后用chrainMapper添加reduce之前的步骤,然后用chrainReduce的set方法设置reduce,再chrainReduce的add方法添加reduce的步骤。其中addmapper的参数包括全局Jobconf、输入输出参数、本地jobConf,byvalue(是否为值传递模式)
链接不同来源的数据:使用dataJoin框架
DistributedCache:管理分布式缓存的类,数据链接。

bloom filter:二进制向量数据结构,利用二进制数表示集合,并能很快速的知道一个元素是否在这个集合,错误率不为0,当集合越大,判断失误率越高。
在hadoop中可以用bloom filter做数据集的摘要或做数据链接。
使用bloom filter:
新建一个bloom filter类实现waritable类作为自定义的有效数据结构。

允许输入输出压缩解压:
conf.setBoolean("mapperd.compress.map.out",true); 设置允许压缩解压
conf.setClass   ("mapperd.map.output.compression.codec",GzipCodec.class,CompressionCodec.class);  设置合适的编解码器

MultipleOutputFormat:将数据集划分为多个数据集  输出分区
DBOutputFormat:联结到数据库  输出到数据库

最后。企业级大数据应用框架图:



只是大概看了一遍书,把重点记了一下,真正的理解还需要实践。

附上学习资料:hadoop实战中文版

如需其他学习资料,推荐百度网盘搜索引擎:搜啦

hadoop及相关大数据框架都是运行在linux环境下的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息