科多大数据小讲堂 之大数据分析之技能 框架整理 。
大数据离线部分
HDFS
1:HDFS的架构部分 及工作原理
NameNode:负责管理元素据,将信息生存 在内存中
DataNode:生存 数据 ,以块的情势 生存 。启动后必要 定时的向NameNode发送心跳,陈诉 自身存储的块信息
2:HDFS的上传过程
3:HDFS的下载
4:NameNode的元数据安全机制
以记日记 的情势 将每一个操纵 写在磁盘的日记 文件中,然后借助Secondary NameNode的checkpoint功能将fsImage和日记 举行 归并 。
重点:记取 checkpoint工作过程
5:假如 服务器的磁盘坏了 ,怎样 救济 数据?
设置 多个dfs.namenode.name.dir 路径为本地 磁盘路径和nfs网络磁盘路径 。
6:hdfs集群中,受到拓展瓶颈的是NameNode还是 Datanode?
是NameNode,由于 DataNode不敷 可以很方便的程度 拓展,而工作的NameNode只有一个 ,他的存储本领 完全取决于他的内存。
但是着实 NameNode一样平常 不会成为瓶颈,由于 一个块记录 的元数据信息巨细 约为150B,假如 每一个块巨细 为128M的话 ,那么15G的NameNode内存可以存储12PB的数据。
7:datanode显着 已启动,但是集群中的可用datanode列表中就是没有,怎么办?
在她的Data目次 下 ,已经有其他NameNode的标记 ,这个NameNode不认。
8:文件下载到window中,为什么会报错?
默认利用 操纵 体系 的内核举行 磁盘数据的写入 ,也就是必要 一个winutil的工具,而默认的安装包中不提供,以是 必要 编译源码大概 设置为利用 Java的举行 磁盘写入 。
9:hadoop的HA(高可用)
MapReduce
1:MapReduce中 ,fileinputformat - map - shuffle - reduce的过程
2:MapReduce中,job提交的过程
3:自界说 Javabean作为数据,必要 extends writableandCompareble接口。
4:自界说 outputformat,举行 差别 方向的处理 惩罚 。
5:MapReduce的一些应用场景
1 、排序而且 求 TOPOne 和TOPN
2、求某个用户前几个月的总流量 ,而且 选择出流量前几名的用户 。
3、reduce端的join
4 、map端join
5、求共同好友 题目
hive
1:什么是hive?
一个将sql转化为MapReduce程序的、单机版的、数据堆栈 工具。通过关系型数据库(mysql等)来记录 表元数据信息。真正的数据在HDFS中 。
Hive利用 HDFS存储数据,利用 MapReduce查询分析数据
hive2.0版本之后,都是基于Spark处理 惩罚 了。
安装的时间 ,必要 留意 jline的版本辩论 。
2:怎样 启动?
3:实行 的sql的情势
hiveshell 、 hive -e “sql下令 ”、 hive -f “一个包罗 着很多 SQL语句的文件 ”
4:hive的创建表操纵
内部表、外部表 就差连个关键字(external 和 location)
分区表 、分桶表
5:hive查询表
join
动态分区
分组查询
复杂的谁人 累计报表操纵 。
6:hive自界说 函数(UDF)
sqoop
利用 hadoop的map端举行 数据的并行导入导出。
安装在HDFS上,设置 HDFS的路径和Hive路径即可。
flume
1:agent:sources 、 channel 、 sinks
2:sources:exec 、spooldir、arvo (加一个拦截器)
3:channel:men 、 disk
4:sinks:arvo 、HDFS、kafka
5:flume安装在数据源这一边 。
6:怎样 自界说 拦截器?
class myiterceptor implements Iterceptor
//内里 有一个静态的公共内部类。
public static class mybuilder implements Iterceptor.Builder
7:怎样 实现flume的多级毗连 ,以及怎样 实现高可用?
大数据及时 storm部分
storm
1 : storm是一个及时 的盘算 框架 ,只负责盘算 ,不负责存储。它通过spout的open和nextTuple方法去外部存储体系 (kafka)获取数据,然后传送给后续的bolt处理 惩罚 ,
bolt利用 prepare和execute方法处理 惩罚 完成后,继承 今后 续的bolt发送,大概 根据输出目次 ,把信息写到指定的外部存储体系 中。
2:storm的数据不丢失原理
交错 收到的数据做异或元算中心 结果 不为0的原理 。
3:设置spout_max_pending (可以限流)
4:jstorm的通讯 机制,每一个:worker都有一个担当 线程和输出线程
5:storm的架构分析
nimbus、zookeeper 、supervisor、worker
nimbus:担当 任务 哀求 ,而且 举行 任务 的分发,末了 写入到zookeeper中。
supervisor:担当 nimbus的任务 调治 ,然后启动和管理属于本身 的worker进程 ,supervisor是可以快速失败的 ,不影响任务 的实行 。
我们可以写一个脚原来 监控supervisor的进程 ,假如 不存在了,立马启动 ,就可以了 。
worker:启动spoutTask、boltTask等等任务 ,去实行 业务逻辑。
6:storm的编程模子
topology:由spout和bolt构成 的一个流程图。他形貌 着本次任务 的信息
spout:
open
nexttuple
declareOutputFields
bolt:
prepare
execute
declareOutputFields
6:storm的tuple布局 ,它内里 有两个数据布局 ,一个list、一个是map
list:记录 着信息
map:记录 着每个字段对应的下表,通过找到下边再去上面的list中找数据 。
7:storm任务 提交的过程
kafka
1 、kafka和jms的区别
2、kafka的topic明白
topic是逻辑存在的,真正在物理磁盘中的表现 是partitioner ,一个topic可以对应多个partition,差别 的paritition存放在差别 的broker中,以进步 并发存储本领 。
3、partitioner
partition是topic信息在屋里存储中的具体 表现 ,在磁盘中它是一个文件夹,名字是topic名字_partition编号。4 、segment
每个partition对对应多个segment文件,默认巨细 是1G,为了快速定位到指定的offset位置 。
5、kafka为什么这么快
1/利用 了操纵 体系 利用 的pagecache缓存 ,缓存大,缓存到肯定 量的数据时,以次序 写入的方 式写入到磁盘中。
由于 :磁盘次序 写入的方式非常的快=600MB/s,而随机存储只有100kb/s左右。
2/利用 操纵 体系 的sendfile技能 。在读取信息发送的时间 ,不必要 颠末 用户区,而是在os端直接发送,可以镌汰 很多 步调 。
6、为什么要多个partitioner7 、为什么每个partitioner必要 切分为多个segment文件
8、kafka的HA
对partitioner分区举行 备份 ,利用 zookeeper的推举 机制选择leader。数据的生产存储和斲丧 读取都是有leader负责,其他的replicatition只是负叱责 份而已。
9、kafka怎样 用shell脚原来 讲一个文件读写进去?10 、kafka怎样 用JavaAPI实现生产者和斲丧 者?
大数据一站式办理 方案:Scala和Spark部分
scala回顾
1、怎样 界说 变量
2、怎样 界说 函数 、方法,如安在 将函数作为方法的参数传入进去?
3、条件判定 语句 ,循环控制语句
4、聚集 操纵 :Array、list 、set、tuple、map (留意 :可变和不可变的区别)5 、样例类的利用 6、trit、抽象类的利用 7 、主构造器和辅助构造器的利用
8、scala的高级特性
高阶函数:作为值得函数、匿名函数 、闭包、柯里化
隐式转换:一个类对象中,假如 他没有摸一个功能,但是我们有想要它实现 ,可以利用 英式转换的方式 。
object MyPredef{
//界说 隐式转换方法
implicit def fileReadToRichFile(file: File)=new RichFile(file)
}
利用 :
import MyPredef._9、Actor
写起来像多线程,用起来像socket10 、akka
ActorSystem.actorOf()创建一个Actor,
创建的同时,就是实行 Actor中的prestart方法 ,去初始化一些信息。
Spark RDD
1、SparkRDD叫做:弹性分布式数据集,着实 就是一个类,用来形貌 :任务 的数据从那边 读取、用谁人 算举行 盘算 、得到的结果 有存放在那边 、RDD之间的依靠 关系是款以来还是 窄依靠
2、RDD有五个特点
一系列分区
每个算子作用在每个分区上
一系列依靠 关系
最有位置(假如 从HDFS上读取数据)
3、RDD的两种算子Transformation和Action
Transformation是懒加载 ,只是界说 了这个算子的任务 ,该怎样 做,但是还没有做。
Action是立即 实行 ,当实行 到Action时,会触发DAGSchudle切分stage,切分完成后 ,有TaskScheduler将任务 通过DriverActor发送到executor中实行 。
4 、RDD的几个复杂的Transformation
-combineByKey(x=x,(a:List[String],b:String) = a :+ b,
(m:List[String],n:List[String])= m ++ n)
第一个参数表现 分组后的第一个值如那边 理 惩罚 ,
第二个参数表现 后续的值和前一个值如那边 理 惩罚 ,
第三个参数表现 ,map端处理 惩罚 完成后,在reduce端怎样 对这些list举行 处理 惩罚 。
-aggregate(“初始量,可以是String也可以是int”)(第一个func,第二个func)
初始量作用于没一个分区 ,第一个func作用于map端,第二个func作用于reduce端。
-reduceByKey(_+_) 作用于map端和reduce端,可以举行 局部聚合 。
着实 reduceByKey和aggregateByKey在底层都调用了combineByKey方法来实现相应 的功能。
-mapPartitions
对每一个分区举行 操纵 ,直接在内里 利用 匿名函数即可
固然 假如 逻辑非常复杂也是可以思量 在表面 先界说 好这个函数之后在传输进去。
rdd1.mapPartitions((it:Iterator[String]) = {
it.toList.map(x = (x,1)).iterator
})
mapPartitionsWithIndex
起首 界说 一个函数,固然 也可以写在内里 作为匿名函数
val func = (index:Int, it:Iterator[Int]) = {
it.toList.map(x = ("index:" + index, x)).iterator
}
rdd1.mapPartitionsWithIndex(func).collect
5、RDD自界说 Partitioner
//自界说 分区器,重写内里 的getPartition方法和numPartitions方法 。
//构造这个对象的时间 ,就把全部 环境 的信息传输过来,然后在内里 举行 分类处理 惩罚 。
class HostPartition(hostArr:Array[String]) extends Partitioner{
//对全部 的数据举行 分类,每一种范例 对应一个int编号。以是 利用 map比力 符合 。
val map = new mutable.HashMap[String,Int]()
for(index
map.put(hostArr(index),index)
}
//重写getPartition的方法。
override def getPartition(key: Any): Int = {
map.getOrElse(key.toString,0)
}
override def numPartitions: Int = hostArr.length
}
应用:
val hostPartition: HostPartition = new HostPartition(hostList)
val allPartitionRDD: RDD[(String, (String, Int))] = host_url_count.partitionBy(hostPartition)
6、自界说 排序规则 ==界说 一个
case class Gril(yanzhi:Int,nianling:Int) extends Ordered[Gril] with Serializable{
override def compare(that: Gril): Int = {
val yanzhiResult: Int = this.yanzhi.compareTo(that.yanzhi)
if(yanzhiResult == 0){
return this.nianling.compareTo(that.nianling)
}
return yanzhiResult
}
}
应用:
val rdd2: RDD[(String, Int, Int)] = rdd1.sortBy(msg = Gril(msg._2,msg._3))
Spark的SQLContext
1 、Spark整合Hive和HDFS 只必要 将Hive的hive-site.xml ; hadoop的core-site.xml和hdfs-site.xml拷贝到Spark的conf目次 下即可。Spark就知道怎样 利用 hive的表 ,同时也知道去哪个NameNode那边 都数据了。
2、DataFrame是什么?
是一个分布式数据集,对RDD的封装 。RDD有的方法他根本 上都有
3、DataFrame怎样 创建?
三种方式:-RDD + case class
-RDD + structType
-sqlContext.read.format.options(Map())
4 、DataFrame起首 必要 注册成表布局 之后才可以利用 sqlContext来操纵 。
dF.registerTempTable(“person”)
5、利用 sqlContext == 返回一个DataFrame
sqlContext.sql(“select * from person ”)
6、DataFrame将数据写入到HDFS大概 mysql中
val prop = new Properties()
prop.put("user", "root")
prop.put("password", "815325")
//假如 数据库中没有这个表,那么他也会创建一张表(很强大 )
resultDF.write.mode("append").jdbc("jdbc:mysql://localhost:3306/bigdata","result",prop)