admin管理员组

文章数量:1570215

互联网:通过埋点实时计算用户浏览频次用优惠券等措施吸引用户,通过历史信息用非智能学习的title方式构造用户画像(抖音,京东)
电信,银行统计营收和针对用户的个人画像:处理大量非实时数据
政府:健康码,扫码之后确诊,找出与确诊对象有关联的人
订单 订单表(除商品以外所有信息),商品详情表,通过搜集用户title进行定制化推荐
点击流数据 通过埋点进行用户点击行为分析
FLINK一般用来做实时
SPARK一般用来做离线
原理胜过代码

List 与set 的区别?
List特点:元素有放入顺序,元素可重复 ,Set特点:元素无放入顺序,元素不可重复 . 
数据库的三大范式
ACID,是指在可靠数据库管理系统(DBMS)中,事务(transaction)所应该具有的四个特性:原子性(Atomicity) 一致性(Consistency) 隔离性(Isolation) 持久性(Durability)
原子性是指事务是一个不可再分割的工作单位,事务中的操作要么都发生,要么都不发生 . 
在事务中的扣款和加款两条语句,要么都执行,要么就都不执行 . 否则如果只执行了扣款语句,就提交了,此时如果突然断电,A账号已经发生了扣款,B账号却没收到加款,在生活中就会引起纠纷 . 

一致性是指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏 . 这是说数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性 . 
对银行转帐事务,不管事务成功还是失败,应该保证事务结束后ACCOUNT表中aaa和bbb的存款总额为2000元 . 

事务之间的相互影响分为几种,分别为:脏读,不可重复读,幻读,丢失更新
脏读意味着一个事务读取了另一个事务未提交的数据,而这个数据是有可能回滚的;如下案例,此时如果事务1回滚,则B账户必将有损失 . 

幻读,是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行 . 同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据 . 那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样.

丢失更新就是两个不同的事务(或者Java程序线程)在某一时刻对同一数据进行读取后,先后进行修改 . 导致第一次操作数据丢失 . 
两个事务同时读取同一条记录,A先修改记录,B也修改记录(B是不知道A修改过),B提交数据后B的修改结果覆盖了A的修改结果 . 

并发事务处理隔离性级别带来的问题
更新丢失(Lost Update)
当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,由于每个事务都不知道其他事务的存在,就会发生丢失更新问题——最后的更新覆盖了由其他事务所作的更新.
例如:两个程序员修改同一文件,每个程序员独立地更改其副本,然后保存更改后地副本,这样就覆盖了原始文档.最后保存其更改副本的编辑人员覆盖前一个程序员所作的更改.
如果在一个程序员完成并提交事务之前,另一个程序员不能访问同一文件,则可避免此问题.
脏读(Dirty Reads)
一个事务正在对一条记录做修改,在这个事务完成并提交前,这条记录的数据就处于不一致状态;这时,另一个事务也就读取同一条记录,如果不加控制,第二个事务读取了这些"脏"数据,并据此做进一步的处理,就会产生未提交的数据依赖关系.这种现象被形象地叫做"脏读"
一句话:事务A读取到了事务B 已修改但尚未提交 的数据,还在这个数据基础上做了操作.此时,如果B事务回滚,A读取的数据无效,不符合一致性要求.
不可重复读(Non-Repeatable Reads)
一个事务在读取某些数据后的某个时间,再次读取以前读过的数据,却发现其读出的数据已经发生了改变.或某些记录已经被删除了!这种现象就叫做"不可重复读".
一句话:事务A读取到了事务B已经提交的修改数据,不符合隔离性.
幻读(Phantom Reads)
一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据,这种现象被称为"幻读".
一句话:事务A读取到了事务B提交的新增数据,不符合隔离性.
不可重复读:A事务在执行过程中,B事务对数据进行了修改或删除,导致A两次读取的数据不一致;
重点在于update和delete(锁行即可解决),
幻读:A事务在执行过程中,B事务新增了符合A事务要查询的数据,导致A两次读取的数据不一致;
重点在于insert(需要锁表解决).

01:Read uncommitted(读未提交):最低级别,任何情况都会发生 . 
02:Read Committed(读已提交):可避免脏读的发生 . 
03:Repeatable read(可重复读):可避免脏读 不可重复读的发生 . 
04:Serializable(串行化):避免脏读 不可重复读,幻读的发生 . 

       未提交读:在读数据时不会检查或使用任何锁 . 因此,在这种隔离级别中可能读取到没有提交的数据 .   

       已提交读:只读取提交的数据并等待其他事务释放排他锁 . 读数据的共享锁在读操作完成后立即释放 .  .  

       可重复读:像已提交读级别那样读数据,但会保持共享锁直到事务结束 .   

       可串行读:工作方式类似于可重复读 . 但它不仅会锁定受影响的数据,还会锁定这个范围 . 这就阻止了新数据插入查询所涉及的范围 . 

事务的(ACID)特性是由关系数据库管理系统(RDBMS,数据库系统)来实现的 . 数据库管理系统采用日志来保证事务的原子性 一致性和持久性 . 日志记录了事务对数据库所做的更新,如果某个事务在执行过程中发生错误,就可以根据日志,撤销事务对数据库已做的更新,使数据库退回到执行事务前的初始状态 . 

数据库管理系统采用锁机制来实现事务的隔离性 . 当多个事务同时更新数据库中相同的数据时,只允许持有锁的事务能更新该数据,其他事务必须等待,直到前一个事务释放了锁,其他事务才有机会更新该数据 . 

四种隔离级别最高:Seralizable级别,最低的是Read uncommitted级别; 级别越高,执行效率就越低; 隔离级别的设置只对当前链接有效,对JDBC操作数据库来说,一个Connection对象相当于一个链接,只对该Connection对象设置的隔离级别只对该connection对象有效,与其它链接connection对象无关 . 

01:Mysql的默认隔离级别是:可重复读:Repeatable read;

02:oracle数据库中,只支持seralizable(串行化)级别和Read committed();默认的是Read committed级别;

03:Read committed()是SQL Server的默认隔离级别 . 

隔离事务之间的影响是通过锁来实现的,通过阻塞来阻止上述影响 . 不同的隔离级别是通过加不同的锁,造成阻塞来实现的,所以会以付出性能作为代价;安全级别越高,处理效率越低;安全级别越低,效率高 . 
Read Commited符合了多数的实际需求.

Serializabale:最高的事务隔离级别,代价花费最高,性能很低,很少使用,在此级别下,事务顺序执行,避免上述产生的情况 . 

反射有三种获取的方式,分别是:forName  / getClass / 直接使用class方式 使用反射可以获取类的实例

设计方式有工厂法,懒加载,观察者模式,静态工厂,迭代器模式,外观模式    

Rpc分为同步调用和异部调用,异步与同步的区别在于是否等待服务器端的返回值 . Rpc的组件有RpcServer,RpcClick,RpcProxy,RpcConnection,RpcChannel,RpcProtocol,RpcInvoker等组件

ArrayList 和 Vector 是采用数组方式存储数据的,是根据索引来访问元素的,都可以根据需要自动扩展内部数据长度,以便增加和插入元素,都允许直接序号索引元素,但是插入数据要涉及到数组元素移动等内存操作,所以索引数据快插入数据慢,他们最大的区别就是 synchronized 同步的使用 . 
LinkedList 使用双向链表实现存储,按序号索引数据需要进行向前或向后遍历,但是插入数据时只需要记录本项的前后项即可,所以插入数度较快!如果只是查找特定位置的元素或只在集合的末端增加 移除元素,那么使用 Vector
或 ArrayList 都可以 . 如果是对其它指定位置的插入 删除操作,最好选择 LinkedList

HashMap HashTable 的区别及其优缺点:
HashTable 中的方法是同步的(有锁) HashMap 的方法在缺省情况下是非同步的 因此在多线程环境下需要做额外的同步机制 . 
HashTable 不允许有 null 值 key 和 value 都不允许,而 HashMap 允许有 null 值 key和 value 都允许 因此 HashMap 使用 containKey()来判断是否存在某个键 . HashTable 使用 Enumeration ,而 HashMap 使用 iterator . 
Hashtable 是 Dictionary 的子类,HashMap 是 Map 接口的一个实现类 . 

当需要对字符串进行操作时,使用 StringBuffer 而不是 String,String 是 read-only 的,如果对它进行修改,会产生临时对象,而 StringBuffer 是可修改的,不会产生临时对象 . 

 hashmap hashtable 的区别在于hashtable 是线程安全的,而hashmap 不是线程安全的,currentHashMap也是线程安全的 . 
     ConcurrentHashMap是使用了锁分段技术技术来保证线程安全的 . 所分段的技术是:讲数据分成一段一段的储存,给每一段的数据添加一把锁,当线程访问一个数据时,其他的数据可以被访问 . 

1 程序在运行时会产生很多的对象的信息,当这些对象的信息没有用时,则会被gc回收

2 调优的方式主要是调节年轻代与老年代的内存的大小

OOM是OutOfMemory的缩写(搞得跟多高大上似的)就是线程创建的多了,没有及时的回收过来所产生的


2-4)修改 linux 内核参数
[root@hadoop1 /]# vi /etc/sysctl.conf
net.core.somaxconn = 32768
表示物理内存使用到 90%(100-10=90)的时候才使用 swap 交换区

2-5)关闭 noatime
在最后追加一下内容
/dev/sda2 /data ext3 noatime,nodiratime 0 0

2-6)请用shell命令把某一个文件下的所有的文件分发到其他的机器上
Scp  -r  /user/local   hadoop2:/user/local

[root@hadoop1 test]# find  .|  grep -ri "a"

1 客户端向 nameNode 发送要上传文件的请求

2 nameNode 返回给用户是否能上传数据的状态

3 加入用户端需要上传一个 1024M 的文件,客户端会通过 Rpc 请求 NameNode,并返回需要上传给那些DataNode(分配机器的距离以及空间的大小等),namonode会选择就近原则分配机器 . 

4 客户端请求建立 block 传输管道 chnnel 上传数据

5 在上传是 datanode 会与其他的机器建立连接并把数据块传送到其他的机器上

6 dataNode 向 namenode 汇报自己的储存情况以及自己的信息

当第一个快上传完后再去执行其他的复制的传送

只需要在IF[ -f ] 括号中加上-f参数即可判断文件是否存在

fsimage是保存最新的元数据的信息,当fsimage数据到一定的大小事会去生成一个新的文件来保存元数据的信息,这个新的文件就是edit,edit会回滚最新的数据 . 

不管是hadoop1.x 还是hadoop2.x 都是默认的保存三份,可以通过参数dfs.replication就行修改

Core-site.xml 文件的优化

fs.trash.interval
默认值:0
说明:这个是开启hdfs文件删除自动转移到垃圾箱的选项,值为垃圾箱文件清除时间 . 一般开启这个会比较好,以防错误删除重要文件 . 单位是分钟 . 

dfs.namenode.handler.count
默认值:10
说明:hadoop系统里启动的任务线程数,这里改为40,同样可以尝试该值大小对效率的影响变化进行最合适的值的设定 . 

mapreduce.tasktracker.http.threads
默认值:40
说明:map和reduce是通过http进行数据传输的,这个是设置传输的并行线程数 . 

数据的倾斜主要是两个的数据相差的数量不在一个级别上,在只想任务时就造成了数据的倾斜,可以通过分区的方法减少reduce数据倾斜性能的方法,例如;抽样和范围的分区 自定义分区 数据大小倾斜的自定义侧略

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

Start-all.sh

怎样快速的杀死一个job
1 执行hadoop  job -list  拿到job-id
2 Hadoop job kill hadoop-id

Hadoop-daemon.sh start datanode

Hadoop 常用的jion有reduce side join  , map side  join ,  SemiJoin 不过reduce side join 与 map side join 比较常用,不过都是比较耗时的 . 

Hadoop 的压缩算法有很多,其中比较常用的就是gzip算法与bzip2算法,都可以可通过CompressionCodec来实现

Hadoop 的调度有三种其中fifo的调度hadoop的默认的,这种方式是按照作业的优先级的高低与到达时间的先后执行的,还有公平调度器:名字见起意就是分配用户的公平获取共享集群呗!容量调度器:让程序都能货到执行的能力,在队列中获得资源 . 

hadoop flush 的过程?
Flush 就是把数据落到磁盘,把数据保存起来

队列的实现是链表,消费的顺序是先进先出 . 

Cloudera 提供哪几种安装 CDH 的方法
· Cloudera manager
· Tarball
· Yum
· Rpm

文件大小默认为 64M,改为 128M 有啥影响?
这样减少了namenode的处理量,数据的元数据保存在namenode上,如果在网络不好的情况下会增到datanode的储存时间 . 可以根据自己的网络来设置大小 . 

datanode 首次加入 cluster 的时候,如果 log 报告不兼容文件版本,那需要namenode 执行格式化操作,这样处理的原因是?
这样处理是不合理的,因为那么 namenode 格式化操作,是对文件系统进行格式化,namenode 格式化时清空 dfs/name 下空两个目录下的所有文件,之后,会在目录 dfs.name.dir 下创建文件 . 文本不兼容,有可能时 namenode 与 datanode 的 数据里的 namespaceID clusterID 不一致,找到两个 ID 位置,修改为一样即可解决 . 

1 首先,hadoop streaming是一种编程工具,它是由hadoop提供的 . 
2 为什么要用hadoop streaming呢?
hadoop框架是用java语言写的,也就是说,hadoop框架中运行的所有应用程序都要用java语言来写才能正常地在hadoop集群中运行 . 那么问题来了,如果有些开发者就是不会java语言,但是又想使用mapreduce这个并行计算模型的话,那该怎么办?
就是基于这样的考虑,所以hadoop提供了hadoop streaming这个编程工具,它支持用任何编程语言来编写mapreduce的map函数和reduce函数 . 

一个 MapReduce 作业由 Map 阶段和 Reduce 阶段两部分组成,这两阶段会对数据排序,从这个意义上说MapReduce 框架本质就是一个 Distributed Sort . 在 Map阶段,在 Map 阶段,Map Task 会在本地磁盘输出一个按照 key 排序(采用的是快速排序)的文件(中间可能产生多个文件,但最终会合并成一个),在 Reduce 阶段,每个 Reduce Task 会对收到的数据排序,这样,数据便按照 Key 分成了若干组,之后以组为单位交给 reduce处理 . 很多人的误解在 Map 阶段,如果不使用 Combiner便不会排序,这是错误的,不管你用不用 Combiner,Map Task 均会对产生的数据排序(如果没有 Reduce Task,则不会排序,实际上 Map 阶段的排序就是为了减轻 Reduce端排序负载) . 由于这些排序是 MapReduce 自动完成的,用户无法控制,因此,在hadoop 1.x 中无法避免,也不可以关闭,但 hadoop2.x 是可以关闭的 . 

交换排序
两两比较待排序的关键字,并交换不满足次序要求的那对数,直到整个表都满足次序要求为止 . 

冒泡排序 
交换排序的一种
1 比较相邻的元素 . 如果第一个比第二个大(小),就交换他们两个 . 
2 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对 . 这步做完后,最后的元素会是最大(小)的数 . 
3 针对所有的元素重复以上的步骤,除了最后已经选出的元素(有序) . 
4 持续每次对越来越少的元素(无序元素)重复上面的步骤,直到没有任何一对数字需要比较,则序列最终有序 . 

快速排序(Quicksort)是对冒泡排序的一种改进,通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列 . 

归并排序


选择排序
选择法的原理是先将第一个数与后面的每一个数依次比较,不断将将小的赋给第一个数,从而找出最小的,然后第二个数与后面的每一个数依次比较,从而找出第二小的,然后第三个数与后面的

比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序 . 
非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序 . 

Shuffle是一个过程,是在map端到reduce在调reduce数据之前都叫shuffle,主要是分区与排序,也就是内部的缓存分区以及分发(是reduce来拉数据的)和传输

1 优化的思路可以从配置文件和系统以及代码的设计思路来优化
2 配置文件的优化:调节适当的参数,在调参数时要进行测试
3 代码的优化:combiner的个数尽量与reduce的个数相同,数据的类型保持一致,可以减少拆包与封包的进度
4 系统的优化:可以设置linux系统打开最大的文件数预计网络的带宽MTU的配置
5 为 job 添加一个 Combiner,可以大大的减少shuffle阶段的map Task拷贝过来给远程的   reduce task的数据量,一般而言combiner与reduce相同 . 
6 在开发中尽量使用stringBuffer而不是string,string的模式是read-only的,如果对它进行修改,会产生临时的对象,二stringBuffer是可修改的,不会产生临时对象 . 
7 修改一下配置:
一下是修改 mapred-site.xml 文件
修改最大槽位数
槽位数是在各个 tasktracker 上的 mapred-site.xml 上设置的,默认都是 2
<property>
<name>mapred.tasktracker.map.tasks.maximum</name>
maptask 的最大数
<value>2</value>
</property>
<property>
<name>mapred.tasktracker.reduce.tasks.maximum</name>
rducetask 的最大数
<value>2</value>
</property>
调整心跳间隔
集群规模小于 300 时,心跳间隔为 300 毫秒
mapreduce.jobtracker.heartbeat.interval.min 心跳时间
mapred.heartbeats.in.second 集群每增加多少节点,时间增加下面的值
mapreduce.jobtracker.heartbeat.scaling.factor 集群每增加上面的个数,心跳增多少
启动带外心跳
mapreduce.tasktracker.outofband.heartbeat 默认是 false
配置多块磁盘
mapreduce.local.dir
配置 RPC hander 数目
mapred.job.tracker.handler.count 默认是 10,可以改成 50,根据机器的能力
配置 HTTP 线程数目
tasktracker.http.threads 默认是 40,可以改成 100 根据机器的能力
选择合适的压缩方式
以 snappy 为例:
<property>
<name>mapredpress.map.output</name>
<value>true</value>
</property>
<property>
<name>mapred.map.outputpression.codec</name>
<value>org.apache.hadoop.iopress.SnappyCodec</value>
</property>

hadoop2最主要的两个变化是:namenode可以集群的部署了,hadoop2中的mapreduce中的jobTracker中的资源调度器与生命周期管理是YARN(管理全部资源的ResourceManager以及管理每个应用的ApplicationMaster)
Hadoop1时代中MapReduce可以说是啥事都干,而Hadoop2中的MapReduce的话则是专门处理数据分析,而YARN则做为资源管理器而存在 . 
该架构将JobTracker中的资源管理及任务生命周期管理(包括定时触发及监控),拆分成两个独立的服务,用于管理全部资源的ResourceManager以及管理每个应用的ApplicationMaster,ResourceManager用于管理向应用程序分配计算资源,每个ApplicationMaster用于管理应用程序 调度以及协调 . 一个应用程序可以是经典的MapReduce架构中的一个单独的Job任务,也可以是这些任务的一个DAG(有向无环图)任务 . ResourceManager及每台机上的NodeManager服务,用于管理那台主机的用户进程,形成计算架构 . 每个应用程序的ApplicationMaster实际上是一个框架具体库,并负责从ResourceManager中协调资源及与NodeManager(s)协作执行并监控任务 . 
(1)ResourceManager包含两个主要的组件:定时调用器(Scheduler)以及应用管理器(ApplicationManager) . 
  ①定时调度器(Scheduler):
  定时调度器负责向应用程序分配资源,它不做监控以及应用程序的状态跟踪,并且它不保证会重启由于应用程序本身或硬件出错而执行失败的应用程序 . 
  ②应用管理器(ApplicationsManager ASM):
  应用程序管理器负责接收新任务,协调并提供在ApplicationMaster容器失败时的重启功能 . 
(2)ApplicationMaster(yarn核心组件):每个应用程序的ApplicationMaster负责从Scheduler申请资源,以及跟踪这些资源的使用情况以及任务进度的监控 . 
(3)NodeManager:NodeManager是ResourceManager在每台机器的上代理,负责容器的管理,并监控他们的资源使用情况(cpu,内存,磁盘及网络等),以及向 ResourceManager/Scheduler提供这些资源使用报告

实现两个表的join首先在map端需要把表标识一下,把其中的一个表打标签,到reduce端再进行笛卡尔积的运算,就是reduce进行的实际的链接操作 . 

当map端一个文件非常大另外一个文件非常小时就会产生资源的分配不均匀,既可以使用setPartitionerClass来设置分区,即形成了二次分区 . 

hadoop的mapreduce的排序发生在几个阶段?
发生在两个阶段即使map与reduce阶段

Mapreduce中的Combiner就是为了避免map任务和reduce任务之间的数据传输而设置的,Hadoop允许用户针对map task的输出指定一个合并函数 . 即为了减少传输到Reduce中的数据量 . 它主要是为了削减Mapper的输出从而减少网络带宽和Reducer之上的负载 . 
在数据量较少时不宜使用 . 

随着大数据的快速发展,多机器的协调工作,避免主要机器单点故障的问题,于是就引入管理机器的一个软件,他就是zookeeper来协助机器正常的运行 . 
Zookeeper有三个角色分别是leader与follower和obsrvr,其中leader是主节点,其他的是副节点,在安装配置上一定要注意配置奇数个的机器上,便于zookeeper快速切换选举其他的机器 . 
在其他的软件执行任务时在zookeeper注册时会在zookeeper下生成相对应的目录,以便zookeeper去管理机器 . 

主要是配置文件zoo.cfg 配置dataDir 的路径,dataLogDir 的路径以及myid的配置以及server的配置,心跳端口与选举端口

hive是怎样保存元数据的
保存元数据的方式有:内存数据库derby,本地mysql数据库,远程mysql数据库,但是本地的mysql数据用的比较多,因为本地读写速度都比较快

hive保存元数据的方式以及各有什么特点?
Hive有内存数据库derby数据库,特点是保存数据小,不稳定
使用derby数据库存储元数据 . 
这种方式是最简单的存储方式,只需要在hive-default.xml或hive-site.xml做如下配置便可 . 
使用derby存储方式时,运行hive会在当前目录生成一个derby文件和一个metastore_db目录 . 这种存储方式的弊端是在同一个目录下同时只能有一个hive客户端能使用数据库,否则会提示如下错误(这是一个很常见的错误) . 
2 mysql数据库,储存方式可以自己设定,持久化好,一般企业开发都用mysql做支撑
使用本机mysql服务器存储元数据 . 这种存储方式需要在本地运行一个mysql服务器,并作如下配置(需要将mysql的jar包拷贝到$HIVE_HOME/lib目录下) . 
使用远端mysql服务器存储元数据 . 这种存储方式需要在远端服务器运行一个mysql服务器,并且需要在Hive服务器启动meta服务 . 
默认监听的端口是9083

先来说下Hive中内部表与外部表的区别:
Hive 创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变 . 
在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据 . 这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据 . 

对于 hive,你写过哪些 UDF 函数,作用是什么
UDF:user  defined  function  的缩写,编写hive udf的两种方式extends UDF 重写evaluate第二种extends GenericUDF重写initialize getDisplayString evaluate方法

Hive 的 sort by 和 order by 的区别
order by 会对输入做全局排序,因此只有一个reducer(多个reducer无法保证全局有序)只有一个reducer,会导致当输入规模较大时,需要较长的计算时间 . 
sort by不是全局排序,其在数据进入reducer前完成排序.
因此,如果用sort by进行排序,并且设置mapred.reduce.tasks>1, 则sortby只保证每个reducer的输出有序,不保证全局有序 . 
sort by 不受 hive.mapred.mode 是否为strict ,nostrict 的影响
sort by 的数据只能保证在同一reduce中的数据可以按指定字段排序 . 
使用sort by 你可以指定执行的reduce 个数 (set mapred.reduce.tasks=<number>),对输出的数据再执行归并排序,即可以得到全部结果 . 
注意:可以用limit子句大大减少数据量 . 使用limit n后,传输到reduce端(单机)的数据记录数就减少到n (map个数) . 否则由于数据过大可能出不了结果 . 
distribute by
按照指定的字段对数据进行划分到不同的输出reduce  / 文件中 . 
此方法会根据name的长度划分到不同的reduce中,最终输出到不同的文件中 .   
length 是内建函数,也可以指定其他的函数或这使用自定义函数 . 
Cluster By
cluster by 除了具有 distribute by 的功能外还兼具 sort by 的功能 .  
但是排序只能是asc,不能指定排序规则为asc 或者desc . 

当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用
存储过程可以重复使用,可减少数据库开发人员的工作量
响应时间上来说有优势:如果你在前台处理的话 . 可能会涉及到多次数据库连接 . 但如果你用存储过程的话,就只有一次 . 存储过程可以给我们带来执行效率提高的好处
更好的安全机制,对于没有权限执行存储过程的用户,也可授权他们执行存储过程

可以提高运算的速度,大量的运算都可以在服务器端运行,比如报表等可以在服务器上用存储过程定时来生成(选择不忙的时候)


(1)hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的 sql 查询功能,可以将 sql 语句转换为 MapReduce 任务进行运行 . 其优点是学习成本低,可以通过类 SQL 语句快速实现简单的 MapReduce 统计,不必开发专门的 MapReduce 应用,十分适合数据仓库的统计分析 . 
(2)Hive 是建立在 Hadoop 上的数据仓库基础构架 . 它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储 查询和分析存储在 Hadoop 中的大规模数据的机制 . Hive 定义了简单的类 SQL 查询语言,称为 HQL,它允许熟悉 SQL 的用户查询数据 . 同时,这个语言也允许熟悉 MapReduce 开发者的开发自定义的 mapper 和 reducer 来处理内建的 mapper 和 reducer 无法完成的复杂的分析工作 . 

Sqoop是一个在结构化数据与Hadoop Hive丶HDFS中之间进行批量数据迁移的工具,结构化数据可以是Mysql Oracle等RDBMS . Sqoop底层用MapReduce程序实现抽取 转换 加载,MapReduce天生的特性保证了并行化和高容错率,而且相比Kettle等传统ETL工具,任务跑在Hadoop集群上,减少了ETL服务器资源的使用情况 . 在特定场景下,抽取过程会有很大的性能提升 . 
对于某些NoSQL数据库它也提供了连接器 . Sqoop,类似于其他ETL工具,使用元数据模型来判断数据类型并在数据从数据源转移到Hadoop时确保类型安全的数据处理 . Sqoop专为大数据批量传输设计,能够分割数据集并创建Hadoop任务来处理每个区块 . 

hive partition 分区
分区表,动态分区
他和mr不是一个概念

insert into 和 override write 区别?
insert into:将某一张表中的数据写到另一张表中
override write:覆盖之前的内容 . 

Hbase 的 rowkey 怎么创建比较好?列族怎么创建比较好?
Rowkey是一个二进制码流,Rowkey的长度被很多开发者建议说设计在10~100个字节,不过建议是越短越好,不要超过16个字节 . 在查找时有索引会加快速度 . 
Rowkey散列原则   Rowkey唯一原则   针对事务数据Rowkey设计   针对统计数据的Rowkey设计   针对通用数据的Rowkey设计  支持多条件查询的RowKey设计 .  
总结设计列族:
1 一般不建议设计多个列族
2 数据块的缓存的设计
3 激进缓存设计
4 布隆过滤器的设计(可以提高随机读取的速度)
5 生产日期的设计
6 列族压缩
7 单元时间版本

Hbase 的实现原理
Hbase  的实现原理是rpc Protocol 

Hbase的过滤器有:RowFilter PrefixFilter KeyOnlyFilter RandomRowFilter InclusiveStopFilter FirstKeyOnlyFilter ColumnPrefixFilter ValueFilter ColumnCountGetFilter SingleColumnValueFilter SingleColumnValueExcludeFilter WhileMatchFilter FilterList 
比较常用的过滤器有:RowFilter 一看就知道是行的过滤器,来过滤行的信息 . PrefixFilter前缀的过滤器,就是把前缀作为参数来查找数据

hbase 主要的配置文件有hbase.env.sh 主要配置的是JDK的路径以及是否使用外部的ZK,hbase-site.xml 主要配置的是与HDFS的链接的路径以及zk的信息,修改regionservers的链接其他机器的配置 . 

Hive的权限需要在hive-site.xml文件中设置才会起作用,配置默认的是false,需要把hive.security.authorization.enabled设置为true,并对不同的用户设置不同的权限,例如select ,drop等的操作 . 

hbase 写数据的原理
1. 首先,client通过访问ZK来请求目标数据的地址 . 
2. ZK中保存了-ROOT-表的地址,所以ZK通过访问-ROOT-表来请求数据地址 . 
3. 同样,-ROOT-表中保存的是.META.的信息,通过访问.META.表来获取具体的RS . 
4. .META.表查询到具体RS信息后返回具体RS地址给client . 
5. client端获取到目标地址后,然后直接向该地址发送数据请求 . 

hbase宕机了如何处理?
HBase的RegionServer宕机超过一定时间后,HMaster会将其所管理的region重新分布到其他活动的RegionServer上,由于数据和日志都持久在HDFS中,
该操作不会导致数据丢失 . 所以数据的一致性和安全性是有保障的 . 
但是重新分配的region需要根据日志恢复原RegionServer中的内存MemoryStore表,这会导致宕机的r

本文标签: 数据大杂烩面试题