大数据技术基础及应用教程(Linux+Hadoop+Spark) 习题答案.docx
大数据技术基础及应用教程(LinUX+Hadoop+Spark)习题答案第1章练习一、选择题1 .大数据的特点有哪些?(多选)(AB)A.处理速度快B.多样化C.价值密度高D.数据冗余度低2 .下面哪些是大数据的计算模式?(多选)(ABCD)A.流式计算B.批处理计算C.查询分析计算D.图计算3 .Linux支持多少位硬件?(多选)(AC)A.64位B.128位C.32位D.256位4 .Hadoop生态系统的主要组成不包括?(B)A-MapRcduceB-ZooKcepcrC.HDFS文件系统D.YARN二、判断题1. 大数据是指数据量很大的数据集。(X)2. Hadoop是在分布式服务器集群上存储海量数据并运行分布式分析应用的一个开源的软件框架。(J)3. Hadoop只能运行在由一般商用机器构成的大型集群上。(X)4. Hadoop通过增加集群节点,可以线性地扩展以处理更大的数据集。(J)三、简答题1 .简述大数据技术的特点。答:VOkIme(大体量):即可从数百TB到数十数百PB、甚至EB规模。Variety(多样性):即大数据包括各种格式和形态的数据。Vek)City(时效性):即很多大数据需要在一定的时间限度下得到及时处理。Veraeity(准确性):即处理的结果要保证一定的准确性。Value(大价值):即大数据包含很多深度的价值,大数据分析挖掘和利用带来巨大的商业价值。2 .简要介绍几种Hadoop系统的组件及其作用。答:HDFS:HadooP分布式文件系统,具有处理超大数据、流式处理、可以运行在廉价商用服务器上等优点。HDFS在访问应用程序数据时,可以具有很高的吞吐率,因此对于超大数据集的应用程序而言,选择HDFS作为底层数据存储是较好的选择。HBase:相当于关系型数据库,数据放在文件中,而文件放在HDFS中。因此,HBase是基于HDFS的关系型数据库。MapRcduce:是一种编程模型,用于大规模数据集(大于ITB)的并行运算,它将复杂的、运行于大规模集群上的并行计算过程高度抽象到了两个函数一一MaP和Reduce±,并且允许用户在不了解分布式系统底层细节的情况下开发并行应用程序,并将其运行于廉价的计算机集群上,从而完成海量数据的处理。ZooKeeper是针对谷歌Chubby的一个开源实现,是高效和可靠的协同工作系统,提供分布式锁之类的基本服务,用于构建分布式应用,减轻分布式应用程序所承担的协调任务。第2章练习一、选择题1.下列哪项不包括在大数据的分析流程中?(八)A.数据校验B.数据集成C.数据规约D.数据挖掘3 .大数据分析的常用方法有哪些?(多选)(ABCD)A.K-meansB.线性回归C.分类分析D.数理统计4 .下列哪项不是数据可视化的工具?(D)A.SupersetB.MatplotlibC.PychartsD.selenium二、判断题1.大数据分析包括数据采集、预处理、存储、分析和可视化。(J)5 .selenium是大数据清洗过程中用到的主要工具。(×)3.常用的聚类分析法有决策树、神经网络、贝叶斯分类、SVMo(X)三、筒答IS1 .用自己的语言描述大数据分析的流程。答:大数据分析的一般流程,分为数据采集、数据预处理、数据存储、数据建模与分析、数据可视化这几个阶段。首先通过传感器数据、社交网络数据等获得各种类型的结构化、半结构化及非结构化的海量数据:对数据进行提取、转换、加载,最终挖掘数据的潜在价值;把采集到的数据都存储起来,建立相应的数据库,进行管理和调用;通过已有数据的统计分析技术和未知数据的挖掘技术,从海量的数据中提取有用的知识;最终将大数据分析与预测结果以计算机图形或图像的方式展示给用户。2 .说出数据分析过程中各阶段所用到的几种工具。答:数据采集工具SeIeniUm和PhantomJS;数据清洗工具Kettle;数据存储工具MongoDB和MySQL;机器学习工具Scikit-Iearn;数据可视化工具MatPIoUib、PyEChaits、Superseto第3章练习一、选择题1 .观察系统动态进程的命令是(B)A.freeB.topCJastcommD.df2 .系统中某文件的组外权限是只读、属主权限是全部、组内权限是可读可写,那么该文件权限为(D)A.467B.674C.476D.7643 .解压缩文件mydjango.tar.gz可以执行(八)A.tar-zxvfmydjango.tar.gzB. tar-xvzmydjango.tar.gzC. tar-czfmydjango.tar.gzD.tar-xvfmydjango.tar.gz4 .下列哪一项包含了主机名到IP地址映射关系的文件?(B)A.etchostnameB./etc/hostsC.etcresolv.confD./etc/networks5 .退出交互式shell,应该输入什么命令?(D)A.q!B.quitC.;D.exit二、判断题1 .Linux配置文件一般放在bin目录。(X)2 .改变文件属主的命令是chmodo(×)3 .ping命令常用于检测网络主机是否可达。()4 .cd命令可以改变用户的当前目录,当用户键入命令“cd”并按Emer键后,当前目录改为根目录。()5 .按下VCII1+C>键能终止当前命令的运行。(J)三、筒答题1 .什么是Linux?创始人是谁?有哪些版本?答:Unux是一套免费使用和自由传播的类Unix操作系统,是一个基于PoSlX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。创始人是芬兰人林纳斯托瓦兹。版本:FedOra、Debian、Ubuntu>GentOo、FreeBSD、CentOS2 .请简单描述LinUX系统安装完成后系统配置的步骤。答:修改用户权限:在root用户权限下(切换至root用户),修改文件elcsudoers,在rootALL=(ALL)ALL下方加入hadoopALL=(ALL)ALL,保存文件。关闭防火墙:使内网集群间的通信不受影响。新建资源目录:在目录Zopt下新建两个文件夹SoftWareS和modules,用于存储软件安装包和安装后的文件。3 .执行命令rtIs-Iw时,某行显示:-rw-rr-1chrischris207Jul2011:58mydata(1)用户chris对该文件有什么权限?答:读写(2)执行命令"useraddTom”后,用户Tom对该文件有什么权限?答:只读(3)如何使得全部用户拥有对该文件的所有权限?答:chmod777mydata(4)如何将文件属主更改为root?答:chownrootmydata第4章练习一、选择题1.下面哪个程序负责HDFS数据存储?(C)A.NameNodcBJobtrackcrC.DatanodeD.SecondaryNameNodeE.tasktracker2.下列哪个程序通常与NameNode在一个节点启动?(D)A-SccondaryNamcNodcB.DataNodeC-TaskTrackerDJobtracker3 .关于SeCOndaryNameNOde哪项是正确的?(C)A.它是NameNode的热备B.它对内存没有要求C.它的目的是帮助NameNode合并编辑日志,减少NameNOde启动时间D-SecondaryNameNode应与NameNode部署到一个节点4 .下列哪个是HadooP运行的模式?(多选)(ABC)A.单机版B.伪分布式C.分布式二、思考题1 .启动hadoop报以下错误,分别该如何解决?-org.apachc.hadoop.hdfs.scrvcr.namcnode.NameNodcDirectorytmphadoop-rootdfsnamcisinaninconsistent答:找不到或无法加载主类,应该是配置文件中hadoop安装位置配置错误。对hadoop-env.sh文件进行检查修改。存储目录不存在或被删除。重新设置Core-Site.xml中hadoop.tmp.dir的值,对namenode进行格式化。2 .请列出正常工作的hadoop集群中需要启动的进程,并简要介绍其作用。答:NameNOde、DataNodeSecondaryNameNode>ResourceManagerNodeManageroNameNOde:HDFS的守护进程,负责维护整个文件系统,存储着整个文件系统的元数据信息。SeCondaryNameNOde相当于一个Namenode元数据的备份机制,提供周期检查点和清理任务,和Namcnodc进行通信,将Namcnodc上的image和edits进行合并,减少NN启动时间。DataNOde是具体文件系统的工作节点,负责管理连接到节点的存储(一个集群中可以有多个节点)。每个存储数据的节点运行一个datanodc守护进程。ResourceManager(JobTracker):Yam的守护进程,负责所有资源的分配与调度,监控Nodemanager0NOdeManager(TaskTrackcr):单个节点的资源管理,执行来自ResourccManagcr的具体任务。3 .请简述hadoop实现二级排序的原理。答:MapReduce中本身就会对key进行排序,所以我们需要对VaIUe进行排序。主要思想为将key和部分value拼接成一个组合key(实现WritableComparable接口或者调用sctSortComparatorClass函数),这样reduce获取的结果便是先按key排序,后按value排序的结果,在这个方法中,用户需要自己实现ParitiOner,继承Partitioned>,以便只按照key进行数据划分。Hadoop显式支持二次排序,Configuration类中的setGroupingComparatorClass()方法,可用于设置排序group的key值。三、设计题1.给定100万个字符串,其中有些是相同的(重复),需要把重梵的全部去掉,保留没有重复的字符串。请结合MaPRCdUCe编程模型给出设计思路或核心代码。思路:分而治之。根据MapReduce的工作原理可知,MapReduce的Shuffle阶段会将MaP任务的结果数据进行分区,并按照key进行分组,同一组的数据将输入到同一个RedUCe任务中进行处理。而根据key分组的过程,实际上就是去重的过程。因此,将每个字符串作为key即可达到数据去重的目的。publicstaticclassProjectionMapextendsMappcr<LongWritable,Text,Text,NullWritablc>privateintclo;projectvoidsctup(Contextcontext)throwsIoExccptionjntcrruptedExceptioncol=contcxt.gctConfiguration().gctInt(t4coO);)publicvoidmap(LongWritableoffset,TextIine5Contextcontext)relationArecord=newRelationA(line.toString();contexl.write(newText(record.getCol(col),NullWritable.get();11publicstaticclassProjectionReduceextendsRcduccr<Text,NullWritable,Text,NullWritablc>publicvoidrcduce(Tcxtkey,ltcrablc<NullWritablc>value,Contextcontext)throwslOExccption,InterruptcdExccption)2 .请在下面程序的下划线中补充完整程序(共8处)。publicclassWordCountpublicstaticclassTokenizerMapperextendsM叩Per<Object,Text,Text,IntWritable>privatefinalstaticIntWritableone=IiewIntWritable(I);privateTextword=newText();publicvoidmap(LongWritablekey.Textvalue,Contextcontext)StringTokenizeritr=newStringTokenizer(value.toString();while(itr.hasMoreTokens()word.set(itr.nextToken();context.write(word,one);)publicstaticclassIntSumReducerextendsReducer<Text,IntWritable,Text,IntWritable>privateIntWritableresult=newIntWritable();publicvoidreduce(Text,key,Iterable<IntWritable>values,Contextcontext)intsum=0;for(IntWritabIeval:values)sum+=val.get();result.set(sum);context.write(key,result);Ipublicstaticvoidmain(Stringargs)throwsException(第5章练习一、选择题1.最早是CIoUdera提供的日志收集系统,目前是APaChe下的一个孵化项目,支持在日志系统中定制各类数据发送方,用于收集数据的工具是?(八)A.FlumeB.ZooKeeperC.StormD.SparkStreaming2.作为分布式消息队列,既有很高的吞吐量,又有较高的可靠性和扩展性,同时接受SparkStreaming的请求,将流量日志按序发送给SparkStreaming集群是?(C)A.FlumeB.ZKecpcrC.KafkaD.SparkStreaming3.Spark组成部件包括?(多选)(BC)A.ResourceManagerB.ExecutorC.DriverD.RDD4.下面不属于SPark四大组件的有?(多选)(AC)A.SparkRB.MLlibC.pysparkD.SparkStreaming二、判断题1. Yarn可以作为Spark的资源调度框架。(J)2. scala的基本数据类型和java完全一致。(X)3. 如果将以下程序中第10行的(x,l)换成(x,-l),输出结果不变。(J)6defmain(args:ArrayString)valsourceSource.fro三Flle("lnputexam.data*UTF-8,").getLines().toArray8source'.flatMap(x>x.trim(),split(M',)10 .map(×>(xf)11 .groupBy(×>×.-l)12 .rwp(x>x._2.length)13 .toList.cortBy(×->×.-2)14 .foreach(x->print(x)15 Y三、思考题1 .已知exam.data文件中数据为:abcaabca,请写出下列程序的运行结果。valsource«Source.fromFile("inputexam.data","UTF-8m).getLines().toArrayJmtMaP(X->x.trim().split("").map(x->(x1).groupBy(×>x.-l).IMP(X>(x.-ljx.-2.length).toList.sortBy(x->-x._2).foreach(x->print(x)答:(b,2)(c,3)(a,4)2 .已知已有学生数据如下:班次学号.RB171RB171l RB171RB17102 RB171RB1713RDl 71R017104RBl 72R8172l7 RBl77R81722RB172R817203姓名; 出生年月血里家底住址身高 手行米祥德1997-02-10 AB河南谷拓州苗1号17211122223333码成刚1996ll A网病4冷阳力2417518837110115卓伟娱1998 08-2 B同网省开封方3号16519999228822螭飞龙199<i0-09 AB河南安阳田4号册613322554455松林1997-01-3 A河南“鹤壁州1号1713688552244高工199627 R周省新*方2号171BS22H445S何惮199712-2 B阿甯省镇作方3号16813566998855区男女男男女«女请写出下列程序的作用。defmain(args:ArrayString)valsource=scala.io.Source.÷romFile("input/studants.data'*,UTF-8m).getLines().toArrayvalphoe5ource.nap(.trim().split(*',).filter(.length«").map(×>(x(),x().substring(,).replaceAll(,-',"").toList.groupBy(-.2).mapValues(_.map(_._l).toList.foreach(println()答:求平均年龄第6章练习一、筒答题1 .为什么Rcdis需要把所有数据放到内存中?答:Rcdis为了达到最快的读写速度,将数据都读到内存中,并通过异步的方式将数据写入磁盘,所以Redis具有快速和数据持久化的特征。如果不将数据放在内存中,磁盘I/O速度为严重影响RediS的性能。2 .如何保证Kafka顺序消费?答:相同的业务ID设置为同一个key,存放到同一个分区中;每个分区中有单独对应的一个消费者实现消费。3 .SparkStreaming是如何与Kafka整合的?答:ReCeiVer接收方式KafkaUtils.CreateDslream:通过ZooKeeper来连接Kafka队列,调用Kafka高阶API,offset存储在ZooKeeper»由Receiver维护。该模式可能会出现数据不一致等问题,当前已不适合在开发中使用。Direel直连方式KafkaU(ils.createDirectStream:直接连接Kafka分区来获取数据,从每个分区直接读取数据大大提高了并行能力,调用Kafka低阶API(底层API),OffSet自己存储和维护,默认由Spark维护在checkpoint中。二、设计题已知表a中字段内容如下:字段字段含义index数据idChild_commenl回复数量comment_time评论时间content评论内容da_v微博个人认证like_status赞pic图片评论urluser_id微博用户iduser_name微博用户名vip_rank微博会员等级stamp时间戳要求:1 .在kafka中创建comment主题,设置2个分区2个副本;答:kafka-topics.sh-create-zookcccrmaster:2181,slave1:2181,slave2:2181replicationfactor2partitions2topiccomment2 .使用SParkStreaming对接kafka后进行计算,查询并输出微博会员等级为5的用户。3 .查询并输出评论赞的个数在10个以上的数据。答:2、3题程序如下importjava.sql.Connection.DriverManager,PreparedStatement)importjava.text.SimpleDateFonatimportorg.apache.kafka.clients.consumer.ConsumerRecordmon.serialization.StringDeserializerimportorg.apache.spark.SparkConf,SparkContextJimportorg.apache.spark.rdd.RDDimportorg.apache.spark.streaming.Seconds,StreamingContextimportorg.apache.spark.streaming.dstream.DStream,InputDStream)importorg.apache.spark.streaming.kafkaO10.ConsumerStrategies,KafkaUtiIs,LocationStrategies)objectSparkSlreamingdefmain(args:ArrayString):Unit=valSparkConf:SparkConf=newSparkConf().setMaster("local*").setAppName(,'SparkStreamingn)valssc=newStreamingContext(sparkConf,Seconds(3)valkafkaParams=MapString,Object("bootstrap.servers"->"hadoopO1:9092,hadoop02r9092,hadoop039092,t,"key.deserializer"->ClassOflStringDesenalizer,"value.deserializer"->ClaSSOfStringDeserializer,"group.id"->"SparkKafkaDemo","auto.offset.reset,'->"latest","mit"->(false:java.lang.Boolean)vartopics=Array("mg_comment")valrecordDStream:InputDStreamConsumerRecordString,String1KafkaUli】s.CreateDireClSIreamSiring,StringKssc,1.ocalionStrategies.PreferConsistent,ConsumerSlrategies.SubscribeString,String(topics,kafkaParams)valresultDStream:DStreamArrayStringlrecordDStream.mapG.value(),map(-.split("t,'),cache()/2、查询出微博会员等级为5的用户。resultDStream.filter(_(9)="5")ForeachRDDrdd:RDDArrayString=>rdd.foreachPartitioniter:IteratorA11ayString=>Class.forName("com.mysql.jdbc.Driver")valconnection:ConnectionDriverManager.getConnection("jdbc:mysql:/localhost:3306/rng_comment?characterEncoding=UTF-8","root","root")valsql="insertintovip_rankVaIUeS(?,?,?)"iter.foreachline:ArraylStringJ=>valstatement:PreparedStatement=connection.prepareStatement(sql)statcmcnt.sctlnt(1,linc(0).tolnt);statement.setlnt(2,line(1).tolnt);statement.sctString(3,linc(2);statement.sctString(4,linc(3);statcmcnt.sctString(5,linc(4);statement.setString(6,line(5);statement.setString(7,line(6);statement.setString(8,line(7);statemenl.setString(9,line(8);statemenl.setlnt(10,line(9).tolnl);statement.setString(11,Iine(IO);statement.executeUpdate()statement.close()connection.close()/3>查询并输出评论赞的个数在10个以上的数据。resultDStream.filter(_(5).tolnt>10).foreachRDDrdd:RDDArrayString=>rdd.foreachPartitioniter:IteratorArrayString=>Class.forName("com.mysql.jdbc.Driver")valconnection:Connection=DriverManager.getConnec(ion("jdbc:mysql:/localhost:3306/rng_comment?characterEncoding=UTF-8",root,"root")varsql="insertintoIikJStatUSvalues(?,?,?,?,?,?,?,?,?,?,?)'1iter.fbreachline:ArrayString=>valstatement:PreparedStatement=connection.prepareStatement(sql)statement.setlnt(l,line(0).tolnt);statement.setlnt(2,line(1).tolnt);statement.setString(3,line(2);statement.setString(4,line(3);statcmcnt.sctString(5,line(4);statcmcnt.setString(6,line(5);statcmcnt.sctString(7,line(6);statement.setString(8,line(7);statement.setString(9,line(8);statement.setlnt(10.line(9).(olnt);StatemenLSetSlring(11,Iine(IO);statement.execuleUpdate()statement.close()conncction.close()ssc.start()ssc.awaitTermination()第7章练习一、筒答题1 .爬取京东数据时,如何避免程序被服务器识别为爬虫程序?答:在发送请求时使用time库的sleep函数让程序隔一段时间发送一次请求,这样不易于被服务器识别为爬虫程序。2 .RDD是什么?生成RDD的方法有哪些?答:RDD又叫分布式弹性数据集,是SPark中最基本的数据抽象。SparkCore提供了三种创建RDD的方式:使用程序中的集合创建RDD、使用本地文件创建RDD、使用HDFS文件创建RDDo3 .Superset连接MySQL时的UrI具体是指什么?答:mysql:数据库账号:数据库密码数据库所在IP:端口号/数据库?CharSet=Utf8例如:mysqkrool:1234loCaIhOSUmysql?CharSet=Ulf8二、编程题已知字段内容如下:Bob,DataBase,80Tom,Ma(h,78Any,Python,60Jim,DataBase,90Bob,Math,60Jim,DataStructure,81Angel,Math,91Bob,Python,85Any,English,80要求结合SPark技术,编写代码实现以下要求:1 .计算出总共有多少学生;valrdd=sc.textFile("data.txt,')valnameRDD=rdd.map(row=>row.split(",")(0)valresult=nameRDD.distinct().count2 .计算Jim同学的平均分。valsum=rdd.filter(line=>line.split(",')(O)="Jim")valavg=sum.map(name=>(name.split(',")(0),name.split(,")(2).toInt),mapValues(x=>(x,l).reduceByKey(x,y)=>(x._l+y._l,x._2+y._2).mapValues(x=>(x._l/x._2).collect()3 .计算Math科目的平均成绩。valsum=rdd.filtcr(line=>line.split(",)(1)="Math")valavg=sum.map(t=>(t.split(",',)(1),(t.split('")(2).toInt,l).reduceByKey(a,b)=>(a._l+b._l,a._2+b._2).mapValues(a=>a._l/a._2).collect()4 .计算总共开设多少门课程。valCountCourse=rdd.map(line=>line.split(',")(1)valresult=countCourse.distinct().count