1.0 简要描述如何安装配置apache的一个开源hadoop,只描述即可,无需列出具体步骤,列出具体步骤更好。
答:第一题:1使用root账户登录
2 修改IP
3 修改host主机名
4 配置SSH免密码登录
5 关闭防火墙
6 安装JDK
6 解压hadoop安装包
7 配置hadoop的核心文件 hadoop-env.sh,core-site.xml , mapred-site.xml , hdfs-site.xml
8 配置hadoop环境变量
9 格式化 hadoop namenode-format
10 启动节点start-all.sh
2.0 请列出正常的hadoop集群中hadoop都分别需要启动 哪些进程,他们的作用分别都是什么,请尽量列的详细一些。
答:namenode:负责管理hdfs中文件块的元数据,响应客户端请求,管理datanode上文件block的均衡,维持副本数量
Secondname:主要负责做checkpoint操作;也可以做冷备,对一定范围内数据做快照性备份。
Datanode:存储数据块,负责客户端对数据块的io请求
Jobtracker :管理任务,并将任务分配给 tasktracker。
Tasktracker: 执行JobTracker分配的任务。
Resourcemanager
Nodemanager
Journalnode
Zookeeper
Zkfc
3.0请写出以下的shell命令
(1)杀死一个job
(2)删除hdfs上的 /tmp/aaa目录
答:(1)hadoop job –list 得到job的id,然后执 行 hadoop job -kill jobId就可以杀死一个指定jobId的job工作了。
(2)hadoopfs -rmr /tmp/aaa
4.0 请列出你所知道的hadoop调度器,并简要说明其工作方法
答:Fifo schedular :默认,先进先出的原则
Capacity schedular :计算能力调度器,选择占用最小、优先级高的先执行,依此类推。
Fair schedular:公平调度,所有的 job 具有相同的资源。
5.0 请列出你在工作中使用过的开发mapreduce的语言
答:java,hive,(python,c++)hadoop streaming
6.0 当前日志采样格式为
a , b , c , d
b , b , f , e
a , a , c , f
请你用最熟悉的语言编写mapreduce,计算第四列每个元素出现的个数
答:
public classWordCount1 {
public static final String INPUT_PATH =“hdfs://hadoop0:9000/in”;
public static final String OUT_PATH =“hdfs://hadoop0:9000/out”;
public static void main(String[] args)throws Exception {
Configuration conf = newConfiguration();
FileSystem fileSystem =FileSystem.get(conf);
if(fileSystem.exists(newPath(OUT_PATH))){}
fileSystem.delete(newPath(OUT_PATH),true);
Job job = newJob(conf,WordCount1.class.getSimpleName());
//1.0读取文件,解析成key,value对
FileInputFormat.setInputPaths(job,newPath(INPUT_PATH));
//2.0写上自己的逻辑,对输入的可以,value进行处理,转换成新的key,value对进行输出
job.setMapperClass(MyMapper.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(LongWritable.class);
//3.0对输出后的数据进行分区
//4.0对分区后的数据进行排序,分组,相同key的value放到一个集合中
//5.0对分组后的数据进行规约
//6.0对通过网络将map输出的数据拷贝到reduce节点
//7.0 写上自己的reduce函数逻辑,对map输出的数据进行处理
job.setReducerClass(MyReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(LongWritable.class);
FileOutputFormat.setOutputPath(job,new Path(OUT_PATH));
job.waitForCompletion(true);
}
static class MyMapper extendsMapper
@Override
protected void map(LongWritablek1, Text v1,
org.apache.hadoop.mapreduce.Mapper.Contextcontext)
throws IOException,InterruptedException {
String[] split =v1.toString().split("\t");
for(String words :split){
context.write(split[3],1);
}
}
}
static class MyReducer extends Reducer
protected void reduce(Text k2,Iterable v2,
org.apache.hadoop.mapreduce.Reducer.Contextcontext)
throws IOException,InterruptedException {
Long count = 0L;
for(LongWritable time :v2){
count += time.get();
}
context.write(v2, newLongWritable(count));
}
}
}
7.0 你认为用java , streaming , pipe方式开发map/reduce , 各有哪些优点
就用过 java 和 hiveQL。
Java 写 mapreduce 可以实现复杂的逻辑,如果需求简单,则显得繁琐。
HiveQL 基本都是针对 hive 中的表数据进行编写,但对复杂的逻辑(杂)很难进行实现。写起来简单。
8.0 hive有哪些方式保存元数据,各有哪些优点
三种:自带内嵌数据库derby,挺小,不常用,只能用于单节点
mysql常用
上网上找了下专业名称:single user mode…multiuser mode…remote user mode
9.0 请简述hadoop怎样实现二级排序(就是对key和value双排序)
第一种方法是,Reducer将给定key的所有值都缓存起来,然后对它们再做一个Reducer内排序。但是,由于Reducer需要保存给定key的所有值,可能会导致出现内存耗尽的错误。
第二种方法是,将值的一部分或整个值加入原始key,生成一个组合key。这两种方法各有优势,第一种方法编写简单,但并发度小,数据量大的情况下速度慢(有内存耗尽的危险),
第二种方法则是将排序的任务交给MapReduce框架shuffle,更符合Hadoop/Reduce的设计思想。这篇文章里选择的是第二种。我们将编写一个Partitioner,确保拥有相同key(原始key,不包括添加的部分)的所有数据被发往同一个Reducer,还将编写一个Comparator,以便数据到达Reducer后即按原始key分组。
10.简述hadoop实现jion的几种方法
Map side join----大小表join的场景,可以借助distributed cache
Reduce side join
11.0 请用java实现非递归二分查询
public class BinarySearchClass
{
public static int binary_search(int[] array, int value)
{
int beginIndex = 0;// 低位下标
int endIndex = array.length - 1;// 高位下标
int midIndex = -1;
while (beginIndex <= endIndex) {
midIndex = beginIndex + (endIndex - beginIndex) / 2;//防止溢出
if (value == array[midIndex]) {
return midIndex;
} else if (value < array[midIndex]) {
endIndex = midIndex - 1;
} else {
beginIndex = midIndex + 1;
}
}
return -1;
//找到了,返回找到的数值的下标,没找到,返回-1
}
//start 提示:自动阅卷起始唯一标识,请勿删除或增加。
public static void main(String[] args)
{
System.out.println(“Start…”);
int[] myArray = new int[] { 1, 2, 3, 5, 6, 7, 8, 9 };
System.out.println(“查找数字8的下标:”);
System.out.println(binary_search(myArray, 8));
}
//end //提示:自动阅卷结束唯一标识,请勿删除或增加。
12.0 请简述mapreduce中的combine和partition的作用
答:combiner是发生在map的最后一个阶段,其原理也是一个小型的reducer,主要作用是减少输出到reduce的数据量,缓解网络传输瓶颈,提高reducer的执行效率。
partition的主要作用将map阶段产生的所有kv对分配给不同的reducer task处理,可以将reduce阶段的处理负载进行分摊
13.0 hive内部表和外部表的区别
Hive 向内部表导入数据时,会将数据移动到数据仓库指向的路径;若是外部表,数据的具体存放目录由用户建表时指定
在删除表的时候,内部表的元数据和数据会被一起删除,
而外部表只删除元数据,不删除数据。
这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据。
答:
rowKey最好要创建有规则的rowKey,即最好是有序的。
经常需要批量读取的数据应该让他们的rowkey连续;
将经常需要作为条件查询的关键词组织到rowkey中;
列族的创建:
按照业务特点,把数据归类,不同类别的放在不同列族
本质:让各分区的数据分布均匀
可以根据业务特点,设置合适的partition策略
如果事先根本不知道数据的分布规律,利用随机抽样器抽样后生成partition策略再处理
答:
可以从很多方面来进行:比如hdfs怎么优化,mapreduce程序怎么优化,yarn的job调度怎么优化,hbase优化,hive优化。。。。。。。
答:
Hbase是一个能适应联机业务的数据库系统
物理存储:hbase的持久化数据是存放在hdfs上
存储管理:一个表是划分为很多region的,这些region分布式地存放在很多regionserver上
Region内部还可以划分为store,store内部有memstore和storefile
版本管理:hbase中的数据更新本质上是不断追加新的版本,通过compact操作来做版本间的文件合并
答:可以,例如我们的集群就是为了存储文件而设计的,不涉及到数据的计算,就可以将mapReduce都省掉。
比如,流量运营项目中的行为轨迹增强功能部分
怎么样才能实现去掉reduce阶段
去掉之后就不排序了,不进行shuffle操作了
19 hadoop中常用的数据压缩算法
答:
Lzo
Gzip
Default
Snapyy
答:
Hive的查询功能是由hdfs + mapreduce结合起来实现的
Hive与mysql的关系:只是借用mysql来存储hive中的表的元数据信息,称为metastore
答:
过滤器有什么用途:
增强hbase查询数据的功能
减少服务端返回给客户端的数据量
25.datanode在什么情况下不会备份数据
答:在客户端上传文件时指定文件副本数量为1
26.combine出现在哪个过程
答:shuffle过程中
具体来说,是在maptask输出的数据从内存溢出到磁盘,可能会调多次
Combiner使用时候要特别谨慎,不能影响最后的逻辑结果
答:
集群架构:
namenode datanode secondarynamenode
(active namenode ,standby namenode)journalnode zkfc
内部工作机制:
数据是分布式存储的
对外提供一个统一的目录结构
对外提供一个具体的响应者(namenode)
数据的block机制,副本机制
Namenode和datanode的工作职责和机制
读写数据流程
flush的过程
答:flush是在内存的基础上进行的,首先写入文件的时候,会先将文件写到内存中,当内存写满的时候,一次性的将文件全部都写到硬盘中去保存,并清空缓存中的文件,
什么是队列
答:是一种调度策略,机制是先进先出
31.数据的三范式
答:
第一范式()无重复的列
第二范式(2NF)属性完全依赖于主键 [消除部分子函数依赖]
第三范式(3NF)属性不依赖于其它非主属性 [消除传递依赖]
32.三个datanode中当有一个datanode出现错误时会怎样?
答:
Namenode会通过心跳机制感知到datanode下线
会将这个datanode上的block块在集群中重新复制一份,恢复文件的副本数量
会引发运维团队快速响应,派出同事对下线datanode进行检测和修复,然后重新上线
33.sqoop在导入数据到mysql中,如何不重复导入数据,如果存在数据问题,sqoop如何处理?
答:FAILED java.util.NoSuchElementException
此错误的原因为sqoop解析文件的字段与MySql数据库的表的字段对应不上造成的。因此需要在执行的时候给sqoop增加参数,告诉sqoop文件的分隔符,使它能够正确的解析文件字段。
hive默认的字段分隔符为’\001’
34.描述一下hadoop中,有哪些地方使用到了缓存机制,作用分别是什么?
答:
Shuffle中
Hbase----客户端/regionserver
35.MapReduce优化经验
答:(1.)设置合理的map和reduce的个数。合理设置blocksize
(2.)避免出现数据倾斜
(3.combine函数
(4.对数据进行压缩
(5.小文件处理优化:事先合并成大文件,combineTextInputformat,在hdfs上用mapreduce将小文件合并成SequenceFile大文件(key:文件名,value:文件内容)
(6.参数优化
36.请列举出曾经修改过的/etc/下面的文件,并说明修改要解决什么问题?
答:/etc/profile这个文件,主要是用来配置环境变量。让hadoop命令可以在任意目录下面执行。
/ect/sudoers
/etc/hosts
/etc/sysconfig/network
/etc/inittab
39.mapreduce的大致流程
答:主要分为八个步骤
1/对文件进行切片规划
2/启动相应数量的maptask进程
3/调用FileInputFormat中的RecordReader,读一行数据并封装为k1v1
4/调用自定义的map函数,并将k1v1传给map
5/收集map的输出,进行分区和排序
6/reduce task任务启动,并从map端拉取数据
7/reduce task调用自定义的reduce函数进行处理
8/调用outputformat的recordwriter将结果数据输出
44.搭建hadoop集群 , master和slaves都运行哪些服务
答:master主要是运行我们的主节点,slaves主要是运行我们的从节点。
48.hadoop运行原理
答:hadoop的主要核心是由两部分组成,HDFS和mapreduce,首先HDFS的原理就是分布式的文件存储系统,将一个大的文件,分割成多个小的文件,进行存储在多台服务器上。
Mapreduce的原理就是使用JobTracker和TaskTracker来进行作业的执行。Map就是将任务展开,reduce是汇总处理后的结果。
49.mapreduce的原理
答:mapreduce的原理就是将一个MapReduce框架由一个单独的master JobTracker和每个集群节点一个slave TaskTracker共同组成。master负责调度构成一个作业的所有任务,这些的slave上,master监控它们的执行,
重新执行已经失败的任务。而slave仅负责执行由maste指派的任务。
50.HDFS存储机制
答:HDFS主要是一个分布式的文件存储系统,由namenode来接收用户的操作请求,然后根据文件大小,以及定义的block块的大小,将大的文件切分成多个block块来进行保存
51.举一个例子说明mapreduce是怎么运行的。
Wordcount
52.如何确认hadoop集群的健康状况
答:有完善的集群监控体系(ganglia,nagios)
Hdfs dfsadmin –report
Hdfs haadmin –getServiceState nn1
54.hive如何调优
答:hive最终都会转化为mapreduce的job来运行,要想hive调优,实际上就是mapreduce调优,可以有下面几个方面的调优。解决收据倾斜问题,减少job数量,设置合理的map和reduce个数,
对小文件进行合并,优化时把握整体,单个task最优不如整体最优。按照一定规则分区。
58.HBase宕机如何处理
答:宕机分为HMaster宕机和HRegisoner宕机,如果是HRegisoner宕机,HMaster会将其所管理的region重新分布到其他活动的RegionServer上,由于数据和日志都持久在HDFS中,该操作不会导致数据丢失。所以数据的一致性和安全性是有保障的。
如果是HMaster宕机,HMaster没有单点问题,HBase中可以启动多个HMaster,通过Zookeeper的Master Election机制保证总有一个Master运行。即ZooKeeper会保证总会有一个HMaster在对外提供服务。
59.假设公司要建一个数据中心,你会如何处理?
先进行需求调查分析
设计功能划分
架构设计
吞吐量的估算
采用的技术类型
软硬件选型
成本效益的分析
项目管理
扩展性
安全性,稳定性
单项选择题
下面哪个程序负责 HDFS 数据存储。 答案 C
a)NameNode b)Jobtracker c)Datanoded)secondaryNameNode e)tasktracker
HDfS 中的 block 默认保存几份? 答案 A
a)3 份 b)2 份 c)1 份 d)不确定
Hadoop 作者 答案D
a)Martin Fowler b)Kent Beck c)Doug cutting
HDFS 默认 Block Size 答案 B
a)32MB b)64MB c)128MB
a)CPU b)网络 c)磁盘 d)内存
a)它是NameNode的热备
b)它对内存没有要求
c)它的目的是帮助 NameNode 合并编辑日志,减少 NameNode 启动时间
d)SecondaryNameNode 应与 NameNode 部署到一个节点
多选题:
a)Puppet b)Pdsh c)Cloudera Manager d)Zookeeper
答案 ABC
a)如果一个机架出问题,不会影响数据读写
b)写入数据的时候会写到不同机架的 DataNode 中
c)MapReduce 会根据机架获取离自己比较近的网络数据
a)数据经过 NameNode 传递给 DataNode
b)Client 端将文件切分为 Block,依次上传
c)Client 只上传数据到一台 DataNode,然后由 NameNode 负责 Block 复制工作
a)单机版 b)伪分布式 c)分布式
判断题:全部都是错误滴
14. Block Size 是不可以修改的。( )
如果 NameNode 意外终止, SecondaryNameNode 会接替它使集群继续工作。( )
Cloudera CDH 是需要付费使用的。( )
Hadoop 是 Java 开发的,所以 MapReduce 只支持 Java 语言编写。( )
Hadoop 支持数据的随机读写。( )
NameNode 负责管理 metadata, client 端每次读写请求,它都会从磁盘中读取或则
会写入 metadata 信息并反馈 client 端。( )
NameNode 本地磁盘保存了 Block 的位置信息。( )
DataNode 通过长连接与 NameNode 保持通信。( )
Hadoop 自身具有严格的权限管理和安全措施保障集群正常运行。( )
Slave节点要存储数据,所以它的磁盘越大越好。( )
hadoop dfsadmin –report 命令用于检测 HDFS 损坏块。( )
Hadoop 默认调度器策略为 FIFO( )
集群内每个节点都应该配 RAID,这样避免单磁盘损坏,影响整个节点运行。( )
因为 HDFS 有多个副本,所以 NameNode 是不存在单点问题的。( )
每个 map 槽(进程)就是一个线程。( )
Mapreduce 的 input split 就是一个 block。( )
NameNode的默认Web UI 端口是 50030,它通过 jetty 启动的 Web 服务。( )
Hadoop 环境变量中的 HADOOP_HEAPSIZE 用于设置所有 Hadoop 守护线程的内存。它默认是200 GB。( )
DataNode 首次加入 cluster 的时候,如果 log中报告不兼容文件版本,那需要
NameNode执行“Hadoop namenode -format”操作格式化磁盘。( )
答:
hadoop1的主要结构是由HDFS和mapreduce组成的,HDFS主要是用来存储数据,mapreduce主要是用来计算的,那么HDFS的数据是由namenode来存储元数据信息,datanode来存储数据的。Jobtracker接收用户的操作请求之后去分配资源执行task任务。
在hadoop2中,首先避免了namenode单点故障的问题,使用两个namenode来组成namenode feduration的机构,两个namenode使用相同的命名空间,一个是standby状态,一个是active状态。用户访问的时候,访问standby状态,并且,使用journalnode来存储数据的原信息,一个namenode负责读取journalnode中的数据,一个namenode负责写入journalnode中的数据,这个平台组成了hadoop的HA就是high availableAbility高可靠。
然后在hadoop2中没有了jobtracker的概念了,统一的使用yarn平台来管理和调度资源,yarn平台是由resourceManager和NodeManager来共同组成的,ResourceManager来接收用户的操作请求之后,去NodeManager上面启动一个主线程负责资源分配的工作,然后分配好了资源之后告知ResourceManager,然后ResourceManager去对应的机器上面执行task任务。
答:java中的反射,首先我们写好的类,经过编译之后就编程了.class文件,我们可以获取这个类的.class文件,获取之后,再来操作这个类。这个就是java的反射机制。
答:ArrayList 和Vector是采用数组方式存储数据, ,Vector由于使用了synchronized方法(线程安全)所以性能上比ArrayList要差,LinkedList使用双向链表实现存储,按序号索引数据需要进行向前或向后遍历,但是插入数据时只需要记录本项的前后项即可,所以插入数度较快!
HashMap和HashTable:Hashtable的方法是同步的,而HashMap的方法不是,Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现。HashMap是一个线程不同步的,那么就意味着执行效率高,HashTable是一个线程同步的就意味着执行效率低,但是HashMap也可以将线程进行同步,这就意味着,我们以后再使用中,尽量使用HashMap这个类。
答:更改文件的block块大小,需要根据我们的实际生产中来更改block的大小,如果block定义的太小,大的文件都会被切分成太多的小文件,减慢用户上传效率,如果block定义的太大,那么太多的小文件可能都会存到一个block块中,虽然不浪费硬盘资源,可是还是会增加namenode的管理内存压力。
答:
1.调用客户端句柄;执行传送参数
2.调用本地系统内核发送网络消息
消息传送到远程主机
服务器句柄得到消息并取得参数
执行远程过程
执行的过程将结果返回服务器句柄
服务器句柄返回结果,调用远程系统内核
消息传回本地主机
客户句柄由内核接收消息
客户接收句柄返回的数据
对 Hadoop 有没有调优经验,没有什么使用心得?(调优从参数调优讲起)
dfs.block.size
Mapredure:
io.sort.mb
io.sort.spill.percent
mapred.local.dir
mapred.map.tasks &mapred.tasktracker.map.tasks.maximum
mapred.reduce.tasks &mapred.tasktracker.reduce.tasks.maximum
mapred.reduce.max.attempts
mapred.reduce.parallel.copies
mapreduce.reduce.shuffle.maxfetchfailures
mapred.child.java.opts
mapred.reduce.tasks.speculative.execution
mapred.compress.map.output &mapred.map.output.compression.codec
mapred.reduce.slowstart.completed.maps
72以你的实际经验,说下怎样预防全表扫描
答:
1.应尽量避免在where 子句中对字段进行null 值判断,否则将导致引擎放弃使用索引而进行全表扫描
2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫
3.描应尽量避免在 where 子句中使用or 来连接条件,否则将导致引擎放弃使用索引而进行
全表扫描
http://4.in 和 not in,用具体的字段列表代替,不要返回用不到的任何字段。in 也要慎用,否则会导致全表扫描
5.避免使用模糊查询
6.任何地方都不要使用select* from t
答:极大方便分布式应用的开发;(轻量,成本低,性能好,稳定性和可靠性高)
75.把公钥追加到授权文件的命令?该命令是否在 root 用户下执行?
答:ssh-copy-id
哪个用户需要做免密登陆就在哪个用户身份下执行
答:排序,分组,topk,join,group
答:nmon ganglia nagios
在服务端怎么处理的,最后怎么返回给用户的,整个的环节操作系统是怎么控制的?
答:引用传递。传址
100多台
128G或者64G的
答:使用HTable来提供对HBase的访问,可以使用时间戳来记录一条数据的多个版本。
多例:当多线程去访问同一个表的时候会有。
处理完成之后的导出:利用hive 处理完成之后的数据,通过sqoop 导出到 mysql 数据库
中,以供报表层使用。
开发时使用的是部分数据,不是全量数据,有将近一亿行(8、9 千万,具体不详,一般开
发中也没人会特别关心这个问题)