Hadoop MapReduce采用Master/Slave结构
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类型读出
NLineInputFormat 0.18.x新加入,可以将文件以行为单位进行split,比如文件的每一行对应一个map。得到的key是每一行 的位置偏移量(LongWritable类型),value是每一行的内容,Text类型。
CompositeInputFormat用于多个数据源的join。
extOutputFormat,输出到纯文本文件,格式为 key + " " + value。
NullOutputFormat,hadoop中的/dev/null,将输出送进黑洞。
SequenceFileOutputFormat, 输出到sequence file格式文件。
MultipleSequenceFileOutputFormat, MultipleTextOutputFormat,根据key将记录输出到不同的文件。
DBInputFormat和DBOutputFormat,从DB读取,输出到DB。
2. TextInputFormat和KeyValueInputFormat类不同之处在于哪里?
3. Hadoop中InputSplit是什么?
InputSplit是指分片,在MapReduce作业中,作为map task最小输入单位。分片是基于文件基础上出来的概念,通俗的理解一个文件可以切分为多少个片段,每个片段包括了<文件名,开始位置,长度,位于哪些主机>等信息。在 MapTask 拿到这些分片后,会知道从哪开始读取数据。
4. Hadoop框架中文件拆分是如何被触发的?
5. 考虑一种情况:Map/Reduce系统中,HDFS块大小是64MB,输入格式FileInputFormat,有三个文件64K,65MB,127MB,
那么有hadoop框架会将输入划分成多少?
6. hadoop中的RecordReader的目的是什么?
系统默认的LineRecordReader是按照每行的偏移量做为map输出时的key值,每行的内容作为map的value值,默认的分隔符是 回车和换行。
现在要更改map对应的输入的<key,value>值,key对应的文件的路径(或者是文件名),value对应的是文件的内容 (content)。
那么我们需要重写InputFormat和RecordReader,因为RecordReader是在InputFormat中调用的,当然重写RecordReader才是重点!
7. 如果hadoop中没有定义定制分区,那么如何在输出到reduce前执行数据分区?
Partitioner /override getPartition()
8. 什么是Combiner?举个例子,什么时候使用combiner,什么时候不用?
当map生成的数据过大时,带宽就成了瓶颈,怎样精简压缩传给Reduce的数据,有不影响最终的结果呢。有一种方法就是使 用Combiner,Combiner号称本地的Reduce,Reduce最终的输入,是Combiner的输出
9. 什么是jobtracker? jobtracker有哪些特别的函数?
10. 什么是tasktracker?
11. hadoop中job和task之间是什么关系?
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推测执行是如何实现的?
15. Unix中使用命令行,如何查看hadoop集群中的所有运行的任务?或是kill掉任务?
jps
16. 什么是hadoop streming?
Haoop支持用其他语言来编程,需要用到名为Streaming的通用API, Streaming主要用于编写简单,短小的MapReduce程序,可以通过脚本语言编程,开发更快捷,并充分利用非Java库
hadoop jar contrib/streaming/hadoop-streaming-0.20.203.0.jar \
>-input cite75_99.txt \
> -output output \
>-mapper 'cut -f 2 -d ,' \
>-reducer 'uniq'
================================================================================
1. 自动化运维了解过吗?你们是否是自动化运维管理?
统部署
一、Kickstart
主要针对Redhat和CentOS操作系统的安装和初始配置,不过网络的配置仍然需要一台一台地进行。
二、Cobbler
与Kickstart类似,主要支持的也是Redhat和CentOS,不过它操作起来更简单了。新版操作系统源中带。
系统更新和应用部署
一、Puppet
支持升级软件包、管理配置文件、系统服务、cron任务以及添加新的配置、修复错误。客户端需要安装软件。服务和客户端都需要Ruby环境支持。提供基于SSL的认证机制。
新版操作系统源中带。
二、Func
支持主控机上一次管理任意多台服务器,或任意多个服务器组;
SSL证书管理体系;
提供常用的管理模块;
支持直接发送命令和磁盘挂载;
6. 解释hadoop和hadoop生态系统两个概念
7. 说明hadoop2.0的基本构成
HDFS
MapReduce
YARN
8. 相比于HDFS1.0.2.0最主要的改进在哪几个方面?
引入一个新的资源管理系统YARN
HDFS单点故障得以解决
Hadoop 2.0的最大变化出现在内核(HDFS、MapReduce和YARN)
9. 试使用步骤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是否等同,尝试解释说明。
11. MapReducer2.0中, MRAppMaster主要作用是什么,MRappMaster如何实现任务容错的?
1. 什么是MRAppMaster?
我们知道,在MRv1中,JobTracker存在诸多问题,包括存在单点故障,扩展受限等,为了解决这些问题,Apache对MRv1进行了改进,提出了YARN,YARN将JobTracker中的作业控制和资源管理两个功能分开,分别由两个不同的进程处理,进而解决了原有JobTracker存在的问题。经过架构调整之后,YARN已经完全不同于MRv1,它已经变成了一个资源管理平台,或者说应用程序管理框架。运行于YARN之上的计算框架不只限于MapReduce一种,也可以是其他流行计算框架,比如流式计算、迭代式计算等类型的计算框架。为了将一个计算框架运行于YARN之上,用户需要开发一个组件—ApplicationMaster。作为一个开始,YARN首先支持的计算框架是MapReduce,YARN为用户实现好了MapReduce的ApplicationMaster,也就是本文要介绍了MRAppMaster。
2. 相比于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。
在接下来几篇文章中,我将重点剖析MRAppMaster的内部实现原理。
12. 为什么会产生yarn,它解决了什么问题。有什么优势?
13. job的运行流程(提交一个job的流程)
job的执行流程如下: dataInput-->split-->Mapper-->Combine-->(产出临时数据)-->Partition-->Sort-->Reducer-->最终数据
14. hadoop生态圈中各种框架的运用场景
15. hive中的压缩格式RCFile.TextFile.SequenceFile各有什么区别,以上三种格式一样大的文件哪个占用空间大小
textfile(默认) 存储空间消耗比较大,并且压缩的text 无法分割和合并 查询的效率最低,可以直接存储,加载数据的速度最高
sequencefile 存储空间消耗最大,压缩的文件可以分割和合并 查询效率高,需要通过text文件转化来加载
rcfile 存储空间最小,查询的效率最高 ,需要通过text文件转化来加载,加载的速度最低
16. hadoop中的一个HA压缩
17. Flume收集到的数据很多个小文件,我而要写MR处理时将这些文件合并(是在MR中进行优化
,不让一个小文件一个MapReduce)
===============================
1. 你们的集群规模?
开发集群:10台(8台可用)8核cpu
2. 你们的数据是用什么导入到数据库的?导入到什么数据库?
处理之前的导入:通过hadoop命令导入到hdfs文件系统
处理完成之后的导出:利用hive处理完成之后的数据,通过sqoop导出到mysql数据库中,以供报表使用?
3. 你们的业务数据量多大?有多少行数据?(面试三家,都问)
开发时使用的是部分数据,不是全量数据。有将近一亿行(8. 9千万吧, 全体不详,
一般开发不是特别关心这个问题)
4. 你们处理数据是直接读数据库的数据还是读文本数据?
将日志数据导入到hdfs之后时行处理
5. 你们写hive的hql语句,大概有多少条?
不清楚,我自己写的时候也没统计
6. 你们提交job任务大概有多少个?这些job执行完成大概用多少时间(都问。)
没统计过。加上测试的会与很多
7. hive跟hbase的区别是?
8. 你在项目中主要的工作任务是?
利用hive分析数据
9. 你在项目遇到了哪些难题。是怎么解决的?
某些任务执行时间过长, 且失败率过高。 检查日志后发现没有执行完就失败,原因出在
hadoop的job的timout过短(相对于集群的能力来说)设置长一点就行
10. 你自己写过udf函数么?写了哪些
11. 你的项目提交到job的时候数据量有多大?(常问)
12. reduce后输出的数据量有多大?
13. 一个网络商城1天大概产生多少G日志?4tb
14. 大概有多少条日志记录(在不清楚情况下)
15. 日访问大概有多少个?百万
================================
1. hdfs的 client端,复制到第三个副本时宕机,hdfs怎么恢复下次写第三副本?block块信息是先写
dataNode还是先写nameNode?
2. 快排现场写程序实现?
3. jvm的内存是怎么分配原理?
4. 毒酒问题---1000桶酒,其中1桶有毒,而一旦吃了,毒性会在一周后发作。问最少需要多少只
老鼠可在一周内找出毒酒?
5. 用栈实现队列?
6. 链表倒序实现?
7. 多线程模型怎么(生产,消费者)? 平时并发多线程都用哪些实现方式?
8. synchronized是同步悲观锁吗?互斥?怎么写同步提高效率?
synchronized 关键字相当于 lock(M.class), 是将整个对象锁住,为提高效率,可以使用读写锁
9. 4亿个数字,找出哪些是重复的,要用最小的比较次数,写程序实现
10. java是传值还是传址?
11. java处理多线程,另一线程一直等待?
============================
1. 在线安装ssh的命令以及文件解压的命令?
2. 把公钥都追加到授权文件的命令?该命令是否在root用户下执行?
3. HadoopHA集群中各个服务启动和关闭的顺序?
4. HDFS中的block块默认保存几份?默认大小多少?
5. NameNode中的meta数据是存放在NameNode自身还是datanode等其它节点.DataNode节点自身是否有meta数据存在?
6. 下列哪个程序通常与NameNode在一个节点启动?
7. 下面哪个程序负责HDFS数据存储?
8. 在Hadoop HA 集群中Zookeeper 的主要作用,以及启动和查看状态的命令?
sh bin/zkServer.sh start
sh bin/zkServer.sh status
9. HBase在进行模型设计进重点在什么地方?一张表中定义多少个Colum family最合适?为什么?
10. 如何提高HBase客户端的读写性能?请举例说明。
11. 基于Hadoop HA集群记性MapReduce开发时,Configuration 如何设置hbase.zookeeper.quorum属性的值?
12. 在hadoop开发过程中使用过哪些算法?其应用场景是什么?
13. MapReduce程序如何发布?如果MapReduce中涉及到了第三方的jar包,该如何处理
14. 在实际工作中使用过哪些运维工具,请分别阐述其作用。
15. hadoop中combiner的作用?
16. IO的原理。IO模型有几种?
17. Windows用什么样的模型,Linux用什么样的模型?
18. 一台机器如何应对那么多的请求访问。高并发到底怎么实现,一个请求怎么产生的。
在服务端怎么处理的。最后怎么返回给用户的。整个的环节操作系统是怎么控制的?
=========================================================================================
1. 数据库第一,二,三范式
第一范式是不可拆分(原子)
第二是完全依赖
第三消除传递依赖
2. 给出两张表,优化表
3. 以你的实际经验,说下怎么样预防全表扫描
4. 网络七层协议
5. 多线程
6. 集合HashTable和HashMap的区别
1.HashTable的方法是同步的,HashMap未经同步
2.HashTable不允许null值(key和value都不可以),HashMap允许null值(key和value都可以)。
7. 操作系统碎片
8. zookeeper优点,用在什么场合
9. HBase中的metastore用来做什么的
============================================================
1. 你胜任该职位有什么优势
2 .java优势及原因
3. jvm优化
4. 写一个冒泡排序
5. hadoop底层存储设计
=========================================================
1. 文件大小默认64M,改为128有啥影响
2. RPC原理
3. NameNode与SecondaryNameNode的区别与联系
4. 介绍MapReduce整个过程.比如把WordCount的例子的细节讲清楚(重点讲shuffle)
5. 对Hadoop有没有调优经验.有没有什么使用心得(调优从参数调优说起)
6. MapReduce出现单点负载过大,怎么负载平衡?(可以用Partioner)
7. MapReduce怎么实现Top10
===================================================
1. 说说值与引用对象的区别
2. 谈谈你对反射机制的理解及用途
3. ArrayList, Vector, LinkdList的区别及其优缺点?HashMap,HashTable的区别及其优缺点?
4. 列出线程的实现方式? 如何实现同步
5. 列出至少5种设计模式? 用代码或UML类图描述其中用到的技术难点及其解决思路
6. 谈谈你最近正在研究的技术.谈谈你最近项目中用到的技术难点及其解决思路
===================================================================================
1. hdfs中的block默认保存几份?
2. 哪个程序通常与nn在一个节点启动
Jobtracker
3. 列举几个配置文件优化?
4. 写出你对zookeeper的理解
5. DataNode首次加入cluster的时候,如果log报告不兼容文件版本.那需要NameNode执行格式化操作,这样处理的原因是?
6. 谈谈数据倾斜,如何发生的.并给出优化方案
能够想到的关于数据倾斜的一些解决方式(欢迎补充,尤其是有没有做搜索或者数据挖掘的朋友有碰到类似问题):
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
7. 介绍一下HBase过滤器
HBase为筛选数据提供了一组过滤器,通过这个过滤器可以在HBase中的数据的多个维度(行,列,数据版本)上进行对数据的筛选操作,也就是说过滤器最终能够筛选的数据能够细化到具体的一个存储单元格上(由行键,列明,时间戳定位)。通常来说,通过行键,值来筛选数据的应用场景较多。
1. RowFilter:筛选出匹配的所有的行,对于这个过滤器的应用场景,是非常直观的:使用BinaryComparator可以筛选出具有某个行键的行,或者通过改变比较运算符(下面的例子中是CompareFilter.CompareOp.EQUAL)来筛选出符合某一条件的多条数据,以下就是筛选出行键为row1的一行数据:
2. PrefixFilter:筛选出具有特定前缀的行键的数据。这个过滤器所实现的功能其实也可以由RowFilter结合RegexComparator来实现,不过这里提供了一种简便的使用方法,以下过滤器就是筛选出行键以row为前缀的所有的行:
3. KeyOnlyFilter:这个过滤器唯一的功能就是只返回每行的行键,值全部为空,这对于只关注于行键的应用场景来说非常合适,这样忽略掉其值就可以减少传递到客户端的数据量,能起到一定的优化作用:
4. RandomRowFilter:从名字上就可以看出其大概的用法,本过滤器的作用就是按照一定的几率(<=0会过滤掉所有的行,>=1会包含所有的行)来返回随机的结果集,对于同样的数据集,多次使用同一个RandomRowFilter会返回不通的结果集,对于需要随机抽取一部分数据的应用场景,可以使用此过滤器:
8. MapReduce基本执行过程
9. 谈谈hadoop2和hadoop2的区别
10. HBase集群安装注意事项
11. 记录包含值域F和值域G.要别统计相同G值的记录中不同的F值的数目,简单编写过程
12. HDFS原理.以及各个模块的职责
13. MR的工作原理
14. map方法是如何调用reduce方法的.
15. shell如何判断文件是否存在.如果不存在该如何处理
16. fsimage和edit的区别
17. DataNode在什么情况下不会备份
18. hdfs体系结构
19. flush的过程
===================================================================================
1. hadoop集群搭建过程.写出步骤
2. hadoop集群运行过程中启动哪些线程.各自的作用是什么?
3. /tmp/hadoop-root/dfs/name the path is not exists or is not accessable. NameNode main 中报错.怎么解决
4. 工作中编写mapreduce用到的语言. 编写一个mapreduce程序
5. hadoop 命
>杀死一个job任务
>删除/tmp/aaa/文件目录
>hadoop集群添加或删除节点时.刷新集群状态的命令
6. hadoop的调度器有哪些?工作原理
7. mapreduce的join方法有哪些?
9. Hive无数据保存的方法有哪些?各有什么特点
10. java实现非递归二分法算法
11. mapreduce中combiner和Partion的作用
12. 如何实现 mapreduce的二次排序
13. hadoop的高度机制
14. 机架感知
15. MR数据倾斜原因和解决方案?
16. 集群HA
17. 对于HIVE. 你写过哪些UDF函数.作用是什么
18. hdfs的数据压缩算法
19. mapreduce的调度模式
20. hive底层与数据库交互原理
--------------------------------------------------------------
1. hadoop运行原理
2. mapreduce的原理
3. hdfs存储机制
======================================================
1. Hive内部表和外部表的区别
1、在导入数据到外部表,数据并没有移动到自己的数据仓库目录下,也就是说外部表中的数据并不是由它自己来管理的!而 表则不一样;
2、在删除表的时候,Hive将会把属于表的元数据和数据全部删掉;而删除外部表的时候,Hive仅仅删除外部表的元数据,数 据 是不会删除的!
那么,应该如何选择使用哪种表呢?在大多数情况没有太多的区别,因此选择只是个人喜好的问题。但是作为一个经验,如 果所有处理都需要由Hive完成,那么你应该创建表,否则使用外部表!
2. HBase的rowkey怎么创建比较好.列族怎么创建比较好
3. 用mapreduce怎么处理数据倾斜问题?
4. hadoop框架中中怎么优化.
5. HBase内部什么机制
6. 我们在开发分布式计算job的.是否可以去掉reduce阶段
7. hive底层与数据库交互原理
==================================================================================
JobTracker和TaskTracker概述
一 概述:
(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)。
===================================================================================================================
下面列出一些Hadoop组件,不同的组件分别提供特定的服务。
Apache Hive:数据仓库基础设施,提供数据汇总和特定查询。这个系统支持用户进行有效的查询,并实时得到返回结果。
Apache Spark:Apache Spark是提供大数据集上快速进行数据分析的计算引擎。它建立在HDFS之上,却绕过了MapReduce使用自己的数据处理框架。Spark常用于实时查询、流处理、迭代算法、复杂操作运算和机器学习。
Apache Ambari:Ambari用来协助管理Hadoop。它提供对Hadoop生态系统中许多工具的支持,包括Hive、HBase、Pig、 Spooq和ZooKeeper。这个工具提供集群管理仪表盘,可以跟踪集群运行状态,帮助诊断性能问题。
Apache Pig:Pig是一个集成高级查询语言的平台,可以用来处理大数据集。
Apache HBase:HBase是一个非关系型数据库管理系统,运行在HDFS之上。它用来处理大数据工程中稀疏数据集。
其他常见的Hadoop项目还包括Avro、Cassandra、Chukwa, Mahout和ZooKeeper。
==============================================================================
1、如果需要保持HDFS上的目录结构,原封不动地复制下来,采用下面的命令:
set hive.exec.compress.output='false';
INSERT OVERWRITE LOCAL DIRECTORY '/home/hesey/directory' select * from table;
2、如果想把表的所有数据都下载到一个文件中,则采用下面的命令:
hadoop dfs -getmerge hdfs://hdpnn:9000/hesey/hive/table /home/hesey/table.txt
这样所有文件会由Hadoop合并后下载到本地,最后就只有/home/hesey/table.txt这一个文件
(User Defined Function)。
1、使用UDF
(a)如果是已经上传到Hive服务器的UDF,可以直接用
create temporary function dosomething as 'net.hesey.udf.DoSomething';
声明临时函数,然后在下面的Hive QL中就可以调用dosomething这个方法了。
(b)如果是自己编写的UDF,需要在声明临时函数前再加一行:
add jar /home/hesey/foo.jar
这样就可以把自定义的UDF加载进来,然后和(a)一样声明临时函数就可以了。
2、编写UDF
编写UDF十分简单,引入hive-exec包,继承org.apache.hadoop.hive.ql.exec.UDF类,实现evaluate方法即可,方法的输入和输出参数类型就是当你在Hive中调用时的输入和返回值。
例如:
public Text evaluate(final LongWritable number);
(Text和LongWritable是org.apache.hadoop.io下面的类)
这样我们就可以定义自己的函数并方便地在Hive中调用,而不需要写一个重量级的MapReduce。
五、笛卡尔积
Hive本身是不支持笛卡尔积的,不能用select T1.*, T2.* from table_1, table_2这种语法。但有时候确实需要用到笛卡尔积的时候,可以用下面的语法来实现同样的效果:
select T1.*, T2.* from
(select * from table1) T1
join
(select * from table2) T2
on 1=1;
其中on 1=1是可选的,注意在Hive的Strict模式下不能用这种语法,需要先用set hive.mapred.mode=nonstrict;设为非strict模式就可以用了。
六、join的规则
当Hive做join运算时,join前面的表会被放入内存,所以在做join时,最好把小表放在前面,有利于提高性能并防止OOM。
七、排序
在SQL中排序通过ORDER by实现,Hive中也支持这种语法,但是使用ORDER by时最终所有的数据会汇总到一个Reducer上进行排序,可能使得该Reducer压力非常大,任务长时间无法完成。
如果排序只要求保证Value有序而Key可以无序,例如要统计每个用户每笔的交易额从高到低排列,只需要对每个用户的交易额排序,而用户ID本身不需要排序。这种情况采用分片排序更好,语法类似于:
select user_id, amount from table distribute by user_id sort by user_id, amount
这里用到的不是ORDER by,而是distribute by和sort by,distribute by标识Map输出时分发的Key。
这样最后排序的时候,相同的user_id和amount在同一个Reducer上被排序,不同的user_id可以同时分别在多个Reducer上排序,相比ORDER by只能在一个Reducer上排序,速度有成倍的提升。