科多大数据小讲堂之大数据分析之技能框架整理。
大数据离线部分
HDFS
1:HDFS的架构部分及工作原理
NameNode:负责管理元素据,将信息生存在内存中
DataNode:生存数据,以块的情势生存。启动后必要定时的向NameNode发送心跳,陈诉自身存储的块信息
2:HDFS的上传过程
3:HDFS的下载
4:NameNode的元数据安全机制
以记日记的情势将每一个操纵写在磁盘的日记文件中,然后借助SecondaryNameNode的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作为数据,必要extendswritableandCompareble接口。
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:怎样自界说拦截器?
classmyiterceptorimplementsIterceptor
//内里有一个静态的公共内部类。
publicstaticclassmybuilderimplementsIterceptor.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的高级特性
高阶函数:作为值得函数、匿名函数、闭包、柯里化
隐式转换:一个类对象中,假如他没有摸一个功能,但是我们有想要它实现,可以利用英式转换的方式。
objectMyPredef{
//界说隐式转换方法
implicitdeffileReadToRichFile(file:File)=newRichFile(file)
}
利用:
importMyPredef._9、Actor
写起来像多线程,用起来像socket10、akka
ActorSystem.actorOf()创建一个Actor,
创建的同时,就是实行Actor中的prestart方法,去初始化一些信息。
SparkRDD
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
起首界说一个函数,固然也可以写在内里作为匿名函数
valfunc=(index:Int,it:Iterator[Int])={
it.toList.map(x=("index:"+index,x)).iterator
}
rdd1.mapPartitionsWithIndex(func).collect
5、RDD自界说Partitioner
//自界说分区器,重写内里的getPartition方法和numPartitions方法。
//构造这个对象的时间,就把全部环境的信息传输过来,然后在内里举行分类处理惩罚。
classHostPartition(hostArr:Array[String])extendsPartitioner{
//对全部的数据举行分类,每一种范例对应一个int编号。以是利用map比力符合。
valmap=newmutable.HashMap[String,Int]()
for(index
map.put(hostArr(index),index)
}
//重写getPartition的方法。
overridedefgetPartition(key:Any):Int={
map.getOrElse(key.toString,0)
}
overridedefnumPartitions:Int=hostArr.length
}
应用:
valhostPartition:HostPartition=newHostPartition(hostList)
valallPartitionRDD:RDD[(String,(String,Int))]=host_url_count.partitionBy(hostPartition)
6、自界说排序规则==界说一个
caseclassGril(yanzhi:Int,nianling:Int)extendsOrdered[Gril]withSerializable{
overridedefcompare(that:Gril):Int={
valyanzhiResult:Int=this.yanzhi.compareTo(that.yanzhi)
if(yanzhiResult==0){
returnthis.nianling.compareTo(that.nianling)
}
returnyanzhiResult
}
}
应用:
valrdd2: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+caseclass
-RDD+structType
-sqlContext.read.format.options(Map())
4、DataFrame起首必要注册成表布局之后才可以利用sqlContext来操纵。
dF.registerTempTable(“person”)
5、利用sqlContext==返回一个DataFrame
sqlContext.sql(“select*fromperson”)
6、DataFrame将数据写入到HDFS大概mysql中
valprop=newProperties()
prop.put("user","root")
prop.put("password","815325")
//假如数据库中没有这个表,那么他也会创建一张表(很强大)
resultDF.write.mode("append").jdbc("jdbc:mysql://localhost:3306/bigdata","result",prop)
我要评论