1.讲讲你做的过的项目。 项目里有哪些 难点重点注意点呢?
2.讲讲多线程吧, 要是你,你怎么实现一个线程池呢?
为了节省系统在多线程并发情况下不断的创建新和销毁线程所带来的性能浪费,就需要引入线程池
首先写个简单的线程池接口继承Runable,
客户端可以通过execute(Job)方法将Job提交入线程池来执行,客户端完全不用等待Job的执行完成。除了execute(Job)方法以外,线程池接口提供了增加/减少工作者线程以及关闭线程池的方法。每个客户端提交的Job都会进入到一个工作队列中等待工作者线程的处理。
从线程池的实现中可以看出,当客户端调用execute(Job)方法时,会不断地向任务列表jobs中添加Job,而每个工作者线程会不读的从jobs上获取Job来执行,当jobs为空时,工作者线程进入WAITING状态。
当添加一个Job后,对工作队列jobs调用其notify()方法来唤醒一个工作者线程。此处我们不调用notifyAll(),避免将等待队列中的线程全部移动到阻塞队列中而造成资源浪费。
线程池的本质就是使用了一个线程安全的工作队列连接工作者线程和客户端线程。客户端线程把任务放入工作队列后便返回,而工作者线程则不端的从工作队列中取出工作并执行。当工作队列为空时,工作者线程进入WAITING状态,当有客户端发送任务过来后会通过任意一个工作者线程,随着大量任务的提交,更多的工作者线程被唤醒。
3.shuffle 是什么? 怎么调优?
Shuffle过程是MapReduce的核心,基于map与reduce之间,Shuffle描述着数据从map task输出到reduce task输入的这段过程。 其意思是洗牌,
调优:
完整的从map task端拉取数据到reduce端
在跨节点拉取数据是,尽可能的减少对宽带端的不必要的消耗
减少磁盘IO对Task的影响(减少拉取数据的量及尽量使用内存而不是磁盘)
4.hbase 的特点是什么?
(1) Hbase一个分布式的基于列式存储的数据库,基于Hadoop的hdfs存储,zookeeper进行管理。
(2) Hbase适合存储半结构化或非结构化数据,对于数据结构字段不够确定或者杂乱无章很难按一个概念去抽取的数据。
(3) Hbase为null的记录不会被存储.
(4)基于的表包含rowkey,时间戳,和列族。新写入数据时,时间戳更新,同时可以查询到以前的版本.
(5) hbase是主从架构。hmaster作为主节点,regionserver作为从节点。
5.以 start-hbase.sh 为起点,Hbase 启动的流程是什么?
t-hbase.sh 的流程如下:
1. 运行 hbase-config.sh
hbase-config.sh的作用:
1>.装载相关配置,如HBASE_HOME目录,conf目录,regionserver机器列表,JAVA_HOME 目录等,它会调用$HBASE_HOME/conf/hbase-env.sh .
2>.解析参数(0.96 版本及以后才可以带唯一参数 autorestart,作用就是重启)
3>.调用 hbase-daemon.sh 来启动 master.
4>.调用 hbase-daemons.sh 来启动 regionserver zookeeper master-backup.
2. hbase-env.sh 的作用:主要是配置 JVM 及其 GC 参数,还可以配置 log 目录及参数,配置是否需要 hbase 管
理 ZK,配置进程 id 目录等.
3. hbase-daemons.sh 的作用:根据需要启动的进程,
如 zookeeper,则调用 zookeepers.sh
如 regionserver,则调用 regionservers.sh
如 master-backup,则调用 master-backup.sh
4. zookeepers.sh 的作用:如果 hbase-env.sh 中的 HBASE_MANAGES_ZK”=”true”,那么通过ZKServerTool这个类解析xml配置文件,获取 ZK 节点列表,然后通过 SSH 向这些节点发送远程命令执行。
5. regionservers.sh 的作用:与 zookeepers.sh 类似,通过配置文件,获取 regionserver 机器列表,然后 SSH 向这些机器发送远程命令:
6. master-backup.sh 的作用:通过 backup-masters 这个配置文件,获取 backup-masters 机器列表,然后 SSH 向这些机器发送远程命令。
Scala? Scala的特点? 和Java的区别?
Scala相对Java语法更丰富,更简洁,写起来更像脚本,能够提高开发效率。
使用Java的话代码会规范些,不过太臃肿,代码量更大。
另外Spark基本使用函数式编程,使用Java的话可能需要写一大堆匿名类,而Scala只需要一个lambda表达式。
7.怎么用spark做数据清洗?
使用spark RDD的转换
8.Hadoop的机架感配置?
Hadoop在设计时考虑到数据的安全与高效,数据文件默认在HDFS上存放三份,存储策略为本地一份,同机架内其它某一节点上一份,不同机架的某一节点上一份。这样如果本地数据损坏,节点可以从同一机架内的相邻节点拿到数据,速度肯定比从跨机架节点上拿数据要快;同时,如果整个机架的网络出现异常,也能保证在其它机架的节点上找到数据。为了降低整体的带宽消耗和读取延时,HDFS会尽量让读取程序读取离它最近的副本。如果在读取程序的同一个机架上有一个副本,那么就读取该副本。如果一个HDFS集群跨越多个数据中心,那么客户端也将首先读本地数据中心的副本。那么Hadoop是如何确定任意两个节点是位于同一机架,还是跨机架的呢?答案就是机架感知。
9.简答说一下hadoop的map-reduce编程模型?
首先map task会从本地文件系统读取数据,转换成key-value形式的键值对集合,使用的是hadoop内置的数据类型,比如longwritable、text等,将键值对集合输入mapper进行业务处理过程,将其转换成需要的key-value在输出,之后会进行一个partition分区操作,默认使用的是hashpartitioner,可以通过重写hashpartitioner的getpartition方法来自定义分区规则,
之后会对key进行进行sort排序,grouping分组操作将相同key的value合并分组输出,在这里可以使用自定义的数据类型,重写WritableComparator的Comparator方法来自定义排序规则,重写RawComparator的compara方法来自定义分组规则之后进行一个combiner归约操作,其实就是一个本地段的reduce预处理,以减小后面shufle和reducer的工作量reduce task会通过网络将各个数据收集进行reduce处理,最后将数据保存或者显示,结束整个job
10.hadoop的TextInputFormat作用是什么,如何自定义实现
InputFormat会在map操作之前对数据进行两方面处理
1是getSplits,返回的是InputSplit数组,对数据进行split分片,每片交给map操作一次
2是getRecordReader,返回的是RecordReader对象,对每个split分片进行转换为key-value键值对格式传递给map
11.hadoop和spark的都是并行计算,那么他们有什么相同和区别
hadoop的job有map和reduce操作,表达能力比较欠缺而且在mr过程中会重复的读写hdfs,造成大量的io操作,多个job需要自己管理关系
spark的迭代计算都是在内存中进行的,API中提供了大量的RDD操作如join,groupby等,而且通过DAG图可以实现良好的容错
12.为什么要用flume导入hdfs,hdfs的构架是怎样的?
flume可以实时的导入数据到hdfs中,当hdfs上的文件达到一个指定大小的时候会形成一个文件,或者超过指定时间的话也形成一个文件
文件都是存储在datanode上面的,namenode记录着datanode的元数据信息,而namenode的元数据信息是存在内存中的,所以当文件切片很小或者很多的时候会卡死
13.map-reduce程序运行的时候会有什么比较常见的问题
比如作业大部分完成了,但是总有几个reduce一直运行
这是因为这几个reduce中的处理的数据要远远大于其他的reduce,可能是因为对键值对任务划分的不均匀造成的数据倾斜
解决的方法可以在分区的时候重新定义分区规则对于value数据很多的key可以进行拆分、均匀打散等处理,或者是在map端的combiner中进行数据预处理的操作
14.简单说一下hadoop和spark的shuffle过程
hadoop:map端保存分片数据,通过网络收集到reduce端
spark:spark的shuffle是在DAGSchedular划分Stage的时候产生的,TaskSchedule要分发Stage到各个worker的executor
减少shuffle可以提高性能
15.Hive中存放是什么?
表:
存的是和hdfs的映射关系,hive是逻辑上的数据仓库,实际操作的都是hdfs上的文件,HQL就是用sql语法来写的mr程序。
16.Flume的工作机制是什么?
核心概念是agent,里面包括source chanel 和sink三个组件
source运行在日志收集节点进行日志采集,之后临时存储在chanel中,sink负责将chanel中的数据发送到目的地。
只有成功发送之后chanel中的数据才会被删除。
首先书写flume配置文件,定义agent、source、chanel和sink然后将其组装,执行flume-ng命令。
17.Sqoop的工作原理?
Hadoop生态圈上的的数据传输工具.使用的是mr程序来执行任务,使用jdbc和关系型数据库进行交互。
可以将关系型数据库的数据导入非结构化的hdfs、hive或者bbase中,也可以将hdfs中的数据导出到关系型数据库或者文本文件中。
import原理:通过制定的分割符进行数据切分,将分片传入各个map中,在map任务中在每行数据进行写入处理reduce.
export:根据要操作的表表名生成一个Java类,并读取其元数据信息和分隔符对非结构化的数据进行匹配,多个map作业同时执行写入关系型数据库
18.Hbase行健列族的概念,物理模型,表的设计原则?
行键:是HBase自带的,每个行键对应一条数据
列族:是创建表时制定的,为列的集合,每个列族作为一个文件单独存储,存储的数据都是字节数列族,其中的数据可以有很多,通过时间戳来区分。
物理模型:每个Hbase表会拆分多个region,每个region记录着行键的起始点保存在不同的节点上,查询时就是对个节点的并行查询,当region很大时使用.META表存储各个region的起始点,-ROOT又可以存储.META的起始点。
Rowkey的实际原则