• 大数据面试题(一)


    1. 列举出Hadoop中定义的最常用的InputFormats,那个是默认的?

    TextInputFormat(默认)用于读取纯文本文件,key是每一行的位置偏移量,是LongWritable类型的,value是每一行的内容,为Text类型 KeyValueTextInputFormat 同样用于读取文件,如果行被分隔符(缺省是tab)分割为两部分,第一部分为key,剩下的部分 为value;如果没 有分隔符,整行作为 key,value为空 SequenceFileInputFormat 用于读取sequence file。 sequence file是Hadoop用于存储数据自定义格式的binary文件。它有 两个子类: SequenceFileAsBinaryInputFormat,将 key和value以BytesWritable的类型读出;SequenceFileAsTextInputFormat,将key和value以Text类型读出

    2..TextInputFormat和KeyValueInputFormat类不同之处在于哪里?

    答:TextInputFormat读取文本文件中的所有行,提供了行的偏移作为Mapper的键,实际的行作为 mapper的值。 KeyValueInputFormat读取文本文件,解析所有行到中,首个空格前的字符是mapper的key,行的其余部分则是mapper的值

    3. Hadoop中InputSplit是什么?

    答:InputSplit是指分片,在MapReduce作业中,作为map task最小输入单位。分片是基于文件基础上出来的概念,通俗的理解一个文件可 以切分为多少个片段,每个片段包括了等信息。在 MapTask 拿到这些分片后,会知道从哪开 始读取数据。

    4. Hadoop框架中文件拆分是如何被触发的?

      答:通过运行输入格式类中的getInputSplit()方法。

    5. 考虑一种情况:Map/Reduce系统中,HDFS块大小是64MB,输入格式FileInputFormat,有三个文件64K,65MB,127MB, 那么有hadoop框架会将 输入划分成多少?

     答:hadoop将会做5个拆分,64K文件拆分1个,65MB文件拆分2个,127MB文件拆分2个。

    6. hadoop中的RecordReader的目的是什么?

     1)以怎样的方式从分片中读取一条记录,每读取一条记录都会调用RecordReader类;

      2)系统默认的RecordReader是LineRecordReader,如TextInputFormat;而SequenceFileInputFormat的RecordReader是SequenceFileRecordReader;

      3)LineRecordReader是用每行的偏移量作为map的key,每行的内容作为map的value;

      4)应用场景:自定义读取每一条记录的方式;自定义读入key的类型,如希望读取的key是文件的路径或名字而不是该行在文件中的偏移量。 系统默认的LineRecordReader是按照每行的偏移量做为map输出时的key值,每行的内容作为map的value值,默认的分隔符是 回车和换行。 现在要更改map对应的输入的值,key对应的文件的路径(或者是文件名),value对应的是文件的内容 (content)。 那么我们需要重写InputFormat和RecordReader,因为RecordReader是在InputFormat中调用的,当然重写RecordReader才是重点!

    7. 如果hadoop中没有定义定制分区,那么如何在输出到reduce前执行数据分区? Partitioner /override getPartition()

       答:默认的分区器为各个键计算一个哈希值,并分配给基于这个结果的分区。

    8. 什么是Combiner?举个例子,什么时候使用combiner,什么时候不用?

    答:当map生成的数据过大时,带宽就成了瓶颈,怎样精简压缩传给Reduce的数据,有不影响最终的结果呢。有一种方法就是使 用 Combiner,Combiner号称本地的Reduce,Reduce最终的输入,是Combiner的输出 Combiner的作用是把一个map产生的多个合并成一个新的,然后再将新的作为reduce的输入; 在map函数与reduce函数之间多了一个combine函数,目的是为了减少map输出的中间结果,这样减少了reduce复制map输出的数据,减少网络 传输负载; 并不是所有情况下都能使用Combiner,Combiner适用于对记录汇总的场景(如求和),但是,求平均数的场景就不能使用Combiner了。如果可以 使用Combiner,一般情况下,和我们的reduce函数是一致的。

    9. 什么是jobtracker? jobtracker有哪些特别的函数?

     答:

    1, JobTracker是整个MapReduce计算框架中的主服务,相当于集群的“管理者”,负责整个集群的作业控制和资源管理  

    2, main()函数

    10. 什么是tasktracker?

    TaskTracker是JobTracker和Task之间的桥梁:一方面,从JobTracker接收并执行各种命令:运行任务、提交任务、杀死任务 等;另一方面,将本地节点上各个任务的状态通过心跳周期性汇报给JobTracker。TaskTracker与JobTracker和Task之间采用了 RPC协议进行通信。

    11. hadoop中job和task之间是什么关系?

      概述:

     (1)Hadoop MapReduce采用Master/Slave结构。

    *Master:是整个集群的唯一的全局管理者,功能包括:作业管理、状态监控和任务调度等,即MapReduce中的JobTracker。

     *Slave:负责任务的执行和任务状态的回报,即MapReduce中的TaskTracker。

    JobTracker剖析:

     (1)概述:JobTracker是一个后台服务进程,启动之后,会一直监听并接收来自各个TaskTracker发送的心跳信息,包括资源使用 情况和任务运行情况等信息。

     (2)JobTracker的主要功能:

     1.作业控制:在hadoop中每个应用程序被表示成一个作业,每个作业又被分成多个任务,JobTracker的作业控制模块则负责作业 的分解和状态监控。

     *最重要的是状态监控:主要包括TaskTracker状态监控、作业状态监控和任务状态监控。主要作用:容错和为任务调度提供决 策依据。

    2.资源管理。

      TaskTracker剖析:

     (1)TaskTracker概述:TaskTracker是JobTracker和Task之间的桥梁:一方面,从JobTracker接收并执行各种命令:运行任务、提交 任务、杀死任务等;另一方面,将本地节点上各个任务的状态通过心跳周期性汇报给JobTracker。TaskTracker与JobTracker和 Task之间采用了RPC协议进行通信。

    (2)TaskTracker的功能:

    1.汇报心跳:Tracker周期性将所有节点上各种信息通过心跳机制汇报给JobTracker。这些信息包括两部分:

     *机器级别信息:节点健康情况、资源使用情况等。

     *任务级别信息:任务执行进度、任务运行状态等。

    2.执行命令:JobTracker会给TaskTracker下达各种命令,主要包括:启动任务(LaunchTaskAction)、提交任务 (CommitTaskAction)、杀死任务(KillTaskAction)、杀死作业(KillJobAction)和重新初始化(TaskTrackerReinitAction)。

    12. 假设hadoop一个job产生了100个task, 并且其中的一个task失败了,hadoop会如何处理?

    hadoop本身的一个设计理念就是在普通的pc硬件上构建高可靠性的系统,任何failed task都不会引起整个job的失败,因为所有失败的任务 都会被重新执行(reschedule execution),只有当重新执行的次数超过4次,才会把这任务标记为失败,导致整个job的失败。

    13. 通过划分多个节点上任务,hadoop实现了并行处理,对少数慢节点可能会限制剩下其他程序的 速率,并拖慢了整个程序。hadoop提供了什么机制防止这种情况的发生? speculative execution。举个简单的例子,如果某个job有2000个map task,已经完成了1999个,只剩下一个task由于硬件比较慢而成为拖尾 任务,为了减少拖尾任务对整个job运行时间的影响,jobtracker会重新启动一个一模一样的duplicate task和原有的task并行的执行,这样有一 个task执行成功,整个map过程就会结束。speculative execution(推测执行)只有个处理拖尾任务的优化策略,并不能提高系统的可靠性

    14. hadoop推测执行是如何实现的?

     答:Hadoop会为该task启动备份任务,让speculative task与原始task同时处理一份数据,哪个先运行完,则将谁的结果作为最终结果,并且在 运行完成后Kill掉另外一个任务。

    15. Unix中使用命令行,如何查看hadoop集群中的所有运行的任务?或是kill掉任务?

     jps

    16. 什么是hadoop streming?

    答:Haoop支持用其他语言来编程,需要用到名为Streaming的通用API, Streaming主要用于编写简单,短小的MapReduce程序,可以通过脚 本语言编程,开发更快捷,并充分利用非Java库

    17. 解释hadoop和hadoop生态系统两个概念

     答:Hadoop是一个能够对大量数据进行分布式处理的软件框架,Hadoop的核心是HDFS和Mapreduce,hadoop2.0还包括YARN hadoop生态系统:包含 HDFS mapreduce hive hbase zookeeper sqoop flume pig mahout

     18. 说明hadoop2.0的基本构成

     HDFS

     MapReduce

     YARN

     19. 相比于HDFS1.0. 2.0最主要的改进在哪几个方面?

     引入一个新的资源管理系统YARN

     HDFS单点故障得以解决

     Hadoop 2.0的最大变化出现在内核(HDFS、MapReduce和YARN)

    20. 试使用步骤1,步骤2,步骤3.……说明YARN中运行应用程序的基本流程

    步骤1 用户向YARN中提交应用程序,其中包括ApplicationMaster程序、启动ApplicationMaster的命令、用户程序等。

    步骤2 ResourceManager为该应用程序分配第一个Container,并与对应的Node-Manager通信,要求它在这个Container中启动应用程序的 ApplicationMaster。

    步骤3 ApplicationMaster首先向ResourceManager注册,这样用户可以直接通过ResourceManage查看应用程序的运行状态,然后它将为各 个任务申请资源,并监控它的运 行状态,直到运行结束,即重复步骤4~7。

    步骤4 ApplicationMaster采用轮询的方式通过RPC协议向ResourceManager申请和领取资源。

    步骤5 一旦ApplicationMaster申请到资源后,便与对应的NodeManager通信,要求它启动任务Task。

    步骤6 NodeManager为任务Task设置好运行环境(包括环境变量、JAR包、二进制程序等)后,将任务启动命令写到一个脚本中,并通过 运行该脚本启动任务Task。

    步骤7 各个任务Task通过某个RPC协议向ApplicationMaster汇报自己的状态和进度,以让ApplicationMaster随时掌握各个任务的运行状 态,从而可以在任务失败时重新启动任务。 在应用程序运行过程中,用户可随时通过RPC向ApplicationMaster查询应用程序的当前运行状态。

    步骤8 应用程序运行完成后,ApplicationMaster向ResourceManager注销并关闭自己。 10. MapReducer2.0与Yarn是否等同,尝试解释说明。

    21. MapReducer2.0中, MRAppMaster主要作用是什么,MRappMaster如何实现任务容错的?

    22. 什么是MRAppMaster?

    我们知道,在MRv1中,JobTracker存在诸多问题,包括存在单点故障,扩展受限等,为了解决这些问题,Apache对MRv1进行了改进,提 出了YARN,YARN将JobTracker中的作业控制和资源管理两个功能分开,分别由两个不同的进程处理,进而解决了原有JobTracker存在的问 题。经过架构调整之后,YARN已经完全不同于MRv1,它已经变成了一个资源管理平台,或者说应用程序管理框架。运行于YARN之上的计 算框架不只限于MapReduce一种,也可以是其他流行计算框架,比如流式计算、迭代式计算等类型的计算框架。为了将一个计算框架运行于 YARN之上,用户需要开发一个组件—ApplicationMaster。作为一个开始,YARN首先支持的计算框架是MapReduce,YARN为用户实现好了 MapReduce的ApplicationMaster,也就是本文要介绍了MRAppMaster。

    23. 相比于JobTracker,MRAppMaster有什么不同?

    既然MRAppMaster是由JobTracker衍化而来的,那么是否将JobTracker的代码稍加修改,就变成了MRAppMaster呢,答案是否定的。事实 上,YARN仅重用了MRv1中的少许代码,基本可看做重写了MRAppMaster。

    YARN采用了新的软件设计思想,包括对象服务化、事件驱动的异步编程模型的。作为YARN的一部分,MRAppMaster的实现也采用了这 些设计思想。

    下面简要介绍一下MRAppMaster的实现细节 

    在正式介绍MRAppMaster之前,我们先回顾一下MRv1的实现。我们都知道,MRv1主要由两种服务组成,即:JobTracker和TaskTracker, 而在YARN中,TaskTracker已经由NodeManager代替,因此,我们在此重点分析JobTracker。JobTracker包含资源管理和作业控制两个功能, 在YARN中,作业管理由ResourceManager实现,因此,只剩下作业控制这一个功能(由MRAppMaster实现)。MRv1中每个作业由一个 JobInProgress控制,每个任务由一个TaskInProgress控制,由于每个任务可能有多个运行实例,因此,TaskInProgress实际管理了多个运行实 例Task Attempt,对于每个运行实例,可能运行了一个MapTask或者ReduceTask,另外,每个Map Task或者Reduce Task会通过RPC协议将状态 汇报给TaskTracker,再由TaskTracker进一步汇报给JobTracker 在MRAppMaster中,它只负责管理一个作业,包括该作业的资源申请、作业运行过程监控和作业容错等。MRAppMaster使用服务模型和 事件驱动的异步编程模型对JobInProgress和TaskInProgress进行了重写(分别对应JobImpl和TaskImpl),并让Map Task和Reduce Task(Map Task和Reduce Task重用了MRv1中的代码)直接通过RPC将信息汇报给MRAppMaster。此外,为了能够运行于YARN之上,MRAppMaster还要 与ResourceManager和NodeManager两个新的服务通信(用到两个新的RPC协议),以申请资源和启动任务,这些都使得MRAppMaster完全不同于JobTracker。

    24. 为什么会产生yarn,它解决了什么问题。有什么优势?

    25. job的运行流程(提交一个job的流程)

     

    job的执行流程如下: dataInput- >split- >Mapper- >Combine- >(产出临时数据)-->Partition- >Sort- >Reducer- >最终数据

    26. hadoop生态圈中各种框架的运用场景

    27. hive中的压缩格式RCFile.TextFile.SequenceFile各有什么区别,以上三种格式一样大的文件哪个占用空间大小

     textfile(默认) 存储空间消耗比较大,并且压缩的text 无法分割和合并 查询的效率最低,可以直接存储,加载数据的速度最高 sequencefile 存储空间消耗最大,压缩的文件可以分割和合并 查询效率高,需要通过text文件转化来加载 rcfile 存储空间最小,查询的效率最高 ,需要通过text文件转化来加载,加载的速度最低

    28. hadoop中的一个HA压缩

    29. Flume收集到的数据很多个小文件,我而要写MR处理时将这些文件合并(是在MR中进行优化 ,不让一个小文件一个MapReduce)

    30. 你们的集群规模?

     开发集群:10台(8台可用)8核cpu

    31. 你们的数据是用什么导入到数据库的?导入到什么数据库?

    处理之前的导入:通过hadoop命令导入到hdfs文件系统 处理完成之后的导出:利用hive处理完成之后的数据,通过sqoop导出到mysql数据库中,以供报表使用

    32. 你们的业务数据量多大?有多少行数据?(面试三家,都问)

     开发时使用的是部分数据,不是全量数据。有将近一亿行(8. 9千万吧, 全体不详, 一般开发不是特别关心这个问题)

    33. 你们处理数据是直接读数据库的数据还是读文本数据?

     将日志数据导入到hdfs之后时行处理

    34. 你们写hive的hql语句,大概有多少条?

     不清楚,我自己写的时候也没统计

    35. 你们提交job任务大概有多少个?这些job执行完成大概用多少时间(都问。)

     没统计过。加上测试的会很多

    36. hive跟hbase的区别是?

    37. 你在项目中主要的工作任务是?

    利用hive分析数据

    38. 你在项目遇到了哪些难题。是怎么解决的?

     某些任务执行时间过长, 且失败率过高。 检查日志后发现没有执行完就失败,原因出在 hadoop的job的timout过短(相对于集群的能力来说)设置长一点就行

    39. 你自己写过udf函数么?写了哪些

    40. 你的项目提交到job的时候数据量有多大?(常问)

    41. reduce后输出的数据量有多大?

    42. 一个网络商城1天大概产生多少G日志?4tb

    43. 大概有多少条日志记录

    44. 日访问大概有多少个?百万

    45. hdfs的 client端,复制到第三个副本时宕机,hdfs怎么恢复下次写第三副本?block块信息是先写 dataNode还是先写nameNode?

    46. 快排现场写程序实现?

    47. jvm的内存是怎么分配原理?

    48. 毒酒问题---1000桶酒,其中1桶有毒,而一旦吃了,毒性会在一周后发作。问最少需要多少只 老鼠可在一周内找出毒酒?

    49. 用栈实现队列?

    50. 链表倒序实现?

    51. 多线程模型怎么(生产,消费者)? 平时并发多线程都用哪些实现方式?

    52. synchronized是同步悲观锁吗?互斥?怎么写同步提高效率?

     synchronized 关键字相当于 lock(M.class), 是将整个对象锁住,为提高效率,可以使用读写锁

    53. 4亿个数字,找出哪些是重复的,要用最小的比较次数,写程序实现

    54. java是传值还是传址?

    55. java处理多线程,另一线程一直等待?

    56. 在线安装ssh的命令以及文件解压的命令?

    57. 把公钥都追加到授权文件的命令?该命令是否在root用户下执行?

    58. HadoopHA集群中各个服务启动和关闭的顺序?

    59. HDFS中的block块默认保存几份?默认大小多少?

    60. NameNode中的meta数据是存放在NameNode自身还是datanode等其它节点.DataNode节点自身是否有meta数据存在?

    61. 下列哪个程序通常与NameNode在一个节点启动?

    62. 下面哪个程序负责HDFS数据存储?

    63. 在Hadoop HA集群中Zookeeper 的主要作用,以及启动和查看状态的命令?

    sh bin/zkServer.sh start sh bin/zkServer.sh status

    64. HBase在进行模型设计进重点在什么地方?一张表中定义多少个Colum family最合适?为什么?

    65. 如何提高HBase客户端的读写性能?请举例说明。

    66. 基于Hadoop HA集群记性MapReduce开发时,Configuration 如何设置hbase.zookeeper.quorum属性的值?

    67. 在hadoop开发过程中使用过哪些算法?其应用场景是什么?

    68. MapReduce程序如何发布?如果MapReduce中涉及到了第三方的jar包,该如何处理 14. 在实际工作中使用过哪些运维工具,请分别阐述其作用。

    69. hadoop中combiner的作用?

    70. IO的原理。IO模型有几种?

    71. Windows用什么样的模型,Linux用什么样的模型?

    72. 一台机器如何应对那么多的请求访问。高并发到底怎么实现,一个请求怎么产生的。 在服务端怎么处理的。最后怎么返回给用户的。整个的环节操作系统是怎么控制的?

    73. 以你的实际经验,说下怎么样预防全表扫描

    74. 网络七层协议

    76. 集合HashTable和HashMap的区别

    1.HashTable的方法是同步的,HashMap未经同步

    2.HashTable不允许null值(key和value都不可以),HashMap允许null值(key和value都可以)。

    77.zookeeper优点,用在什么场合

    78.HBase中的metastore用来做什么的

     79java优势及原因

     80. jvm优化

     81写一个冒泡排序

    82. hadoop底层存储设计

    83. 文件大小默认64M,改为128有啥影响

     84. RPC原理

    85. NameNode与SecondaryNameNode的区别与联系

     86. 介绍MapReduce整个过程.比如把WordCount的例子的细节讲清楚(重点讲shuffle)

     87. 对Hadoop有没有调优经验.有没有什么使用心得(调优从参数调优说起)

     88. MapReduce出现单点负载过大,怎么负载平衡?(可以用Partioner)

    89. 说说值与引用对象的区别

    90. 谈谈你对反射机制的理解及用途

    91. ArrayList, Vector, LinkdList的区别及其优缺点?HashMap,HashTable的区别及其优缺点?

     92. 列出线程的实现方式? 如何实现同步

     93. 列出至少5种设计模式? 用代码或UML类图描述其中用到的技术难点及其解决思路

     94. 谈谈你最近正在研究的技术.谈谈你最近项目中用到的技术难点及其解决思路

     95. hdfs中的block默认保存几份?

     96. 哪个程序通常与nn在一个节点启动 Jobtracker

     97. 列举几个配置文件优化?

    98. 写出你对zookeeper的理解

    99. DataNode首次加入cluster的时候,如果log报告不兼容文件版本.那需要NameNode执行格式化操作,这样处理的原因是?

    100. 谈谈数据倾斜,如何发生的.并给出优化方案 能够想到的关于数据倾斜的一些解决方式(欢迎补充,尤其是有没有做搜索或者数据挖掘的朋友有碰到类似问题):

    1. 增加reduce 的jvm内存

    2. 增加reduce 个数

    3.customer partition

    4. 其他优化的讨论.

    5. reduce sort merge排序算法的讨论

    6. 正在实现中的hive skewed join.

    7. pipeline

    8. distinct

    9. index 尤其是bitmap index

    101. 介绍一下HBase过滤器

     HBase为筛选数据提供了一组过滤器,通过这个过滤器可以在HBase中的数据的多个维度(行,列,数据版本)上进行对数据的筛选操 作,也就是说过滤器最终能够筛选的数据能够细化到具体的一个存储单元格上(由行键,列明,时间戳定位)。通常来说,通过行键,值 来筛选数据的应用场景较多。

    1. RowFilter:筛选出匹配的所有的行,对于这个过滤器的应用场景,是非常直观的:使用BinaryComparator可以筛选出具有某个行键的行, 或者通过改变比较运算符(下面的例子中是CompareFilter.CompareOp.EQUAL)来筛选出符合某一条件的多条数据,以下就是筛选出行键为 row1的一行数据:

    2. PrefixFilter:筛选出具有特定前缀的行键的数据。这个过滤器所实现的功能其实也可以由RowFilter结合RegexComparator来实现,不过这 里提供了一种简便的使用方法,以下过滤器就是筛选出行键以row为前缀的所有的行:

     3. KeyOnlyFilter:这个过滤器唯一的功能就是只返回每行的行键,值全部为空,这对于只关注于行键的应用场景来说非常合适,这样忽略 掉其值就可以减少传递到客户端的数据量,能起到一定的优化作用

    4. RandomRowFilter:从名字上就可以看出其大概的用法,本过滤器的作用就是按照一定的几率(<=0会过滤掉所有的行,>=1会包含所有的 行)来返回随机的结果集,对于同样的数据集,多次使用同一个RandomRowFilter会返回不通的结果集,对于需要随机抽取一部分数据的应 用场景,可以使用此过滤器:

     102. MapReduce基本执行过程

    103. 谈谈hadoop2和hadoop2的区别

    104. HBase集群安装注意事项

    105. 记录包含值域F和值域G.要别统计相同G值的记录中不同的F值的数目,简单编写过程

    106. HDFS原理.以及各个模块的职责

    107. MR的工作原理

    108. map方法是如何调用reduce方法的.

    109. shell如何判断文件是否存在.如果不存在该如何处理

    108. fsimage和edit的区别

    109. DataNode在什么情况下不会备份

    110. hdfs体系结构

    111. flush的过程  

    112. hadoop集群搭建过程.写出步骤

    113. hadoop集群运行过程中启动哪些线程.各自的作用是什么?

    114. /tmp/hadoop-root/dfs/name the path is not exists or is not accessable. NameNode main 中报错.怎么解决

    115. 工作中编写mapreduce用到的语言. 编写一个mapreduce程序

    116. hadoop 命 >杀死一个job任务 >删除/tmp/aaa/文件目录 >hadoop集群添加或删除节点时.刷新集群状态的命令

    117. hadoop的调度器有哪些?工作原理

    118. mapreduce的join方法有哪些?

    119. Hive无数据保存的方法有哪些?各有什么特点

    120. java实现非递归二分法算法

    121. mapreduce中combiner和Partion的作用

    122. 如何实现 mapreduce的二次排序

    123. hadoop的高度机制

    124. 机架感知

    125. MR数据倾斜原因和解决方案?

    126. 集群HA

    127. 对于HIVE. 你写过哪些UDF函数.作用是什么

    128. hdfs的数据压缩算法

    129. mapreduce的调度模式

    130. hive底层与数据库交互原理

    131. hadoop运行原理

    132. mapreduce的原理

    133. hdfs存储机制

    134. Hive内部表和外部表的区别

    1、在导入数据到外部表,数据并没有移动到自己的数据仓库目录下,也就是说外部表中的数据并不是由它自己来管理的!而 表则不一 样;

    2、在删除表的时候,Hive将会把属于表的元数据和数据全部删掉;而删除外部表的时候,Hive仅仅删除外部表的元数据,数 据 是不会 删除的! 那么,应该如何选择使用哪种表呢?在大多数情况没有太多的区别,因此选择只是个人喜好的问题。但是作为一个经验,如 果所有处理 都需要由Hive完成,那么你应该创建表,否则使用外部表!

    135. HBase的rowkey怎么创建比较好.列族怎么创建比较好

    136. 用mapreduce怎么处理数据倾斜问题?

    137. hadoop框架中中怎么优化.

    138. HBase内部什么机制

    139. 我们在开发分布式计算job的.是否可以去掉reduce阶段

    140. hive底层与数据库交互原理

     

    1. 列举出Hadoop中定义的最常用的InputFormats,那个是默认的?

    TextInputFormat(默认)用于读取纯文本文件,key是每一行的位置偏移量,是LongWritable类型的,value是每一行的内容,为Text类型 KeyValueTextInputFormat 同样用于读取文件,如果行被分隔符(缺省是tab)分割为两部分,第一部分为key,剩下的部分 为value;如果没 有分隔符,整行作为 key,value为空 SequenceFileInputFormat 用于读取sequence file。 sequence file是Hadoop用于存储数据自定义格式的binary文件。它有 两个子类: SequenceFileAsBinaryInputFormat,将 key和value以BytesWritable的类型读出;SequenceFileAsTextInputFormat,将key和value以Text类型读出

    2..TextInputFormat和KeyValueInputFormat类不同之处在于哪里?

    答:TextInputFormat读取文本文件中的所有行,提供了行的偏移作为Mapper的键,实际的行作为 mapper的值。 KeyValueInputFormat读取文本文件,解析所有行到中,首个空格前的字符是mapper的key,行的其余部分则是mapper的值

    3. Hadoop中InputSplit是什么?

    答:InputSplit是指分片,在MapReduce作业中,作为map task最小输入单位。分片是基于文件基础上出来的概念,通俗的理解一个文件可 以切分为多少个片段,每个片段包括了等信息。在 MapTask 拿到这些分片后,会知道从哪开 始读取数据。

    4. Hadoop框架中文件拆分是如何被触发的?

      答:通过运行输入格式类中的getInputSplit()方法。

    5. 考虑一种情况:Map/Reduce系统中,HDFS块大小是64MB,输入格式FileInputFormat,有三个文件64K,65MB,127MB, 那么有hadoop框架会将 输入划分成多少?

     答:hadoop将会做5个拆分,64K文件拆分1个,65MB文件拆分2个,127MB文件拆分2个。

    6. hadoop中的RecordReader的目的是什么?

     1)以怎样的方式从分片中读取一条记录,每读取一条记录都会调用RecordReader类;

      2)系统默认的RecordReader是LineRecordReader,如TextInputFormat;而SequenceFileInputFormat的RecordReader是SequenceFileRecordReader;

      3)LineRecordReader是用每行的偏移量作为map的key,每行的内容作为map的value;

      4)应用场景:自定义读取每一条记录的方式;自定义读入key的类型,如希望读取的key是文件的路径或名字而不是该行在文件中的偏移量。 系统默认的LineRecordReader是按照每行的偏移量做为map输出时的key值,每行的内容作为map的value值,默认的分隔符是 回车和换行。 现在要更改map对应的输入的值,key对应的文件的路径(或者是文件名),value对应的是文件的内容 (content)。 那么我们需要重写InputFormat和RecordReader,因为RecordReader是在InputFormat中调用的,当然重写RecordReader才是重点!

    7. 如果hadoop中没有定义定制分区,那么如何在输出到reduce前执行数据分区? Partitioner /override getPartition()

       答:默认的分区器为各个键计算一个哈希值,并分配给基于这个结果的分区。

    8. 什么是Combiner?举个例子,什么时候使用combiner,什么时候不用?

    答:当map生成的数据过大时,带宽就成了瓶颈,怎样精简压缩传给Reduce的数据,有不影响最终的结果呢。有一种方法就是使 用 Combiner,Combiner号称本地的Reduce,Reduce最终的输入,是Combiner的输出 Combiner的作用是把一个map产生的多个合并成一个新的,然后再将新的作为reduce的输入; 在map函数与reduce函数之间多了一个combine函数,目的是为了减少map输出的中间结果,这样减少了reduce复制map输出的数据,减少网络 传输负载; 并不是所有情况下都能使用Combiner,Combiner适用于对记录汇总的场景(如求和),但是,求平均数的场景就不能使用Combiner了。如果可以 使用Combiner,一般情况下,和我们的reduce函数是一致的。

    9. 什么是jobtracker? jobtracker有哪些特别的函数?

     答:

    1, JobTracker是整个MapReduce计算框架中的主服务,相当于集群的“管理者”,负责整个集群的作业控制和资源管理  

    2, main()函数

    10. 什么是tasktracker?

    TaskTracker是JobTracker和Task之间的桥梁:一方面,从JobTracker接收并执行各种命令:运行任务、提交任务、杀死任务 等;另一方面,将本地节点上各个任务的状态通过心跳周期性汇报给JobTracker。TaskTracker与JobTracker和Task之间采用了 RPC协议进行通信。

    11. hadoop中job和task之间是什么关系?

      概述:

     (1)Hadoop MapReduce采用Master/Slave结构。

    *Master:是整个集群的唯一的全局管理者,功能包括:作业管理、状态监控和任务调度等,即MapReduce中的JobTracker。

     *Slave:负责任务的执行和任务状态的回报,即MapReduce中的TaskTracker。

    JobTracker剖析:

     (1)概述:JobTracker是一个后台服务进程,启动之后,会一直监听并接收来自各个TaskTracker发送的心跳信息,包括资源使用 情况和任务运行情况等信息。

     (2)JobTracker的主要功能:

     1.作业控制:在hadoop中每个应用程序被表示成一个作业,每个作业又被分成多个任务,JobTracker的作业控制模块则负责作业 的分解和状态监控。

     *最重要的是状态监控:主要包括TaskTracker状态监控、作业状态监控和任务状态监控。主要作用:容错和为任务调度提供决 策依据。

    2.资源管理。

      TaskTracker剖析:

     (1)TaskTracker概述:TaskTracker是JobTracker和Task之间的桥梁:一方面,从JobTracker接收并执行各种命令:运行任务、提交 任务、杀死任务等;另一方面,将本地节点上各个任务的状态通过心跳周期性汇报给JobTracker。TaskTracker与JobTracker和 Task之间采用了RPC协议进行通信。

    (2)TaskTracker的功能:

    1.汇报心跳:Tracker周期性将所有节点上各种信息通过心跳机制汇报给JobTracker。这些信息包括两部分:

     *机器级别信息:节点健康情况、资源使用情况等。

     *任务级别信息:任务执行进度、任务运行状态等。

    2.执行命令:JobTracker会给TaskTracker下达各种命令,主要包括:启动任务(LaunchTaskAction)、提交任务 (CommitTaskAction)、杀死任务(KillTaskAction)、杀死作业(KillJobAction)和重新初始化(TaskTrackerReinitAction)。

    12. 假设hadoop一个job产生了100个task, 并且其中的一个task失败了,hadoop会如何处理?

    hadoop本身的一个设计理念就是在普通的pc硬件上构建高可靠性的系统,任何failed task都不会引起整个job的失败,因为所有失败的任务 都会被重新执行(reschedule execution),只有当重新执行的次数超过4次,才会把这任务标记为失败,导致整个job的失败。

    13. 通过划分多个节点上任务,hadoop实现了并行处理,对少数慢节点可能会限制剩下其他程序的 速率,并拖慢了整个程序。hadoop提供了什么机制防止这种情况的发生? speculative execution。举个简单的例子,如果某个job有2000个map task,已经完成了1999个,只剩下一个task由于硬件比较慢而成为拖尾 任务,为了减少拖尾任务对整个job运行时间的影响,jobtracker会重新启动一个一模一样的duplicate task和原有的task并行的执行,这样有一 个task执行成功,整个map过程就会结束。speculative execution(推测执行)只有个处理拖尾任务的优化策略,并不能提高系统的可靠性

    14. hadoop推测执行是如何实现的?

     答:Hadoop会为该task启动备份任务,让speculative task与原始task同时处理一份数据,哪个先运行完,则将谁的结果作为最终结果,并且在 运行完成后Kill掉另外一个任务。

    15. Unix中使用命令行,如何查看hadoop集群中的所有运行的任务?或是kill掉任务?

     jps

    16. 什么是hadoop streming?

    答:Haoop支持用其他语言来编程,需要用到名为Streaming的通用API, Streaming主要用于编写简单,短小的MapReduce程序,可以通过脚 本语言编程,开发更快捷,并充分利用非Java库

    17. 解释hadoop和hadoop生态系统两个概念

     答:Hadoop是一个能够对大量数据进行分布式处理的软件框架,Hadoop的核心是HDFS和Mapreduce,hadoop2.0还包括YARN hadoop生态系统:包含 HDFS mapreduce hive hbase zookeeper sqoop flume pig mahout

     18. 说明hadoop2.0的基本构成

     HDFS

     MapReduce

     YARN

     19. 相比于HDFS1.0. 2.0最主要的改进在哪几个方面?

     引入一个新的资源管理系统YARN

     HDFS单点故障得以解决

     Hadoop 2.0的最大变化出现在内核(HDFS、MapReduce和YARN)

    20. 试使用步骤1,步骤2,步骤3.……说明YARN中运行应用程序的基本流程

    步骤1 用户向YARN中提交应用程序,其中包括ApplicationMaster程序、启动ApplicationMaster的命令、用户程序等。

    步骤2 ResourceManager为该应用程序分配第一个Container,并与对应的Node-Manager通信,要求它在这个Container中启动应用程序的 ApplicationMaster。

    步骤3 ApplicationMaster首先向ResourceManager注册,这样用户可以直接通过ResourceManage查看应用程序的运行状态,然后它将为各 个任务申请资源,并监控它的运 行状态,直到运行结束,即重复步骤4~7。

    步骤4 ApplicationMaster采用轮询的方式通过RPC协议向ResourceManager申请和领取资源。

    步骤5 一旦ApplicationMaster申请到资源后,便与对应的NodeManager通信,要求它启动任务Task。

    步骤6 NodeManager为任务Task设置好运行环境(包括环境变量、JAR包、二进制程序等)后,将任务启动命令写到一个脚本中,并通过 运行该脚本启动任务Task。

    步骤7 各个任务Task通过某个RPC协议向ApplicationMaster汇报自己的状态和进度,以让ApplicationMaster随时掌握各个任务的运行状 态,从而可以在任务失败时重新启动任务。 在应用程序运行过程中,用户可随时通过RPC向ApplicationMaster查询应用程序的当前运行状态。

    步骤8 应用程序运行完成后,ApplicationMaster向ResourceManager注销并关闭自己。 10. MapReducer2.0与Yarn是否等同,尝试解释说明。

    21. MapReducer2.0中, MRAppMaster主要作用是什么,MRappMaster如何实现任务容错的?

    22. 什么是MRAppMaster?

    我们知道,在MRv1中,JobTracker存在诸多问题,包括存在单点故障,扩展受限等,为了解决这些问题,Apache对MRv1进行了改进,提 出了YARN,YARN将JobTracker中的作业控制和资源管理两个功能分开,分别由两个不同的进程处理,进而解决了原有JobTracker存在的问 题。经过架构调整之后,YARN已经完全不同于MRv1,它已经变成了一个资源管理平台,或者说应用程序管理框架。运行于YARN之上的计 算框架不只限于MapReduce一种,也可以是其他流行计算框架,比如流式计算、迭代式计算等类型的计算框架。为了将一个计算框架运行于 YARN之上,用户需要开发一个组件—ApplicationMaster。作为一个开始,YARN首先支持的计算框架是MapReduce,YARN为用户实现好了 MapReduce的ApplicationMaster,也就是本文要介绍了MRAppMaster。

    23. 相比于JobTracker,MRAppMaster有什么不同?

    既然MRAppMaster是由JobTracker衍化而来的,那么是否将JobTracker的代码稍加修改,就变成了MRAppMaster呢,答案是否定的。事实 上,YARN仅重用了MRv1中的少许代码,基本可看做重写了MRAppMaster。

    YARN采用了新的软件设计思想,包括对象服务化、事件驱动的异步编程模型的。作为YARN的一部分,MRAppMaster的实现也采用了这 些设计思想。

    下面简要介绍一下MRAppMaster的实现细节 

    在正式介绍MRAppMaster之前,我们先回顾一下MRv1的实现。我们都知道,MRv1主要由两种服务组成,即:JobTracker和TaskTracker, 而在YARN中,TaskTracker已经由NodeManager代替,因此,我们在此重点分析JobTracker。JobTracker包含资源管理和作业控制两个功能, 在YARN中,作业管理由ResourceManager实现,因此,只剩下作业控制这一个功能(由MRAppMaster实现)。MRv1中每个作业由一个 JobInProgress控制,每个任务由一个TaskInProgress控制,由于每个任务可能有多个运行实例,因此,TaskInProgress实际管理了多个运行实 例Task Attempt,对于每个运行实例,可能运行了一个MapTask或者ReduceTask,另外,每个Map Task或者Reduce Task会通过RPC协议将状态 汇报给TaskTracker,再由TaskTracker进一步汇报给JobTracker 在MRAppMaster中,它只负责管理一个作业,包括该作业的资源申请、作业运行过程监控和作业容错等。MRAppMaster使用服务模型和 事件驱动的异步编程模型对JobInProgress和TaskInProgress进行了重写(分别对应JobImpl和TaskImpl),并让Map Task和Reduce Task(Map Task和Reduce Task重用了MRv1中的代码)直接通过RPC将信息汇报给MRAppMaster。此外,为了能够运行于YARN之上,MRAppMaster还要 与ResourceManager和NodeManager两个新的服务通信(用到两个新的RPC协议),以申请资源和启动任务,这些都使得MRAppMaster完全不同于JobTracker。

    24. 为什么会产生yarn,它解决了什么问题。有什么优势?

    25. job的运行流程(提交一个job的流程)

     

    job的执行流程如下: dataInput- >split- >Mapper- >Combine- >(产出临时数据)-->Partition- >Sort- >Reducer- >最终数据

    26. hadoop生态圈中各种框架的运用场景

    27. hive中的压缩格式RCFile.TextFile.SequenceFile各有什么区别,以上三种格式一样大的文件哪个占用空间大小

     textfile(默认) 存储空间消耗比较大,并且压缩的text 无法分割和合并 查询的效率最低,可以直接存储,加载数据的速度最高 sequencefile 存储空间消耗最大,压缩的文件可以分割和合并 查询效率高,需要通过text文件转化来加载 rcfile 存储空间最小,查询的效率最高 ,需要通过text文件转化来加载,加载的速度最低

    28. hadoop中的一个HA压缩

    29. Flume收集到的数据很多个小文件,我而要写MR处理时将这些文件合并(是在MR中进行优化 ,不让一个小文件一个MapReduce)

    30. 你们的集群规模?

     开发集群:10台(8台可用)8核cpu

    31. 你们的数据是用什么导入到数据库的?导入到什么数据库?

    处理之前的导入:通过hadoop命令导入到hdfs文件系统 处理完成之后的导出:利用hive处理完成之后的数据,通过sqoop导出到mysql数据库中,以供报表使用

    32. 你们的业务数据量多大?有多少行数据?(面试三家,都问)

     开发时使用的是部分数据,不是全量数据。有将近一亿行(8. 9千万吧, 全体不详, 一般开发不是特别关心这个问题)

    33. 你们处理数据是直接读数据库的数据还是读文本数据?

     将日志数据导入到hdfs之后时行处理

    34. 你们写hive的hql语句,大概有多少条?

     不清楚,我自己写的时候也没统计

    35. 你们提交job任务大概有多少个?这些job执行完成大概用多少时间(都问。)

     没统计过。加上测试的会很多

    36. hive跟hbase的区别是?

    37. 你在项目中主要的工作任务是?

    利用hive分析数据

    38. 你在项目遇到了哪些难题。是怎么解决的?

     某些任务执行时间过长, 且失败率过高。 检查日志后发现没有执行完就失败,原因出在 hadoop的job的timout过短(相对于集群的能力来说)设置长一点就行

    39. 你自己写过udf函数么?写了哪些

    40. 你的项目提交到job的时候数据量有多大?(常问)

    41. reduce后输出的数据量有多大?

    42. 一个网络商城1天大概产生多少G日志?4tb

    43. 大概有多少条日志记录

    44. 日访问大概有多少个?百万

    45. hdfs的 client端,复制到第三个副本时宕机,hdfs怎么恢复下次写第三副本?block块信息是先写 dataNode还是先写nameNode?

    46. 快排现场写程序实现?

    47. jvm的内存是怎么分配原理?

    48. 毒酒问题---1000桶酒,其中1桶有毒,而一旦吃了,毒性会在一周后发作。问最少需要多少只 老鼠可在一周内找出毒酒?

    49. 用栈实现队列?

    50. 链表倒序实现?

    51. 多线程模型怎么(生产,消费者)? 平时并发多线程都用哪些实现方式?

    52. synchronized是同步悲观锁吗?互斥?怎么写同步提高效率?

     synchronized 关键字相当于 lock(M.class), 是将整个对象锁住,为提高效率,可以使用读写锁

    53. 4亿个数字,找出哪些是重复的,要用最小的比较次数,写程序实现

    54. java是传值还是传址?

    55. java处理多线程,另一线程一直等待?

    56. 在线安装ssh的命令以及文件解压的命令?

    57. 把公钥都追加到授权文件的命令?该命令是否在root用户下执行?

    58. HadoopHA集群中各个服务启动和关闭的顺序?

    59. HDFS中的block块默认保存几份?默认大小多少?

    60. NameNode中的meta数据是存放在NameNode自身还是datanode等其它节点.DataNode节点自身是否有meta数据存在?

    61. 下列哪个程序通常与NameNode在一个节点启动?

    62. 下面哪个程序负责HDFS数据存储?

    63. 在Hadoop HA集群中Zookeeper 的主要作用,以及启动和查看状态的命令?

    sh bin/zkServer.sh start sh bin/zkServer.sh status

    64. HBase在进行模型设计进重点在什么地方?一张表中定义多少个Colum family最合适?为什么?

    65. 如何提高HBase客户端的读写性能?请举例说明。

    66. 基于Hadoop HA集群记性MapReduce开发时,Configuration 如何设置hbase.zookeeper.quorum属性的值?

    67. 在hadoop开发过程中使用过哪些算法?其应用场景是什么?

    68. MapReduce程序如何发布?如果MapReduce中涉及到了第三方的jar包,该如何处理 14. 在实际工作中使用过哪些运维工具,请分别阐述其作用。

    69. hadoop中combiner的作用?

    70. IO的原理。IO模型有几种?

    71. Windows用什么样的模型,Linux用什么样的模型?

    72. 一台机器如何应对那么多的请求访问。高并发到底怎么实现,一个请求怎么产生的。 在服务端怎么处理的。最后怎么返回给用户的。整个的环节操作系统是怎么控制的?

    73. 以你的实际经验,说下怎么样预防全表扫描

    74. 网络七层协议

    76. 集合HashTable和HashMap的区别

    1.HashTable的方法是同步的,HashMap未经同步

    2.HashTable不允许null值(key和value都不可以),HashMap允许null值(key和value都可以)。

    77.zookeeper优点,用在什么场合

    78.HBase中的metastore用来做什么的

     79java优势及原因

     80. jvm优化

     81写一个冒泡排序

    82. hadoop底层存储设计

    83. 文件大小默认64M,改为128有啥影响

     84. RPC原理

    85. NameNode与SecondaryNameNode的区别与联系

     86. 介绍MapReduce整个过程.比如把WordCount的例子的细节讲清楚(重点讲shuffle)

     87. 对Hadoop有没有调优经验.有没有什么使用心得(调优从参数调优说起)

     88. MapReduce出现单点负载过大,怎么负载平衡?(可以用Partioner)

    89. 说说值与引用对象的区别

    90. 谈谈你对反射机制的理解及用途

    91. ArrayList, Vector, LinkdList的区别及其优缺点?HashMap,HashTable的区别及其优缺点?

     92. 列出线程的实现方式? 如何实现同步

     93. 列出至少5种设计模式? 用代码或UML类图描述其中用到的技术难点及其解决思路

     94. 谈谈你最近正在研究的技术.谈谈你最近项目中用到的技术难点及其解决思路

     95. hdfs中的block默认保存几份?

     96. 哪个程序通常与nn在一个节点启动 Jobtracker

     97. 列举几个配置文件优化?

    98. 写出你对zookeeper的理解

    99. DataNode首次加入cluster的时候,如果log报告不兼容文件版本.那需要NameNode执行格式化操作,这样处理的原因是?

    100. 谈谈数据倾斜,如何发生的.并给出优化方案 能够想到的关于数据倾斜的一些解决方式(欢迎补充,尤其是有没有做搜索或者数据挖掘的朋友有碰到类似问题):

    1. 增加reduce 的jvm内存

    2. 增加reduce 个数

    3.customer partition

    4. 其他优化的讨论.

    5. reduce sort merge排序算法的讨论

    6. 正在实现中的hive skewed join.

    7. pipeline

    8. distinct

    9. index 尤其是bitmap index

    101. 介绍一下HBase过滤器

     HBase为筛选数据提供了一组过滤器,通过这个过滤器可以在HBase中的数据的多个维度(行,列,数据版本)上进行对数据的筛选操 作,也就是说过滤器最终能够筛选的数据能够细化到具体的一个存储单元格上(由行键,列明,时间戳定位)。通常来说,通过行键,值 来筛选数据的应用场景较多。

    1. RowFilter:筛选出匹配的所有的行,对于这个过滤器的应用场景,是非常直观的:使用BinaryComparator可以筛选出具有某个行键的行, 或者通过改变比较运算符(下面的例子中是CompareFilter.CompareOp.EQUAL)来筛选出符合某一条件的多条数据,以下就是筛选出行键为 row1的一行数据:

    2. PrefixFilter:筛选出具有特定前缀的行键的数据。这个过滤器所实现的功能其实也可以由RowFilter结合RegexComparator来实现,不过这 里提供了一种简便的使用方法,以下过滤器就是筛选出行键以row为前缀的所有的行:

     3. KeyOnlyFilter:这个过滤器唯一的功能就是只返回每行的行键,值全部为空,这对于只关注于行键的应用场景来说非常合适,这样忽略 掉其值就可以减少传递到客户端的数据量,能起到一定的优化作用

    4. RandomRowFilter:从名字上就可以看出其大概的用法,本过滤器的作用就是按照一定的几率(<=0会过滤掉所有的行,>=1会包含所有的 行)来返回随机的结果集,对于同样的数据集,多次使用同一个RandomRowFilter会返回不通的结果集,对于需要随机抽取一部分数据的应 用场景,可以使用此过滤器:

     102. MapReduce基本执行过程

    103. 谈谈hadoop2和hadoop2的区别

    104. HBase集群安装注意事项

    105. 记录包含值域F和值域G.要别统计相同G值的记录中不同的F值的数目,简单编写过程

    106. HDFS原理.以及各个模块的职责

    107. MR的工作原理

    108. map方法是如何调用reduce方法的.

    109. shell如何判断文件是否存在.如果不存在该如何处理

    108. fsimage和edit的区别

    109. DataNode在什么情况下不会备份

    110. hdfs体系结构

    111. flush的过程  

    112. hadoop集群搭建过程.写出步骤

    113. hadoop集群运行过程中启动哪些线程.各自的作用是什么?

    114. /tmp/hadoop-root/dfs/name the path is not exists or is not accessable. NameNode main 中报错.怎么解决

    115. 工作中编写mapreduce用到的语言. 编写一个mapreduce程序

    116. hadoop 命 >杀死一个job任务 >删除/tmp/aaa/文件目录 >hadoop集群添加或删除节点时.刷新集群状态的命令

    117. hadoop的调度器有哪些?工作原理

    118. mapreduce的join方法有哪些?

    119. Hive无数据保存的方法有哪些?各有什么特点

    120. java实现非递归二分法算法

    121. mapreduce中combiner和Partion的作用

    122. 如何实现 mapreduce的二次排序

    123. hadoop的高度机制

    124. 机架感知

    125. MR数据倾斜原因和解决方案?

    126. 集群HA

    127. 对于HIVE. 你写过哪些UDF函数.作用是什么

    128. hdfs的数据压缩算法

    129. mapreduce的调度模式

    130. hive底层与数据库交互原理

    131. hadoop运行原理

    132. mapreduce的原理

    133. hdfs存储机制

    134. Hive内部表和外部表的区别

    1、在导入数据到外部表,数据并没有移动到自己的数据仓库目录下,也就是说外部表中的数据并不是由它自己来管理的!而 表则不一 样;

    2、在删除表的时候,Hive将会把属于表的元数据和数据全部删掉;而删除外部表的时候,Hive仅仅删除外部表的元数据,数 据 是不会 删除的! 那么,应该如何选择使用哪种表呢?在大多数情况没有太多的区别,因此选择只是个人喜好的问题。但是作为一个经验,如 果所有处理 都需要由Hive完成,那么你应该创建表,否则使用外部表!

    135. HBase的rowkey怎么创建比较好.列族怎么创建比较好

    136. 用mapreduce怎么处理数据倾斜问题?

    137. hadoop框架中中怎么优化.

    138. HBase内部什么机制

    139. 我们在开发分布式计算job的.是否可以去掉reduce阶段

    140. hive底层与数据库交互原理

     

    尽早把自己的生活折腾成自己想要的样子
  • 相关阅读:
    ASP.NET程序中常用的三十三种代码【转】
    BTree,BTree,B+Tree,B*Tree都是什么
    调用Google地图
    JS特效总结
    2005 加入博客园
    .net Windows服务程序安装与安装程序的制作
    七夕,爱似流年
    JS+CSS仿魔兽游戏进入进度条特效
    常用正则表达式
    Google翻译网站添加Google翻译,让老外也看的懂你的网站
  • 原文地址:https://www.cnblogs.com/v-lcc/p/9769564.html
Copyright © 2020-2023  润新知