本文将大数据学习门槛降到了地平线
Hadoop介绍 Hadoop-大数据开源世界的亚当夏娃。核心是HDFS数据存储系统,和MapReduce分布式计算框架。 HDFS 原理是把大块数据切碎,每个碎块复制三份,分开放在三个廉价机上,一直保持有三块可用的数据互为备份。使用的时候只从其中一个备份读出来,这个碎块数据就有了。存数据的叫datenode(格子间),管理datenode的叫namenode(执伞人)。 MapReduce 原理是大任务先分堆处理-Map,再汇总处理结果-Reduce。分和汇是多台服务器并行进行,才能体现集群的威力。难度在于如何把任务拆解成符合MapReduce模型的分和汇,以及中间过程的输入输出<k,v> 都是什么。 单机版Hadoop介绍 对于学习hadoop原理和hadoop开发的人来说,搭建一套hadoop系统是必须的。但 配置该系统是非常头疼的,很多人配置过程就放弃了。 没有服务器供你使用 这里介绍一种免配置的单机版hadoop安装使用方法,可以简单快速的跑一跑hadoop例子辅助学习、开发和测试。要求笔记本上装了Linux虚拟机,虚拟机上装了docker。 安装 使用docker下载sequenceiq/hadoop-docker:2.7.0镜像并运行。 [root@bogon~]#dockerpullsequenceiq/hadoop-docker:2.7.02.7.0:Pullingfromsequenceiq/hadoop-docker860d0823bcab:Pullingfslayere592c61b2522:Pullingfslayer 下载成功输出 Digest:sha256:a40761746eca036fee6aafdf9fdbd6878ac3dd9a7cd83c0f3f5d8a0e6350c76aStatus:Downloadednewerimageforsequenceiq/hadoop-docker:2.7.0 启动 [root@bogon~]#dockerrun-itsequenceiq/hadoop-docker:2.7.0/etc/bootstrap.sh-bash--privileged=trueStartingsshd:[OK]Startingnamenodeson[b7a42f79339c]b7a42f79339c:startingnamenode,loggingto/usr/local/hadoop/logs/hadoop-root-namenode-b7a42f79339c.outlocalhost:startingdatanode,loggingto/usr/local/hadoop/logs/hadoop-root-datanode-b7a42f79339c.outStartingsecondarynamenodes[0.0.0.0]0.0.0.0:startingsecondarynamenode,loggingto/usr/local/hadoop/logs/hadoop-root-secondarynamenode-b7a42f79339c.outstartingyarndaemonsstartingresourcemanager,loggingto/usr/local/hadoop/logs/yarn--resourcemanager-b7a42f79339c.outlocalhost:startingnodemanager,loggingto/usr/local/hadoop/logs/yarn-root-nodemanager-b7a42f79339c.out 启动成功后命令行shell会自动进入Hadoop的容器环境,不需要执行docker exec。在容器环境进入/usr/local/hadoop/sbin,执行./start-all.sh和./mr-jobhistory-daemon.sh start historyserver,如下 bash-4.1#cd/usr/local/hadoop/sbinbash-4.1#./start-all.shThisscriptisDeprecated.Insteadusestart-dfs.shandstart-yarn.shStartingnamenodeson[b7a42f79339c]b7a42f79339c:namenoderunningasprocess128.Stopitfirst.localhost:datanoderunningasprocess219.Stopitfirst.Startingsecondarynamenodes[0.0.0.0]0.0.0.0:secondarynamenoderunningasprocess402.Stopitfirst.startingyarndaemonsresourcemanagerrunningasprocess547.Stopitfirst.localhost:nodemanagerrunningasprocess641.Stopitfirst.bash-4.1#./mr-jobhistory-daemon.shstarthistoryserverchown:missingoperandafter`/usr/local/hadoop/logs'Try`chown--help'formoreinformation.startinghistoryserver,loggingto/usr/local/hadoop/logs/mapred--historyserver-b7a42f79339c.out Hadoop启动完成,如此简单。 要问分布式部署有多麻烦,数数光配置文件就有多少个吧!我亲眼见过一个hadoop老鸟,因为新换的服务器hostname主机名带横线“-”,配了一上午,环境硬是没起来。 运行自带的例子 回到Hadoop主目录,运行示例程序 bash-4.1#cd/usr/local/hadoopbash-4.1#bin/hadoopjarshare/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.0.jargrepinputoutput'dfs[a-z.]+'20/07/0522:34:41INFOclient.RMProxy:ConnectingtoResourceManagerat/0.0.0.0:803220/07/0522:34:43INFOinput.FileInputFormat:Totalinputpathstoprocess:3120/07/0522:34:43INFOmapreduce.JobSubmitter:numberofsplits:3120/07/0522:34:44INFOmapreduce.JobSubmitter:Submittingtokensforjob:job_1594002714328_000120/07/0522:34:44INFOimpl.YarnClientImpl:Submittedapplicationapplication_1594002714328_000120/07/0522:34:45INFOmapreduce.Job:Theurltotrackthejob:http://b7a42f79339c:8088/proxy/application_1594002714328_0001/20/07/0522:34:45INFOmapreduce.Job:Runningjob:job_1594002714328_000120/07/0522:35:04INFOmapreduce.Job:Jobjob_1594002714328_0001runninginubermode:false20/07/0522:35:04INFOmapreduce.Job:map0%reduce0%20/07/0522:37:59INFOmapreduce.Job:map11%reduce0%20/07/0522:38:05INFOmapreduce.Job:map12%reduce0% mapreduce计算完成,有如下输出 20/07/0522:55:26INFOmapreduce.Job:Counters:49FileSystemCountersFILE:Numberofbytesread=291FILE:Numberofbyteswritten=230541FILE:Numberofreadoperations=0FILE:Numberoflargereadoperations=0FILE:Numberofwriteoperations=0HDFS:Numberofbytesread=569HDFS:Numberofbyteswritten=197HDFS:Numberofreadoperations=7HDFS:Numberoflargereadoperations=0HDFS:Numberofwriteoperations=2JobCountersLaunchedmaptasks=1Launchedreducetasks=1Data-localmaptasks=1Totaltimespentbyallmapsinoccupiedslots(ms)=5929Totaltimespentbyallreducesinoccupiedslots(ms)=8545Totaltimespentbyallmaptasks(ms)=5929Totaltimespentbyallreducetasks(ms)=8545Totalvcore-secondstakenbyallmaptasks=5929Totalvcore-secondstakenbyallreducetasks=8545Totalmegabyte-secondstakenbyallmaptasks=6071296Totalmegabyte-secondstakenbyallreducetasks=8750080Map-ReduceFrameworkMapinputrecords=11Mapoutputrecords=11Mapoutputbytes=263Mapoutputmaterializedbytes=291Inputsplitbytes=132Combineinputrecords=0Combineoutputrecords=0Reduceinputgroups=5Reduceshufflebytes=291Reduceinputrecords=11Reduceoutputrecords=11SpilledRecords=22ShuffledMaps=1FailedShuffles=0MergedMapoutputs=1GCtimeelapsed(ms)=159CPUtimespent(ms)=1280Physicalmemory(bytes)snapshot=303452160Virtualmemory(bytes)snapshot=1291390976Totalcommittedheapusage(bytes)=136450048ShuffleErrorsBAD_ID=0CONNECTION=0IO_ERROR=0WRONG_LENGTH=0WRONG_MAP=0WRONG_REDUCE=0FileInputFormatCountersBytesRead=437FileOutputFormatCountersBytesWritten=197 hdfs命令查看输出结果 bash-4.1#bin/hdfsdfs-catoutput/*6dfs.audit.logger4dfs.class3dfs.server.namenode.2dfs.period2dfs.audit.log.maxfilesize2dfs.audit.log.maxbackupindex1dfsmetrics.log1dfsadmin1dfs.servers1dfs.replication1dfs.file 例子讲解 grep是一个在输入中计算正则表达式匹配的mapreduce程序,筛选出符合正则的字符串以及出现次数。 shell的grep结果会显示完整的一行,这个命令只显示行中匹配的那个字符串 grepinputoutput'dfs[a-z.]+' 正则表达式dfs[a-z.]+,表示字符串要以dfs开头,后面是小写字母或者换行符\n之外的任意单个字符都可以,数量一个或者多个。输入是input里的所有文件, bash-4.1#ls-lrttotal48-rw-r--r--.1rootroot690May162015yarn-site.xml-rw-r--r--.1rootroot5511May162015kms-site.xml-rw-r--r--.1rootroot3518May162015kms-acls.xml-rw-r--r--.1rootroot620May162015httpfs-site.xml-rw-r--r--.1rootroot775May162015hdfs-site.xml-rw-r--r--.1rootroot9683May162015hadoop-policy.xml-rw-r--r--.1rootroot774May162015core-site.xml-rw-r--r--.1rootroot4436May162015capacity-scheduler.xml 结果输出到output。计算流程如下 稍有不同的是这里有两次reduce,第二次reduce就是把结果按照出现次数排个序。map和reduce流程开发者自己随意组合,只要各流程的输入输出能衔接上就行。 管理系统介绍 Hadoop提供了web界面的管理系统, 端口号 用途 50070 Hadoop Namenode UI端口 50075 Hadoop Datanode UI端口 50090 Hadoop SecondaryNamenode 端口 50030 JobTracker监控端口 50060 TaskTrackers端口 8088 Yarn任务监控端口 60010 Hbase HMaster监控UI端口 60030 Hbase HRegionServer端口 8080 Spark监控UI端口 4040 Spark任务UI端口 加命令参数 docker run命令要加入参数,才能访问UI管理页面 dockerrun-it-p50070:50070-p8088:8088-p50075:50075sequenceiq/hadoop-docker:2.7.0/etc/bootstrap.sh-bash--privileged=true 执行这条命令后在宿主机浏览器就可以查看系统了,当然如果Linux有浏览器也可以查看。我的Linux没有图形界面,所以在宿主机查看。 50070 Hadoop Namenode UI端口 50075 Hadoop Datanode UI端口 8088 Yarn任务监控端口 已完成和正在运行的mapreduce任务都可以在8088里查看,上图有gerp和wordcount两个任务。 一些问题 一、./sbin/mr-jobhistory-daemon.sh start historyserver必须执行,否则运行任务过程中会报 20/06/2921:18:49INFOipc.Client:Retryingconnecttoserver:0.0.0.0/0.0.0.0:10020.Alreadytried9time(s);retrypolicyisRetryUpToMaximumCountWithFixedSleep(maxRetries=10,sleepTime=1000MILLISECONDS)java.io.IOException:java.net.ConnectException:CallFrom87a4217b9f8a/172.17.0.1to0.0.0.0:10020failedonconnectionexception:java.net.ConnectException:Connectionrefused;Formoredetailssee:http://wiki.apache.org/hadoop/ConnectionRefused 二、./start-all.sh必须执行否则报形如 Unknown Job job_1592960164748_0001错误 三、docker run命令后面必须加--privileged=true,否则运行任务过程中会报java.io.IOException: Job status not available 四、注意,Hadoop 默认不会覆盖结果文件,因此再次运行上面实例会提示出错,需要先将 ./output 删除。或者换成output01试试? 总结 本文方法可以低成本的完成Hadoop的安装配置,对于学习理解和开发测试都有帮助的。如果开发自己的Hadoop程序,需要将程序打jar包上传到share/hadoop/mapreduce/目录,执行 bin/hadoopjarshare/hadoop/mapreduce/yourtest.jar 来运行程序观察效果。 本文分享自微信公众号 - MySQL从删库到跑路(cskdpl)。如有侵权,请联系 support@oschina.cn 删除。本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。