hadoop学习总结
一、学习总结
1、hadoop集群的搭建。
由于之前在学校中学习过伪分布式的搭建,在构建集群时还是比较容易上手的。主要的搭建过程分为以下几步:第一步,配置hosts列表;第二步,安装JDK;第三步,免密钥登录配置;第四步,Hadoop配置部署;第五步,将主节点的配置文件复制到从节点;第六步,启动Hadoop集群。在这个过程中我认为需要注意的问题主要有一下几点:
第一点,注意普通用户和root用户的切换。比如配置hosts列表、安装JDK是在root用户下,而免密钥登录配置、Hadoop配置部署都是在普通用户下。在安装的过程中出现了很多由于用户不对而出现错误。这个问题不太大,但在学习前期特别容易忽略。
第二点,就是配置过程中的细节问题。在设置环境变量的时候,将路径要写正确,还有就是在配置文件中是严格区分大小写的,这点也容易出现错误。在部署hadoop集群的时候,需要更改很多的配置文件(需要注意的一点是在hadoop2.0版本之后有了yarn,需要进行一些yarn的相关配置),在整个配置过程中,出现问题最多的地方就是这些配置文件,所以在配置的过程中需要仔细一点。
第三点,在安装部署完成启动hadoop集群时,需要进行一次格式化文件系统的操作,这个操作仅限于在第一次完成部署之后进行(之前在自学的时候当启动hadoop出现问题后,多次进行格式化),因为每格式化一次集群上的数据信息就要清空。
2、在hadoop内部HDFS、MR的工作过程。
HDFS主要包括NameNode、DataNode、SecondaryNameNode,在HDFS中主要进行的是数据的存取,而在MapReduce中进行的是数据的处理。总结一下它们的过程如下:
HDFS的读流程:当客户端发送读请求后,通过DistributedFileSystem API调用open函数,发送请求到NN节点获得block的位置信息,NN返回block的位置信息,客户端收到后开始读。通过新的FSDataInputStream API 并发的读各个block,读完之后关闭流,最后在客户端形成统一的文件。
HDFS的写流程:客户端通过DistributedFileSystem API 调用create方法创建一个文件,发送请求给NN,同时将文件名、文件大小、文件的拥有者信息发送给NN,NN根据文件大小确定需要切成多少个block块,这些block块分布在哪些DN上等信息返回给客户端。客户端根据FSDataOutputStream API 将一个block写到一个DN上,由DN创建线程按照副本放置原则将block复制到其他DN上,然后返回给客户端一个回馈信息,客户端上传完成后再汇报给NN,NN返回给客户端上传成功的信息。
MR的处理流程:将HDFS中的原始数据通过split切成数据片段(通常情况下一个split对应一个block块),每一个split由一个map task线程执行,map以key value的形式将结果输出给shuffer,在shuffer中进行合并和排序,key值相同的在一个数据块中,然后将数据传给reduce执行,reduce产生最终的结果。
在该过程中需要注意的问题主要有:在HDFS的读流程中由于每个block默认有三个副本,客户端在读的过程中是随机的读其中的一个副本,同时并发的读其他的block。在HDFS的写流程中需要特别注意的一点是block的复制是不需要客户端进行操作的,是DN自己进行复制。
3、利用hadoop进行数据的统计分析
之前一直不了解怎么用hadoop进行数据分析,通过学习对该过程有了一定的了解,总结了一下主要包括一下几个步骤:将需要处理的数据上传到HDFS;创建类并在类中定义相关算法;将类打包上传到虚拟机中;通过定义的算法处理数据;查看处理结果。需要注意的是,这几个过程中数据的分块,数据块的分片是不需要人为进行控制的,该过程的核心是算法的定义,这个也是以后学习的重点。
4、对一些工具的简单学习和安装部署。
Hive作为管理和查询结构化/非结构化数据的数据仓库,使用HQL(Hive SQL)作为查询接口,使用HDFS作为底层存储,使用MR作为计算(执行)层。
Mahout作为一个工具包,涉及了许多机器学习的常用算法,比较有印象的是推荐引擎算法和聚类算法(老师主要讲了这两个算法),在推荐引擎算法中如何根据用户不同模型设计相应的推荐系统是关键;聚类算法主要针对K均值算法展开了介绍,对利用K均值进行聚类的原理有了了解,同时也运行了实例看到了聚类的结果。
HBase是一个分布式的、面向列的开源数据库,HDFS为HBase提供可靠存储支持,MR为HBase提供高性能计算能力,ZooKeeper提供稳定服务。数据库中的表被切分成小的数据单元即Region,每个HRegion对应表中的一个Region,HRegionServer管理了一系列HRegion对象,HRegion由多个HStore组成,每个HStore对应了表中的一个列簇的存储。
Sqoop是一个用来将Hadoop和关系型数据库中的数据相互转移的工具,可以将一个关系型数据库中的数据导入到HDFS中,也可以将HDFS中的数据导入到关系型数据库中。
Storm是一个实时流计算系统,Storm的主节点是Nimbus,从节点是Supervisor,Storm的实时处理数据被封装在topology中,一个topology是由一组Spout组件和Bolt组件通过Stream Groupings进行连接的。
Kafka作为分布式发布-订阅消息系统,使用磁盘做缓存,消息保存在磁盘上,可以保存大量的未处理信息。Kafka的组件主要有producer、broker和consumer。Broker作为Kafka的核心组件,是prodecer和consumer之间的桥梁。
Spark作为一种内存计算框架,比MR快10~100倍,代码量比MR少2~5倍。Spark的核心概念是RDD,由多个Partition构成,可以存储在磁盘或内存中。Spark程序设计流程为:创建Spark Context对象;创建RDD;在RDD上进行转换和action;返回结果。
简单学习完这些工具之后,我认为需要弄清楚以下两个问题:
第一,Hive和HBase都可以存储数据,那么它们的区别在哪里?
Hive中的表是事实表,对Hive中的表不能进行增、删、改,只能进行查操作;HBase中的表是事务表,HBase中的数据可以进行增删改查。同时,Hive可以从HBase中读取数据。
第二,从处理时延上说,Storm<Spark<Hadoop,那么为什么Hadoop还有存在的必要?
就Storm和Hadoop来讲,虽然Storm是一种流处理框架,能够实时的对数据进行处理,但这种实时性的框架不能处理复杂的算法。而Spark是基于MR算法实现的分布式计算,拥有MR所具有的优点,同时由于Spark是一种内存计算框架,计算速度比Hadoop要快,这些都是Spark优于Hadoop的体现,但需要注意的一点是Spark的计算基本是在内存中进行,对内存的要求就比较高,代价也会很多。所以在某些情况下,Hadoop还是最佳的计算框架。
5、对虚拟机中出现的一些错误的处理。
当在虚拟机中利用某种工具去处理问题时,当在该过程中出现了错误,要试着去该工具的安装目录下,找到logs这一目录,该目录下存放的是日志文件,打开日志文件查看错误警告,自己试着根据错误警告将问题解决。老师讲的这一方法感觉挺有用的,自己去找到问题的根源然后解决,印象会更加深刻。
二、今后学习方向
(1)一周的时间,学习的内容比较多,很多知识点只是有了一个大概的了解:知道是什么,怎么安装部署,但具体的操作就不太明确了。所以接下来的工作就是针对每一个知识点去展开进行学习,学习具体的操作过程,学习它们的应用实例。
(2)之前一直不太明白Hadoop和JAVA的交集在哪里,通过这次的学习知道了Hadoop是通过调用JAVA的API对数据进行相应的操作,也就是说在Hadoop的学习中对JAVA水平的要求也是比较高的。现在JAVA的水平还是比较低,所以今后也要抓紧对JAVA的学习,提高编程水平。
(3)对数据处理的核心是对算法的设计,而算法设计的好坏直接关系到系统的优化操作,所以我认为今后的学习重点应该是对算法的研究上。在这次学习过程中简单接触了推荐引擎算法和聚类算法,算是有了一个开始,以后应该多了解和算法相关的知识。