文档章节

1、大数据框架工具回顾

刘付kin
 刘付kin
发布于 2016/12/09 14:08
字数 2876
阅读 22
收藏 0

大数据离线部分

1、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(高可用)

2、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、求共同好友问题
    

3、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)

4、sqoop

利用hadoop的map端进行数据的并行导入导出。

安装在HDFS上,配置HDFS的路径和Hive路径即可。

5、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
    
  • 7、storm的tuple结构,它里面有两个数据结构,一个list、一个是map

    list:记录着信息

    map:记录着每个字段对应的下表,通过找到下边再去上面的list中找数据。

  • 8、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、为什么要多个partitioner

  • 7、为什么每个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

    写起来像多线程,用起来像socket

  • 10、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

      1、->combineByKey(x=>x,(a:List[String],b:String) => a :+ b, 
      	            (m:List[String],n:List[String])=> m ++ n)
         第一个参数表示分组后的第一个值如何处理,
         第二个参数表示后续的值和前一个值如何处理,
         第三个参数表示,map端处理完成后,在reduce端如何对这些list进行处理。
    
      2、->aggregate("初始量,可以是String也可以是int")(第一个func,第二个func)	
         初始量作用于没一个分区,第一个func作用于map端,第二个func作用于reduce端。
    
      3、->reduceByKey(_+_)  作用于map端和reduce端,可以进行局部聚合。
      	其实reduceByKey和aggregateByKey在底层都调用了combineByKey方法来实现响应的功能。
    
      4、->mapPartitions
      	对每一个分区进行操作,直接在里面使用匿名函数即可
      	当然如果逻辑非常复杂也是可以考虑在外面先定义好这个函数之后在传输进去。
    
      	rdd1.mapPartitions((it:Iterator[String]) => {
      		it.toList.map(x => (x,1)).iterator
      	})
    
      5、->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 <- 0 until(hostArr.length)){
          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)
    

© 著作权归作者所有

刘付kin
粉丝 8
博文 149
码字总数 117524
作品 0
深圳
大数据解决方案、介绍如何快速入门

Hadoop是一个开源框架,它允许在整个集群使用简单编程模型计算机的分布式环境存储并处理大数据。它的目的是从单一的服务器到上千台机器的扩展,每一个台机都可以提供本地计算和存储。 “90%...

编程南风
07/12
0
0
大数据研究趋于商业化 回顾2016大数据领域成果|

2016即将结束,外媒KDnuggets日前针对大数据领域在2016年度取得的重大发展,以及2017年度可能出现的变化趋势,询问了8位行业内的顶级专家。 虽然各位专家的意见不尽相同,但从其发言中大约可...

玄学酱
04/23
0
0
6月15日云栖精选夜读丨史上最大规模世界杯直播 阿里云承包了全网70%的流量

6月14日晚,2018年俄罗斯世界杯在莫斯科开幕。国内数千万的观众通过CCTV5、优酷、央视影音或者是咪咕视频观看了此次开幕赛。值得注意的是,这四大官方指定网络直播平台都选择了使用阿里云的技...

yq传送门
06/15
0
0
QCon2018全球软件开发大会精彩回顾!

全球软件开发大会回顾 主题:百度智能运维的工程架构 时间:2018年4月21日 地点:北京 4月21日,百度云智能运维架构团队负责人王艺受邀出席由InfoQ主办的QCon北京2018全球软件开发大会,发表...

g2v13ah
04/26
0
0
大数据入门需要具备的能力与素质

一、大数据分析的五个基本方面 1、可视化分析 大数据分析的使用者有大数据分析专家,同时还有普通用户,但是他们二者对于大数据分析最基本的要求就是可视化分析,因为可视化分析能够直观的呈...

小欣妹妹
02/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Java动态代理之InvocationHandler最简单的入门教程

网上关于Java的动态代理,Proxy和InvocationHandler这些概念有讲解得非常高深的文章。其实这些概念没有那么复杂。现在咱们通过一个最简单的例子认识什么是InvocationHandler。值得一提的是,...

JerryWang_SAP
18分钟前
0
0
oracle 在 MyBatis 中使用 like

两种使用方法 使用oracle自带 || 拼凑的方式 <if test="userName!=null and userName!=''"> AND u.USER_NAME like '%' || #{userName} || '%' </if> 使用MyBatis的$符号的方式 <if test="us......

karma123
24分钟前
1
0
带接口的webservice方式发布

package cn.it.ws.e;import javax.jws.WebService;/** * 面向接口的webservice发布方式 * @author Administrator * */@WebServicepublic interface JobService {publi...

江戸川
39分钟前
2
0
day122-20181020-英语流利阅读-待学习

蜘蛛侠新片《毒液》来袭!导演灵感来自哪? Roxy 2018-10-20 1.今日导读 你还记得漫威宇宙中飞檐走壁的蜘蛛侠小可爱吗?在刚过去的国庆黄金周里,索尼影业发行的漫威超级英雄蜘蛛侠系列大片《...

飞鱼说编程
50分钟前
4
0
美团点评Docker容器管理平台

美团点评容器平台简介 本文介绍美团点评的Docker容器集群管理平台(以下简称“容器平台”)。该平台始于2015年,是基于美团云的基础架构和组件而开发的Docker容器集群管理平台。目前该平台为...

Skqing
56分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部