想起名字为“hadoop保姆即教程”的,想了想自己不能误人子弟,还是算了。。。。

马上要开学了,没敢忘记我们还有暑假任务:学习hadoop并记录学习笔记。

为了证明我hadoop入门了,就口胡一下我对hadoop的认识。


一切从sqL开始说起。人们为了相对于较工作表能更好地存数据,找数据发明了sql,sql有三个特点。 由mysql进行数据的存储,实现了物理存储与逻辑存储低耦合,逻辑存储与展示低耦合(数据物理存储位置改变,表数据不会变;表数据增加或减少一行,展示在页面上的数据也可能不会变)。通过sql语句保证了数据查询的便利性 ,而且通过“锁”的机制保证了多个客户端查询的不冲突

但是,相对于数据量大的任务,比如google,baidu搜索,动不动上百万条数据,mysql便一愁莫展,力所不及。随着google三篇论文的出世,人们便想到可以利用并行执行任务减少处理时间,十个人板砖总比一个人板砖快嘛。最终hadoop出世。和sql一样,hadoop也有三个特点* 。先说存储数据, hadoop处理GB、TB级的数据还是没什么问题的,人家是几台电脑并行工作,通过HDFS实现数据的存储,当然数据可能存在不同的电脑上。对于数据的查询,人家也是并行查询,用mapreduce,把一个任务分成几块任务同时进行,再最后reduce合成一下。至于保证多个任务不冲突,由一个叫Yarn的模块控制,就是先划分多个队列,进来由n个客户端进来的任务,对每个任务划分到一个队列。这样可以每个队列执行一个任务,保证效率。

hadoop写代码不方便?写个类似sql查询功能的程序得至少写三个文件(mapper,reducer,driver),没问题,Hive是建立在hadoop上的一个软件,可以用类似sql的查询语句代替这三个文件,这不就跟sql差不多了?

好像还得学spark,用来取代mapreduce模块。原因是mapreduce是基于磁盘的,reduce阶段从磁盘拉取到内存太慢,而spark是基于内存的。同一个任务,spark所花的时间能达到MR所花的时间的三分之一。


所以,举个例子,口胡一下hadoop怎么工作的。

  • 假如未来工作的时候BOSS给了我们一个任务:给我们一个4MB的 data.txt文件,和一系列条件A,B,C(可能是性别,年龄啊等等)。让我们把最终的结果导进mysql或者txt文件中。

    • 把数据导进mysql,写java程序,用sql语句查询并导出到mysql或者txt文件
  • 现在BOSS的任务变了,文件大小从4MB增长到4GB(mysql根本存不下),正好你们公司又有个hadoop集群,BOSS准许你用它。

    • 把数据存进HDFS,写java程序,用Hive的HQL语句或者自己写mapreduce接口查询,结果写进Hive绑定的数据库或者写到单独的文件里。

接下来就是细节了,hadoop工作的细节。

先说一下前提,任务还是上面4G的数据的任务,给你hadoop集群的规格:三台服务器,每台服务器CentOS系统,4G内存,4cpu。

它是这么工作的:首先我通过我的电脑用远程连接连接到服务器,再向hdfs上传输4G的数据,hdfs是个文件存储系统,它对数据进行切分,128MB一块,一共分成32块,每块存放在这三台服务器的任何一台。接下来我写java程序,打包传输到服务器,在服务器上运行,yarn会根据我的任务所需要的资源给我分配到一个队列上(可能某条队列上正好有王五的任务在运行,我李四和他各走各的,不冲突),并给我分配一个ApplicationMaster管理我这个任务的进行。假设我写的reduce阶段只要求输出一个文件,于是hadoop给我分配32+1+1=34个容器,也就是4G多的内存。mapper容器32个。(这34个容器每个容器是一个线程,32>4(cpu数)*3(服务器数),不知道会不会把hadoop集群干瘫痪。)reduce阶段完成后,我想要的结果便会输出到一个文件夹或者服务器内置的mysql中(假设Hive连的是mysql)。然后我再把结果开心地下载下来就行了。


最后是hadoop的学习,我的建议是分四步:hadoop结构+虚拟机环境准备+集群搭建+java代码使用

  • hadoop结构这里没得说的,就是知道其三个组成:HDFS,Yarn,MapReduce是干什么的就行了

  • 虚拟机环境准备的话,需要装linux系统,设置虚拟机IP,装hadoop软件和javaJDK并配置环境变量

  • 集群搭建最重要,虚拟机上围绕着hdfs-site.xml,mapred-set.xml,yarn-site.xml,core-site.xml四个自定义配置文件搞。自己电脑上要装xshell,xftp并会用。搭建完成的标志是hdfs的9870端口,mapreduce的8088端口,历史服务器的19888端口,java连接集群用的8020端口全部打开

  • java代码使用的话,要会写mapper,reducer,driver类,会写序列化bean

上面是大的方向,最核心的还是弄懂hadoop三大组件的运行原理。

版权声明:本文为2436eded1a677650原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/zhuangzhongxu/p/16625872.html