第1题、简要描述如何安装配置一个apache开源hadoop,只描述即可,无需列出完整步骤。能列出步骤更好。
1、创建 hadoop帐户。
2、setup.改IP。
3、安装java,并修攕 /etc/profile文件,配置 java的环境变量。
4、修改Host文件域名。
5、安装SSH,配置无密钥通信。
6、解压hadoop。
7、配置conf文件? hadoop-env.sh、core-site.sh、mapre-site.sh、hdfs-site.sh。
8、配置hadoop的环境变量。
9.Hadoop namenode -format
10.start-dfs.sh start-yarn.sh
第2题、请列出正常工作的Hadoop集群中Hadoop都分别需要启动哪些进程。他们的作用分别是什么,尽可能写的全面些。
(1)namenode节点
namenode:管理集群,并记录 datanode文件信息。
SecondaryName:可以做冷备,对一定范围内数据做快照性备份。
Master:Spark主节点
Jobtracker :管理任务,并将任务分配给 tasktracker。
Tasktracker:任务执行方。
ResourceManager:负责集群中所有资源的统一管理和分配,它接受来自各个节点(NodeManager)的资源汇报信息,
并把这些信息按照一定的策略分配给各个应用程序(实际上是ApplicationManager)
(2)node节点
Datanode:存储数据
NodeManager:Yarn中每个节点上的代理,它管理Hadoop集群中单个计算节点,包括与ResourceManager保持通信,监督Container的生命周期管理。
Worker:工作节点
第3题、启动Hadoop时报如下错误,如何解决
Error Directory /tmp/hadoop-root/dfs/name is in an inconsistent state storage directory does not exist or is not accessible.
可能的原因:1、hdfs没有启动成功,通过查看jps确认下。
2、确认文件是否存在。
第4题、请写出以下执行命令
1)杀死一个Job
hadoop job -list 拿到jobid,
./hadoop job -kill job_201212111628_11166
2)删除hdfs上的/tmp/aaa 目录
hadoop fs -rmr /spark/output
3)加入一个新的存储节点和删除一个计算节点需要刷新集群状态命令
bin/Hadoop-daemon.sh start DataNode
bin/yarn-daemon.sh start nodemanager
动态的加入集群
bin/Hadoop-daemon.sh --config ./conf start DataNode
bin/yarn-daemon.sh --config ./conf start nodemanager
删除时:
hadoop mradmin -refreshnodes
hadoop dfsadmin -refreshnodes
hdfs dfsadmin -refreshNodes
查看集群情况:
hdfs dfsadmin -report
集群自均衡完成
sbin/start-balancer.sh -threshold 5
yarn框架启动
yarn-daemon.sh start nodemanager
查看集群情况
yarn node -list
---------------------------------------------------------------------------------------
第5题、请列出你所知道的hadoop调度器,并简要说明其工作方法。
Fifo schedular :即先来先服务,在该调度机制下,所有作业被统一提交到一个队列中,hadoop按照提交顺序依次运行这些作业。
典型的应用有以下几种:
批处理作业:这种作业往往耗时很长,对时间完成一半没有严格要求,如数据挖掘,机器学习等方面的应用程序。
交互式作业:这种作业期望能及时放回结果(sql查询,hive)等
生产性作业:这种作业要求有一定量得资源保证,如统计值计算,垃圾数据分析等。
---yarn支持的调度器-------------------------------
Capacity schedular :计算能力调度器,选择占用最小、优先级高的先执行,依此类推。
Fair schedular:公平调度,所有的job具有相同的资源。
-----------
资源表示模型(container)
当前yarn支持内存和cpu两种资源类型的管理和分配,yarn采用了动态资源分配机制。nodemanager启动时会向resourceManager注册,注册信息中包含该节点可分配的cpu和内存总量。
yarn.nodemanager.resource.memory-mb:可分配的物理内存总量,默认是8mb*1024,即8G
yarn.nodemanager.vmem-pmem-ratio:任务使用单位物理内存量对应最多可使用的虚拟内存量,默认值是2.1,表示每1mb的物理内存,最多可以使用2.1mb虚拟内存总量
yarn.nodemanager.resource.cpu-vcores:可分配的虚拟cpu个数,默认是8.为了更细粒度的划分cpu资源和考虑到cpu性能异构性,yarn允许管理员根据实际需要和cpu性能将每个物理cpu划分成若干个虚拟cpu,二管理员可以为每个节点单独配置可用的虚拟cpu个数,且用户提交应用程序时,也可指定每个人物需要的虚拟cpu个数。比如node1节点上面有8个cpu,node2上有16个cpu,且node1的cpu是node2的2倍,那么可为这2个节点配置相同数目的虚拟cpu个数,比如均为32.由于用户设置虚拟cpu个数必须是整数,每个任务最少使用node2的半个cpu。
ps:出了cpu和内存两种资源,服务器还有很多其他资源,比如磁盘容量,网络和磁盘io等,yarn可能在将来支持这些资源的调度。
名词解释:
是否支持动态加载配置文件:2种调度器的配置文件修改后是否能够动态生效。
是否支持负载均衡:fair schedler提供了一个基于任务数目的负载均衡机制,改机制尽可能将系统中的任务均匀分配到各个节点上,此外用户也可以根据自己的需要设计负载均衡策略。
是否支持资源抢占:每个队列可以设置一个最小资源量和最大资源量。为了提高资源利用率,资源调度器会将负载较轻的队列的资源暂时分配给负载较重的队列,仅当负载较轻的队列突然收到需要资源请求时,调度器才进一步将本属于该队列的资源分配给他,因为这个时候资源可能正在被别的队列使用,所以调度器要等那个队列释放资源释放资源才能将资源归还,这通常需要一段不确定的等待时间,为了防止应用程序等待时间太长,调度器等待一段时间后,发现资源并为得到释放,则进行资源抢占。
fifo:按照优先级高低调度,如果优先级相同,则按照提交时间先后顺序调度,如果提交时间也相同,则按照(队列或者应用程序)名称大小(字符串比较)调度。
fair:按照内存资源使用量比率调度,即按照used_memory/minshare大小调度(核心思想是按照该调度算法决定调度顺序。)如果一个队列中有2个应用程序同时运行,则每个得到1/2的资源,如果是3个则是1/3.
drf:按照主资源公平调度算法进行调度,drf被证明非常适合应用于多资源和复杂需求的环境中,因此被越来越多的系统采用,包括apache mesos。在drf算法中,将所需份额(资源比例)最大的资源成为主资源,而drf的基本设计思想则是将最大最小公平算法应用于主资源上。即drf总是最大化所有主资源中最小的。
假设系统中共有9个cpu和18gb ram,有2个用户分别运行了2种任务,分别需要的资源量为a:<1cpu,4gb>,b:<3cpu,1gb>对于用户a,每个任务要消耗总cpu的1/9和总内存的2.9,a的主资源为内存;b的主资源为cpu。
所以最终a的资源分配为:<3cpu,12gb>可以运行3个任务,b的资源分配为<6cpu,2gb>可运行2个任务。
-----------------------------------------------------------------------------------
第6题、请列出在你以前的工作中所有使用过的开发map/reduce的语言
java、python、hql、scala
---------------------------------------------------------------------
第7题、当前日志采集格式为
a、b、c、d
b、b、f、e
a、a、c、f
请用你最熟悉的语言编写一个map/reduce程序,计算第四列每个元素出现的个数
java:
public class WordCount{
public static class WordCountMap extends Mapper
{
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
StringTokenizer itr = new StringTokenizer(value.toString());
while(itr.hasMoreTokens()){
word.set(itr.nextToken());
context.write(word,one);
}
}
}
public static class IntSumReducer extends{
private IntWritable result = new IntWritable();
public void reduce(Text key,Iterable values,Context context) throws IOException,InterruptedException{
int sum = 0;
for(IntWritable val : values){
sum += val.get();
}
result.set(sum);
context.write(key,result);
}
}
public static void main(String[] args) throws Exception{
Configuration conf = new Configuration();
String[] ioArgs = new String[]{"hdfs://localhost:9000/input","hdfs://localhost:9000/output"};
String[] otherArgs = new GenericOptionsParser(conf,ioArgs).getRemainingArgs();
if(otherArgs.length != 2){
System.out.println("Usage:wordcount");
System.exit(2);
}
}
scala:
val rdd = sc.textFile("hdfs://192.168.1.30:9000/spark/test.txt")
rdd.cache()
val wordcount = rdd.flatMap(_.split(",")).map(x=>(x,1)).reduceByKey(_+_).collect().foreach(println)
---------------------------------------------------------
第8题 你认为用Java,Streaming,pipe方式开发map/reduce,各有哪些优缺点
1、Java写MapReduce可以实现复杂的逻辑,如果需求简单,则显得繁琐
2、HiveQL基本都是针对hive中的表数据进行编写,但对复杂的逻辑很难进行实现。写起来简单。
第9题 Hive有哪些方式保存元数据的,各有哪些特点
三种:内存数据库derby,挺小,不常用。
本地mysql... 常用
远程端mysql... 不常用
第10题 请简述hadoop怎样实现二级排序
在mr中,所有的key是需要被比较和排序的,并且是二次,先根据partitione,再根据大小。而本例中也是要比较两次。
先按照第一字段排序,然后再对第一字段相同的按照第二字段排序。根据这一点,我们可以构造一个复合类IntPair,他有两个字段,
先利用分区对第一字段排序,再利用分区内的比较对第二字段排序。
有两种方法进行二次排序,分别为:buffer and in memory sort和 value-to-key conversion。
对于buffer and in memory sort,主要思想是:在reduce()函数中,将某个key对应的所有value保存下来,然后进行排序。 这种方法最大的缺点是:可能会造成out of memory。
对于value-to-key conversion,主要思想是:将key和部分value拼接成一个组合key(实现WritableComparable接口或者调用setSortComparatorClass函数),这样reduce获取的
结果便是先按key排序,后按value排序的结果,需要注意的是,用户需要自己实现Paritioner,以便只按照key进行数据划分。Hadoop显式的支持二次排序,在Configuration类中
有个setGroupingComparatorClass()方法,
第11题 简述hadoop实现join的几种方法
假设要进行join的数据分别来自File1和File2.
2.1 reduce side join
reduce side join是一种最简单的join方式,其主要思想如下:
在map阶段,map函数同时读取两个文件File1和File2,为了区分两种来源的key/value数据对,对每条数据打一个标签(tag),比如:tag=0表示来自文件File1,tag=2表示来自文件File2。
即:map阶段的主要任务是对不同文件中的数据打标签。在reduce阶段,reduce函数获取key相同的来自File1和File2文件的value list,
然后对于同一个key,对File1和File2中的数据进行join(笛卡尔乘积)。即:reduce阶段进行实际的连接操作。
2.2 map side join
之所以存在reduce side join,是因为在map阶段不能获取所有需要的join字段,即:同一个key对应的字段可能位于不同map中。Reduce side join是非常低效的,因为shuffle阶段要进行大
量的数据传输。Map side join是针对以下场景进行的优化:两个待连接表中,有一个表非常大,而另一个表非常小,以至于小表可以直接存放到内存中。这样,我们可以将小表复制多份,
让每个map task内存中存在一份(比如存放到hash table中),然后只扫描大表:对于大表中的每一条记录key/value,在hash table中查找是否有相同的key的记录,如果有,则连接后输出即可。
为了支持文件的复制,Hadoop提供了一个类DistributedCache,使用该类的方法如下:
(1)用户使用静态方法DistributedCache.addCacheFile()指定要复制的文件,它的参数是文件的URI(如果是HDFS上的文件,可以这样:hdfs://namenode:9000/home/XXX/file,其中9000是自己配
置的NameNode端口号)。JobTracker在作业启动之前会获取这个URI列表,并将相应的文件拷贝到各个TaskTracker的本地磁盘上。(2)用户使用DistributedCache.getLocalCacheFiles()方法获取文件
目录,并使用标准的文件读写API读取相应的文件。
2.3 SemiJoin
SemiJoin,也叫半连接,是从分布式数据库中借鉴过来的方法。它的产生动机是:对于reduce side join,跨机器的数据传输量非常大,这成了join操作的一个瓶颈,如果能够在map端过滤掉不会
参加join操作的数据,则可以大大节省网络IO。实现方法很简单:选取一个小表,假设是File1,将其参与join的key抽取出来,保存到文件File3中,File3文件一般很小,可以放到内存中。
在map阶段,使用DistributedCache将File3复制到各个TaskTracker上,然后将File2中不在File3中的key对应的记录过滤掉,剩下的reduce阶段的工作与reduce side join相同。
2.4 reduce side join + BloomFilter
在某些情况下,SemiJoin抽取出来的小表的key集合在内存中仍然存放不下,这时候可以使用BloomFiler以节省空间。
BloomFilter最常见的作用是:判断某个元素是否在一个集合里面。它最重要的两个方法是:add() 和contains()。最大的特点是不会存在false negative,即:如果contains()返回false,则该元素一定
不在集合中,但会存在一定的true negative,即:如果contains()返回true,则该元素可能在集合中。因而可将小表中的key保存到BloomFilter中,在map阶段过滤大表,可能有一些不在小表中的记录没
有过滤掉(但是在小表中的记录一定不会过滤掉),这没关系,只不过增加了少量的网络IO而已。
第12题 请用java实现非递归二分查找
第13题 请简述MapReduce中combiner,partition作用
combiner:实现的功能根reduce差不多,接收map的值,经过计算后给reduce,它的key,value类型要跟reduce完全一样,当reduce业务复杂时可以用,不过它貌似只是操作本机的数据。
partition:将输出的结果分别保存在不同的文件中...
第14题 某个目录下有两个文件a.txt b.txt,文件格式为(ip username),例如:
a.txt
127.0.0.1 zhangsan
127.0.0.1 wangxiaoer
127.0.0.1 lisi
127.0.0.1 wagnwu
b.txt
127.0.0.4 lixiaolu
127.0.0.1 lisi
每个文件至少有100万行,请使用linux命令行完成如下工作:
1)两个文件各自的ip数,以及总ip数
2)出现在b.txt而没有出现在a.txt的ip
3)每个username出现的次数 以及 每个username对应的ip数
------------coding----------------
----------------------------------------------------------------------