还剩13页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
的包括哪些信息1kafka message一个的由一个固定长度的和一个变长的消息体组成部Kafka Messageheader bodyheader份由一个字节的(文件格式)和四个字节的(用于判断消息体是否正常)构成magic CRC32body当的值为的时候,会在和之间多一个字节的数据保侑一些相关magic1magic crc32attributes属性,比如是否压缩、压缩格式等等);如果的值为(),那么不存在属性magic attributesbody是由个字节构成的一个消息体,包含了具体的消息N key/value、怎么查看的2kafka offset版本以上,可以用最新的客户端,有
0.9Consumer clientconsumer.seekToEnd/c onsumer.position()可以用于得到当前最新的offset、的过程3hadoop shuffle
一、端的Map shuffle端会处理输入数据并产生中间结果,这个中间结果会写到本地磁盘,而不是每Map HDFS一个的输出会先写到内存缓冲区中,当写入的数据达到设定的阈值时,系统将会启动一个Map线程将缓冲区的数据写到磁盘,这个过程叫做spil1在写入之前,会先进行二次排序,首先根据数据所属的进行排序,然后每一个spill partition中的数据再按来排序的目是将记录划分到不同的上去,以期望partition keypartition Reducer能够达到负载均衡,以后的就会根据来读取自己对应的数据接着运行Reducer partitioncombiner(如果设置了的话),的本质也是一个其目的是对将要写入到combiner Reducer,磁盘上的文件先进行一次处理,这样,写入到磁盘的数据量就会减少最后心跳时间mapreduce.jobtracker.heartbeat.interval.min集群每增加多少节点,时间增加下面的值集群每增加之面的个数,心跳增多少、启动c带外心跳默认是inapreduce.tasktracker.outofband.heartbeat false、配置多块磁盘dmapreduce.local.dir、配置数目e RPChander叩默认是可以改成根据机器的能力m1,5,、配置线程数目f HTTP默认是可以改成根据机器的能力40,100选择合适的压缩方式,以为例gsnappypropertynamemapredpress.map.output/namevaluetrue/value/propertypropertynamemapred.map.outputpression.codec/namevalueorg.apache.hadoop.iopress.SnappyCodec/value/property、设计题17)采集产生的日志,日志的格式为每天产生的文件的数据量上1nginx userip timeurl htmlld亿条,请设计方案把数据保存到上,并提供一下实时查询的功能(响应时间小于)HDFS3s、某个用户某天访问某个的次数A URL、某个某天被访问的总次数B URL实时思路是使用报表展示平台Logstash+Kafka+Spark-streaming+Redis+离线的思路是关系型数据库、、数据Logstash+Kafka+Elasticsearch+Spark-streaming+A B在进入到中进行过滤,把符合要求的数据保存到中Spark-streaming Redis、有个文件,每一个文件每一个文件的每一行存放的都是用户的每一个文件的18101G,query,都可能重复要求你按照的频度排序还是典型的算法,解决方案如下query queryTOP K)方案11顺序读取个文件,按照()的结果将写入到此外个文件(记为)10hash query%10query10中这样新生成的文件每一个的大小大约也(假设函数是随机的)找一台内存在1G hash2G摆布的机器,挨次对用()来统计每一个浮现的次数利用hash_map query,query_count query快速/堆/归并排序按照浮现次数进行排序将排序好的和对应的输出到文件中query query_cout这样得到了个排好序的文件(记为)对这个文件进行归并排序(内排序与外排序相结110合))方案22普通的总量是有限的,只是重复的次数比较多而已,可能对于所有的query query,一次性就可以加入到内存了这样,我们就可以采用树等直接来统计每trie/hash_map个浮现的次数,然后按浮现次数做快速/堆/归并排序就可以了query)方案33与方案类似,但在做完分成多个文件后,可以交给多个文件来处理,采用分布式的1hash,架构来处理(比如)最后再进行合并MapReduce,、在亿个整数中找出不重复的整数,注,内存不足以容纳这亿个整数
192.
52.5)方案采用(每一个数分配()表示不存在,()表示浮现一次,()112-Bitmap2bit,011表示多次,无意义)进行,共需内存八内存,还可以接受然后扫描这亿11232*2bit=l GB
2.5个整数,查看叩中相对应位,如果是变变保持不变所描完事后,查Bitm01,0110,1看把对应位是的整数输出即可bitmap,01)方案也可采用与第题类似的方法,进行划分小文件的方法然后在小文件中找出不221重复的整数,并排序然后再进行归并,注意去除重复的元素、腾讯面试题给亿个不重复的的整数,没排过序的,然后再给一个数,如何2040unsignedint快速判断这个数是否在那亿个数之中?40)方案申请的内存,一个位代表一个值读入亿个数,设11oo,512M bitunsigned int40置相应的位,读入要查询的数,查看相应位是否为为表示存在,为表示不存在bit bit1,1)方案这个问题在《编程珠矶》里有很好的描述,大家可以参考下面的思路,探讨22一下又因为八为亿多,所以给定一个数可能在,也可能不在其中;这里我们把()232404亿个数中的每一个用位的二进制来表示,假设这亿个数开始放在一个文件中3240然后将这亿个数分成两类
40.最高位为
1.最高位为21并将这两类分别写入到两个文件中,其中一个文件中数的个数<亿,而另一个>二=2020亿(这相当于折半了);与要查找的数的最高位比较并接着进入相应的文件再查找再然后把这个文件为又分成两类.次最高位为
10.次最高位为21并将这两类分别写入到两个文件中,其中一个文件中数的个数<亿,而另一个〉==101亿(这相当于折半了);与要查找的数的次最高位比较并接着进入相应的文件再查找以此类推,就可以找到了,而且时间复杂度为()方案完O logn,2)附这里,再简单介绍下,位图方法使用位图法判断整形数组是否存在重复,判断集合中3存在重复是常见编程任务之一,当集合中数据量比较大时我们通常希翼少进行几次扫描,这时双重循环法就不可取了位图法比较适合于这种情况,它的做法是按照集合中最大元素创建一个长度为max max+l的新数组,然后再次扫描原数组,遇到几就给新数组的第几位置上如遇到就给新数组的第1,5六个元素置这样下次再遇到想置位时发现新数组的第六个元素已是了,这说明这次的数据1,51肯定和以前的数据存在着重复这种给新数组初始化时置零其后置一的做法类似于位图的处理方法故称位图法它的运算次数最坏的情况为如果已知数组的最大值即能事先给新数组定2N长的话效率还能提高一倍、怎么在海量数据中找出重复次数最多的一个?21)方案先做然后求模映射为小文件,求出每一个小文件中重复次数最多的一个,并11hash,记录重复次数然后找出上一步求出的数据中重复次数最多的一个就是所求(具体参考前面的题)、上千万或者上亿数据(有重复),统计其中浮现次数最多的钱个数据22N)方案上千万或者上亿的数据,现在的机器的内存应该能存下所以考虑采用11hash_map/搜索二叉树/红黑树等来进行统计次数然后就是取出前个浮现次数最多的数据了,可以用第N题提到的堆机制完成
2、一个文本文件,大约有一万行,每行一个词,要求统计出其中最频繁浮现的前个词,给2310出思想,给出时间复杂度分析)方案这题是考虑时间效率用树统计每一个词浮现的次数,时间复杂度是()11trie O n*le(表示单词的平准长度)然后是找出浮现最频繁的前个词,可以用堆来实现,前面的题le10中已经讲到了,时间复杂度是()所以总的时间复杂度,是()与()O n*lgl0On*le On*lgl0中较大的哪一个、个数中找出最大的个数24100w100)方案在前面的题中,我们已经提到了,用一个含个元素的最小堆完成复杂度为111000()100w*lgl00)方案采用快速排序的思想,每次分割之后只考虑比轴大的一部份,知道比轴大的22一部份在比多的时候,采用传统排序算法排序,取前个复杂度为100100Olw*l0o方案采用局部淘汰法选取前个元素,并排序,记为序列然后一次扫描剩余的331L元素与排好序的个元素中最小的元素比,如果比这个最小的要大,那么把这个最小的元x,10素删除,并把利用插入排序的思想,插入到序列中挨次循环,直到扫描了所有的元素x L复杂度为0100w*
100、有一千万条短信,有重复,以文本文件的形式保存,一行一条,有重复请用分钟时间,255找出重复浮现最多的前条1分析常规方法是先排序,在遍历一次,找出重复最多的前条但是排序的算法复杂度110最低为nlgno可以设计一个挨次读取一千万条短信,加载至2hash_table,hash_mapstring,int,U hash_table表中,并且统计重复的次数,与此同时维护一张最多条的短信表这样遍历1一次就能找出最多的前条,算法复杂度为10On将数据写到本地磁盘产生文件(文件保存在指}定的目录中,任spill spill Map务结束后就会被删除)最后,每一个叩任务可能产生多个文件,在每一个任务完成前,会通过多路归M spillMap并算法将这些文件归并成一个文件至此,的过程就结束了spillMapshuffle
二、端的Reduce shuffle端的主要包括三个阶段,()和Reduce shufflecopysort mergereduce首先要将即端产生的输出文件拷贝到端,但每一个如何知道自己应该M Reduce Reducer处理哪些数据呢?因为叩端进行的时候,实际上就相当于指定了每一个要M partition Reducer处理的数据(就对应了)所以在拷贝数据的时候只需拷贝与自己对应partition Reducer,Reducer的中的数据即可每一个会处理一个或者多个但需要先将自己对应的partitionReducerpartition,中的数据从每一个的输出结果中拷贝过来partition Map接下来就是阶段,也成为阶段,因为这个阶段的主要工作是执行了归并排序sort merge从叩端拷贝到端的数据都是有序的,所以很适合归并排序最终在端生成一M ReduceReduce个较大的文件作为的输入Reduce最后就是过程了,在这个过程中产生了最终的输出结果,并将其写到上Reduce HDFS、集群运算的模式4spark有不少种模式,最简单就是单机本地模式,还有单机伪分布式模式,复杂的则运行Spark在集群中,目前能很好的运行在和中,固然还有自带的模式,对于Yarn MesosSpark Standalone大多数情况模式就足够了,如果企业已经有或者Standalone YarnMes os环境,也是很方便部署的(集群模式)典型的模式,无非也能看出是有单点故障的;支standalone Mater/slave MasterSpark持来实现ZooKeeper HA(集群模式)运行在资源管理器框架之上,由负责资源管理,负责任务on yarn yarnyarnSpark调度和计算(集群模式)运行在资源管理器框架之上,由负责资源管理,负责on mesos mesosmesosSpark任务调度和计算(集群模式)比如的使用这个模式能很方便的访问的支on cloudAWS EC2,Amazon S3;Spark持多种分布式存储系统和HDFS S
3、读写数据的过程5HDFS读>跟通信查询元数据,找到文件块所在的服务器1namenode datanode、挑选一台(就近原则,然后随机)服务器,请求建立流2datanode socket、开始发送数据(从磁盘里面读取数据放入流,以为单位来做校验)3datanode packet、客户端以为单位接收,现在本地缓存,然后写入目标文件4packet写、根通信请求上传文件,检查目标文件是否已存在,父目录是否1namenode namenode存在、返回是否可以上传、请求第一个该传输到哪些服务器上2namenode3client blockdatanode、返回个月艮务器4namenode3datanode ABC、请求台中的一台上传数据(本质上是一个调用,建立)收到请5client3dn ARPC pipeline,A求会继续调用然后调用将真个建立完成,逐级返回客户端、开始往上B,B C,pipeline6client A传第一个(先从磁盘读取数据放到一个本地内存缓存),以为单位,block packetA收到一个就会传给传给;每传一个会放入一个应答队列等待应答packet B,B CA packet、当一个传输完成之后,再次请求上传第二个的服务器7block clientnamenode block、中与哪个性能好,为什么6RDD reduceBykeygroupByKey会在结果发送至之前会对每一个在本地进行reduceByKey reduceByKey reducer mapper有点类似于在中的这样做的好处在于,在端进行一次merge,MapReduce combinermap reduce之后,数据量会大幅度减小,从而减小传输,保证端能够更快的进行结果计算reduce会对每一个中的值进行聚合形成一个序列groupByKey groupByKeyRDD value()此操作发生在端,所以势必会将所有的数据通过网络进行传输,造成不必要的Iterator,reduce浪费同时如果数据量十分大,可能还会造成OutOfMemoryError通过以上对照可以发现在进行大量数据的操作时候建议使用不仅可以提高reduce reduceByKey速度,还是可以防止使用造成的内存溢出问题groupByKey、的了解7sparkZO更简单与更合理的ANSI SQLAPI速度更快用作为编译器Spark更智能Structured Streaming、怎么分区宽依赖和窄依赖8rdd宽依赖父的分区被子的多个分区使用例如、RDD RDDgroupByKey reduceByKeysortByKey等操作会产生宽依赖,会产生shuffle窄依赖父的每一个分区都只被子的一个分区使用例如、等操作会RDD RDDmap filterunion产生窄依赖、读取数据的两种方式9spark streamingkafka这两种方式分别是Receiver-base使用的高层次来实现从中获取的数据都存储在Kafka ConsumerAPI receiverKafka SparkExecutor的内存中,然后启动的会去处理那些数据然而,在默认的配置下,这种方Spark Streamingjob式可能会因为底层的失败而丢失数据如果要启用高可靠机制,让数据零丢失,就必须启用Spark的预写日志机制该机制会同步地将接收到的数据写Streaming WriteAhead Log,WAL Katka入分布式文件系统比如上的预写日志中所以,即使底层节点浮现了失败,也可以使用HDFS预写日志中的数据进行恢复Direct中引入方式,用来替代掉使用接收数据,这种方式会周期性地查询Spark
1.3Direct Receiver,获得每一个的最新的从而定义每一个的的范围当处理Kafka topic+partition offset,batch offset数据的启动时,就会使用的简单来获取指定范围的数据job Kafkaconsumer apiKafka offset、的数据存在内存还是磁盘10kafka最核心的思想是使用磁盘,而不是使用内存,可能所有人都会认为,内存的速度一定比磁Kafka盘快,我也不例外在看了的设计思想,查阅了相应资料再加之自己的测试后,发现磁Kaflca盘的顺序读写速度和内存持平而且对于磁盘的读写优化也比较多,包括和磁盘缓存等如果在Linux read-ahead write-behind,内存做这些操作的时候,一个是对象的内存开消很大,另一个是随着堆内存数据的增多,JAVA的时间会变得很长,使用磁盘操作有以下几个好处JAVA GC磁盘缓存由系统维护,减少了程序员的不少工作Linux磁盘顺序读写速度超过内存随机读写的效率低,内存占用大使用磁盘可以避免这一问题JVM GC系统冷启动后,磁盘缓存依然可用、怎么解决的数据丢失11kaflca端producer宏观上看保证数据的可靠安全性,肯定是依据分区数做好数据备份,设立副本数端broker设置多分区,分区自适应所在机器,为了让各分区均匀分布在所在的中,分区数要topic broker大于数broker分区是进行并行读写的单位,是提升速度的关键kafka kaflca端Consumer端丢失消息的情形比较简单如果在消息处理完成前就提交了那末就有可能造consumer ffset,成数据的丢失由于出默认是自动提交位移的,所以在后台提交位移前一定要保Ka aconsumer证消息被正常处理了,因此不建议采用很重的处理逻辑,如果处理耗时很长,则建议把逻辑放到另一个线程中去做为了避免数据丢失,现给出两点建议关闭自动提交位enable.automit=false移在消息被完整处理之后再手动提交位移、和的区别12fsimage edit大家都知道与的关系,当他们要进行数据同步时叫namenode secondarynamenode做时就用到了与是保存最新的元数据的信息,当数据到checkpoint fsimageedit,fsimage fsimage一定的大小事会去生成一个新的文件来保存元数据的信息,这个新的文件就是会回滚最edit,edit新的数据、列举几个配置文件优化?13文件的优化1Core-site.xml、默认值;说明这个是开启文件删除自动转移到垃圾箱的选项,a fs.trash.interv,al0hdfs值为垃圾箱文件清除时间普通开启这个会比较好,以防错误删除重要文件单位是分钟、默认值;说明系统里启动的任务线程数,这里b dfs.namenode.handler.count,1hadoop改为,同样可以尝试该值大小对效率的影响变化进行最合适的值的设定
4、默认值;说明和是通过进行数c mapreduce.tasktracker.http.threads,40map reducehttp据传输的,这个是设置传输的并行线程数首次加入的时候,如果报告不兼容文件版本,那需要执行格14datanode clusterlog namenode式化操作,这样处理的原因是?)这样处理是不合理的,因为那末格式化操作,是对文件系统进行格式化,1namenode namenode格式化时清空下空两个目录下的所有文件,之后,会在目录下仓建文件dfs/name U)文本不兼容,有可能时与的数据里的、不一致,2namenode datanodenamespacelD clusterlD找到两个位置,修改为一样即可解决ID、叩中排序发生在哪几个阶段?这些排序是否可以避免?为什么?15M Reduce)一个作业由阶段和阶段两部份组成,这两阶段会对数据排序,从1MapReduce Map Reduce这个意义上说,框架本质就是一个MapReduce DistributedSort)在叩阶段,叩会在本地磁盘输出一个按照排序(采用的是快速排序)的文2M M Task key件(中间可能产生多个文件,但最终会合并成一个),在阶段,每一个会对ReduceReduce Task收到的数据排序,这样,数据便按照分成为了若干组,之后以组为单位交给()处理Keyreduce)不少人的误解在阶段,如果不使用便不会排序,这是错误的,不管你用不3Map Combiner用叩均会对产生的数据排序(如果没有则不会排序,实际上Combiner,MTaskReduceTask,阶段的排序就是为了减轻端排序负载)MapReduce)由于这些排序是自动完成的,用户无法控制,因此,在中4MapReduce hadoopl.x无法避免,也不可以关闭,但是可以关闭的hadoop
2.x、的优化16hadoop)优化的思路可以从配置文件和系统以及代码的设计思路来优化1)配置文件的优化调节适当的参数,在调参数时要进行测试2)代码的优化的个数尽量与的个数相同,数据的类型保持一致,可以减少3combiner reduce拆包与封包的进度)系统的优化可以设置系统打开最大的文件数估计网络的带宽的配置4linux MTU)为添加一个可以大大的减少阶段的拷贝过来给远程的5job Combiner,shuffer maoTaskreduce的数据量,普通而言与相同task combinerreduce)在开辟中尽量使用而不是的模式是的,如果对它进行修6stringBuffer string,string read-only改,会产生暂时的对象,二是可修改的,不会产生暂时对象stringBuffer)修改一下配置以下是修改文件7mapred-site.xml、修改最大槽位数槽位数是在各个上的上设置的,默认都是a tasktrackermapred-site.xml2propertynamemapred.tasktracker.map.tasks.maximum/namevalue2/value/propertypropertynamemapred.tasktracker.reduce.tasks.maximum/namevalue2/value/property、调整心跳间隔集群规模小于时,心跳间隔为毫秒b300300。