FusionInsight大数据开发
FusionInsight HD是一个大数据全栈商用平台,支持各类通用大数据应用场景。html
技能需求python
- 扎实的编程基础
- Java/Scala/python/SQL/shell常见命令
- 掌握FusionInsight
- 熟悉业务开发
大数据应用开发流程web
应用开发关键点算法
应用开发指南--调试shell
总结:数据库
- 认证是应用开发的关键点,要根据业务需求,申请合适帐号,完成安全认证。
- 华为FusionInsight易集成开发,提供了包括应用开发指南,样例代码和支持团队等各种协助。
更新中......编程
HDFS应用开发
HDFS(Dadoop Distributed File System)后端
HDFS概述
HDFS架构包含三部分
- Name Node
- DataNode
- Client
HDFS数据写入流程
HDFS应用开发方式
Java/shell/Web UI缓存
HDFSJava应用开发
下载客户端/获取样例工程/生产样例工程/导入eclipse/编码安全
Java开发流程
- 初始化FSDataOutputstream对象
- 使用FSDataOutputStream对象初始化BufferedOutputStream.
- 使用BufferedOutputStream.write写入HDFS数据。
- 使用BufferedOutputStream.flush和FSDataOutputstream.hflush()将数据刷新到HDFS。
- 关闭数据流。)
应用开发规范
规范1:Java开发时,申请资源须要及时释放。
规范2:HDFS不适用于存储大量小文件。
规范3:HDFS中数据备份3份便可。
规范4:若是有多线程进行login的操做,当第一次登录成功后,全部线程再次登录时应该使用relogin的方式。
更新中......
HBase应用开发
HBase的定义
HBase是一个高可靠、高性能、面向列、可伸缩的分布式存储系统。
- 适合于存储大表数据,能够达到实时级别。
- 利用Hadoop HDFS 做为其文件存储系统,提供实时的读写的数据库系统。
- 利用ZooKeeper做为协同服务。
HBase架构
HBase的适用场景
- 海量数据
- 高吞吐量
- 须要在海量数据中实现高效的随机读取
- 须要很好的性能伸缩能力
- 可以同时处理结构化和非结构化的数据
- 不须要彻底拥有传统关系型数据库所具有的ACID特性
HBase应用开发流程
- 制定业务目标
- 准备开发环境
- 下载并导入样例工程
-
设计HBase表
设计原则:
查询数据惟一
数据均匀分布
查询性能优化
其余因素(region的提早划分,冷热Family的使用)
- 根据场景开发工程
- 编译并运行程序
- 查看结果与调试程序
HBase表设计-整体原则
设计目标:提升吞吐量
设计原则:预分region,是region分布均匀,提升并发
实现方法:Rowkey范围和分布已知,建议预分region
设计目标:提升写入性能
设计原则:避免过多的热点region
设计方法:根据应用场景,能够考虑将时间因素引入Rowkey
设计目标:提升查询性能
设计原则:数据连续存储,频繁访问的数据存储一个地方,数据连续存储,离散度,信息冗余。
实现方法:同时读取的数据存放在同一行、cell,使用二级索引
HBase表设计-设计内容
设计内容经过不一样维度,可分为:
Table设计(表粒度的设计)
- 建表方法
- 预分region
- Family属性
- 系统并发能力、数据清洗能力
RowKey设计
- 原则:须要同时访问的数据,RowKey尽可能连续
- 访问效率:分散写,连续读
- 属性内容:经常使用的查询场景属性
- 属性值顺序:枚举,访问权重
- 时间属性:循环Key+TTL,周期建表
- 二级索引
- 折中法
- 冗余法
Family设计
可枚举数量少扩展性弱的属性做为Family
Qualifier设计
不可枚举、数量多且扩展性强的属性做为Qualifier
原则:同时访问的数据存放到同一个Cell,列名尽可能简短
HBase经常使用接口
create()
put()
get()
getScanner(Scan scan)
、、、
建立Configuration实例以及Kerberos安全认证
HBaseConfiguration方法
建立表
create Table方法
写入数据
put方法
读取一行数据
get方法
读取多行数据
scan方法
更新中......
MapReduce 应用开发
要求:
- MapReduce的基本定义及过程
- 搭建开发环境
- 代码实例及运行程序
- MapReduce开发接口介绍
1. MapReduce的基本定义及过程
MapReduce是面向大数据并行处理的计算模型、框架和平台,其资源调度由Yarn完成,任务资源隐含了如下三层含义:
- 1)MapReduce是 一个基于集群的高性能并行计算平台(cluster Infrastructure)。
- 2)MapReduce是 一个并行计算与运行软件框架(SoftWare Framework)
- 3)MapReduce是 一个并行程序设计模型与方法(Programming Model & Methodology)
MapReduce特色:
MapReduce的过程:
- 把输入的数据(Input) 拆分为多个键值对(key-value对)
- 每个键值对分别调用Map进行并行处理
- 每个Map会产生多个新的键值对
- 对Map阶段产生的数据进行排序、组合
- 以键值对的形式输出最终结果
2. 搭建开发环境
- 确认Yarn组件和MapReduce组件已经安装。
- 客户端安装Eclipse和JDK程序。
- 客户端机器的时间与FusInsight集群时间要保持一致,时间差要小于5分钟。
- 在Yarn服务页面下载MapReduce客户端程序到客户端机器中。
- 1.下载客户端
- 2.获取样例工程
- 3.生成样例工程
- 4.导入eclipse
- 5.编码
开发相关类的总结
1) InputFormat类
- 将输入的数据分割成split,并将split拆分为<key,value>做为map的输入。
2) Mapper类
- 实现map函数,根据输入的<key,value>对产生中间结果。
3)Combiner类
- 实现combiner函数,合并中间结果中具备相同key值的键值对。
4) Partitioner类
实现getPartitioner函数,在Shuffle过程按照key值将中间数据分红R份,每一份由一个Reduce负责
5) Reduce类
- 实现reduce函数,将中间结果合并,获得最终的结果。
6)OutputFormat类
- 该类负责输出最终的结果,MapReduce使用OutputFormat类将数据输出存入到文件中,每一个Reduce将它的输出直接写到本身的文件中。
调式代码
- MapReduce开发调式采用的原理是Java的远程调式机制
Hive应用开发
- 了解Hive的基本架构原理
- 掌握JDBC客户端开发流程
- 了解ODBC客户端的开发流程
- 了解python客户端的开发流程
- 了解Hcatalog/webHcat开发接口
- 掌握Hive开发规则
1. 了解Hive的基本架构原理
守护进程:
- HiveServer(Thrift/Compiler)
- webHcat
- MetaStore
Hive的应用场景
- 数据挖掘
- 非实时分析
- 数据汇总
- 做为数据仓库
2. 掌握JDBC客户端开发流程
JDBC开发-参数初始化
- 设置ZooKeeper地址
- krb5文件路径
- 设置JAAS配置
- 配置ZooKeeper Principal
- 执行登录
JDBC开发-拼接URL
- JDBC前缀设置
- 服务发现模式
- 安全配置:qop.auth.principal
- 非安全配置
JDBC开发-执行SQL
- 加载驱动类
- 创建链接
- 执行SQL
- 关闭链接
JDBC开发-SQL实现
- 建立preparedStatement
- 执行statement
- 关闭statement
规则建议:
开发调式:在开发程序时,可经过使用Hive的客户端Beeline先进行调试,检验语句与结果正确性,再部署基于JDBC等的应用程序。
获取数据库链接:Hive的数据库URL再拼接时已经通过安全认证,因此Hive数据库的用户名和密码为null或空 。
JDBC超时限制:Hive提供的JDBC实现的超时限制,默认是5分钟。
执行HQL:再JAVA JDBC应用开发中,拼装HQL语句,注意HQL语句不能以“;“结尾。
HQL语法规则之判空:判断字段为空使用:”is null“,判断不为空,即有值,使用:"is not null"
UDF的管理:建议由管理员建立永久UDF,避免每次使用时都去add jar,和从新定义UDF。
UDF的注解:Hive的UDF会有一些默认属性。@UDFType(deterministic = false)
使用分区表:当数据量较大时,且常常须要按天统计时,建议使用分区表,按天存放数据。
动态分区表:为了不插入动态分区数据过程当中,产生过多的小文件,在执行插入时,在分区字段上加distribut by。
文件格式选择:Hive支持多种存储格式,好比TextFile,RCFile,ORC,Sequence,Parquet.
sorl应用开发
要求:
- 了解Solr应用开发适用场景
- 熟悉Solr应用开发流程
- 熟悉并使用Solr经常使用API
- 理解Collection设计基本原则
- 应用开发实践
Solr简介
- Solr是一个高性能,基于Lucene的全文检索服务,也能够做为NoSQL数据库使用。
- Solr对Lucene进行了扩展,提供了比Lucene更为丰富的查询语句,同时实现了可配置、可扩展,并对查询性能进行了优化,还提供了一个完善的功能管理界面。
- SolrCloud是从Solr 4.0 版本开始发出的具备开创意义的分布式索引和索引方案,基于Sorl和Zookeeper进行开发的。
Solr概念体系-总述
常见术语:
- Config Set:Solr Core提供一组配置文件 ,
- Core:即Solr Core ,
- Shard:Collection的逻辑分片
- Replice:Shard下的实际存储索引的一个副本,与Core对应
- Leader:赢得选举的Shard Peplicas
- Zookeeper:它在Solr Core是必须的,提供分布式锁、处理Leader选举、管理配置等功能
Solr的经常使用应用场景
- 待检索数据类型复杂
- 检索条件多样化(如涉及字段太多),常规查询没法知足
- 读取远多于写入数据
Solr应用开发流程-制定业务目标
业务数据规模及数据模型
- 涉及Collection的Shard划分及Schema的定义
实时索引、查询性能要求
- 涉及Collection的Shard划分、索引存储位置
查询场景
Solr应用开发流程-初始化及安全认证
- 初始化并获取配置
- 安全认证
- 获取CloudSolrClient
- 调用Solr APL
Solr应用开发流程-设计Collection
- 根据业务数据的关系设计schema.xml
- 根据写入和查询场景设计uniqueKey字段
- 根据写入和查询性能要求设计solrconfig.xml
- 根据业务数据规模和Solr集群规模肯定Shard数目
- 根据可靠性能要求设定Shard副本数
Collection设计-索引存储位置
索引存储在HDFS
缺点:
- 与存储在本地磁盘相比,性能降低30%-50%
- 实时单节点写入速度<=2MB/s
- 数据膨胀略高于存储在本地
优势:
- Sorl设置Replica便可,利用HDFS副本机制保障数据可靠性
- 数据管理由HDFS完成,包括各节点数据balance、方便迁移
配置集Schema设计-Field
dynamicField
- 动态的字段设置,用于后期自定义字段,”*“号通配符。
copyField
Kafka应用开发
- 了解Kafka应用开发适用场景
- 熟悉Kafka应用开发流程
- 熟悉并使用Kafka经常使用API
- 进行Kafka应用开发
Kafka的定义
Kafka是一个高吞吐、分布式、基于发布订阅的消息系统
Kafka有以下几个特色:
- 高吞吐量
- 消息持久化到磁盘
- 分布式系统易扩展
- 容错性好
Kafka的适用场景
- 适用于离线和在线的消息消费
- 已对接组件
- Streaming、Spark、Flume
使用Kafka的好处
- 解耦--使得消息生产、消费系统可以独立变动
- 可靠--有效解决单点故障引起系统不可用问题
- 易扩展--生产、消费系统扩展简单
- 可恢复--消息缓存下来,支持故障从故障点读取
- 异步通讯--生产系统无需关心消费系统的消费时间
配置及开发准备--配置keytab文件到样例工程
- 配置Keytab到工程
- 安全认证
- Topic订阅
- 消费获取
- 消费处理
Kafka经常使用接口
- Kafka集群安全访问端口默认为21007,非安全访问端口默认为21005
Kafka Producer接口
- 向管理员申请目标Topic的生产者权限
- 根据业务需求,配置发送相关配置参数
- 调用新Producer API接口发送数据
Kafka Consumer接口
- 向管理员申请目标Topic的消费者权限
- 根据业务需求,配置消费者相关配置参数
- 调用新Consumer API接口进行消息消费
Spark应用开发
要求:
- 了解Spark基本原理
- 搭建Spark开发环境
- 开发Spark应用程序
- 调试运行Spark应用程序
YARN资源调度,能够和Hadoop集群无缝对接
Spark适用场景
大多数现有集群计算框架如MapReduce等基于从稳定存储(文件系统)到稳定存储的非循环数据流,数据重用都是基于磁盘的,执行效率比较低。
与传统的MapReduce任务频繁读写磁盘数据相比,基于内存计算的Spark则更适合应用在迭代计算,交互式分析等场景。
Spark应用运行流程--关键角色
- Client:需求提出方,负责提交需求(应用)。
- Driver:负责应用的业务逻辑和运行规划(DAG)。
- ApplicationMaster:负责应用的资源管理,根据应用的需求,向资源管理部门(ResourceManager)申请资源。
- ResourceManager:资源管理部门,负责整个集群的资源统一调度和分配
- Executor:负责实际计算工做,一个应用会分拆给多个Executor来进行计算。
Spark核心概念--RDD
RDD(Resilient Distributed Datasets)即弹性分布式数据集,指的是一个只读的,可分区的分布式数据集。这个数据集的所有或部分能够缓存在内存中,在屡次计算间重用。
RDD的生成
- 从Hadoop文件系统(或与Hadoop兼容的其它存储系统)输入建立(如HDFS)
- 从集群建立(如sc.Parallelize)。
- 从夫RDD转换获得新的RDD。
RDD的存储和分区
- 用户能够选择不一样的存储级别存储RDD以便重用(11种)
- 当前RDD默认存储于内存,但当内存不足时,RDD会溢出到磁盘中。
- RDD在须要进行分区时会根据每条记录Key进行分区,以此保证两个数据集能高效进行Join操做。
RDD的优势
- RDD是只读的,可提供更高的容错能力
- RDD的不可变性,能够实现Hadoop MapReduce的推测式执行
- RDD的数据分区特性能够经过数据的本地性来提升性能。
- RDD都是可序列化的,在内存不足时可自动降级为磁盘存储。
RDD的特色
- 在集群节点上时不可变的,是已分区的集合对象。
- 失败后自动重连
- 能够控制存储级别(内存、磁盘等)来进行重用。
- 必须是可序列化的
- 是静态类型。
RDD的建立
Spark全部操做都围绕弹性分布式数据集(RDD)进行,这是一个有容错机制并能够被并行操做的元素集合,具备只读,分区,容错,高效,无需物化,能够缓存,RDD依赖等特征。
目前有两种类型的基础RDD:
- 并行集合:接受一个已经存在的Scala集合,而后进行并行计算
- Hadoop数据集:在一个文件的每条记录上运行函数。
RDD的建立--并行集合
并行集合是经过调用SparkContext的parallelize方法,在一个已经存在的Scala集合(一个Seq对象)上建立的。
集合的对象将会被拷贝,建立出一个能够被并行操做的分布式数据集。
RDD依赖:宽依赖和窄依赖
RDD父子依赖关系
- 窄依赖:(Narrow)指父RDD的每个分区最多被一个子RDD的分区所用。
- 宽依赖:(Wide)指子RDD的分区依赖于父RDD的全部分区,是Stage划分的依据。
- RDD经常使用Transformation算子
- RDD经常使用Action算子
Spark任务参数配置
相同的数据,只建立一个RDD
算法调优--RDD缓存
- Spark可使用persist和cache方法将任意RDD缓存到内存、磁盘文件系统中。
算法调优--避免使用Shuffle
- Shuffle过程会有整个RDD数据的写和读的操做,成本很是高。
算法调优--使用广播变量
外部变量:
广播变量:
编写代码
- 登录
- 建立链接
- 执行SQL
- 获取结果
DataFrame介绍
DataFrame:已RDD为基础,带有Schema信息,相似传统数据库的二维表。
编写代码
- 登录
- 注册Table
- 执行SQL
- 过滤
SparkStreaming概述
SparkStreaming是Spark核心API的一个扩展,它对实时流式数据的处理具备可扩展性、高吞吐量、可容错性等特色。
SparkStreaming原理
- SparkStreaming接收实时的输入数据流,而后将这些数据切分为批数据供Spark引擎处理,Spark引擎将数据生成最终的结果数据。
- 使用DStream从Kafka和HDFS等源获取链接的数据流。DStream是一系列连续的RDD组成。
SparkStreaming数据源
- 基本源:HDFS等文件系统、Socket链接等
- 高级源:Kafka等
- 自定义源: 须要实现用户自定义receiver
可靠性(二次开发)
- Reliable Receiver
- 设置CheckPoint
- 确保Driver能够自动启动
- 使用Write Ahead Log 功能
SparkStreaming代码流程
常见业务代码逻辑
- 建立StreamingContext
- 定义输入源
- 准备应用计算逻辑
- 使用streamingContext.start()方法接受和处理数据。
- 使用streamingContext.stop()方法中止流计算。
窗口操做
SparkStreaming支持窗口计算,容许用户在一个滑动窗口数据上应用transformation算子。
窗口在源DStream上滑动,合并和操做落入窗口RDDs,产生窗口化的DStream的RDDs。
Checkpoint
SparkStreaming能够checkpoint足够的信息到容错存储系统中,以使系统崩溃后从故障中恢复。
- Metadata checkpoint:保存流计算的定义信息到HDFS中
- Data checkpoint:保存生成的RDD到HDFS中。
SparkStreaming性能调优
- 设置合理的批处理时间(batch Duration)
- 设置合理数据接收并行度
- 设置多个Receiver接受数据
- 设置合理的Receiver阻塞时间
- 设置合理数据处理并行度
- 使用Kryo系列化
- 内存调优
- 设置持久化级别减小GC开销
- 使用并发的标记-清理GC算法减小GC暂停时间
Redis应用开发
要求:
- 了解Redis应用场景
- 掌握Redis二次开发环境搭建
- 掌握Redis业务开发
Redis简介
- Redis是一个基于网络的,高性能key-value内存数据库
- Redis根memcached相似,不过数据可持久化,并且支持的数据类型很丰富。支持在服务端计算集合的并、交和补集等,还支持多种排序功能。
Redis使用场景有以下几个特色:
- 高性能
- 低延迟
- 丰富数据结构存取
- 支持持久化
Redis应用场景介绍
Redis提供了灵活多变的数据结构和数据操做,主要应用于以下场景:
- 取最新N个数据的操做,好比典型的取某网站的最新文章。
- 排行榜应用,取TOP N操做。
- 须要精准设定过时时间的应用。
- 计数器应用,好比记录用户访问网站的次数。
- 构建队列系统
- 缓存,如缓存关系数据库中的频繁访问的表数据。
架构回顾
- 无中心自组织的结构,节点之间使用Gossip协议来交换节点状态信息。
- 个节点维护Key->Server的映射关系。
- Client能够向任意节点发起请求,节点不会转发请求,只是重定向Client
- 若是在Client第一次请求之间,Cluster拓扑发生改变,则第二次重定向请求将被再次重定向,直到找到正确的Server为止。
Redis应用开发
设计Redis数据结构
- 取最新N个数据的操做:list
- 排行榜应用,取TOP N操做。以某个条件为权重,好比按顶的次数排行:sorted set。
- 利INCR,DECR命令来构建计数器系统。、
- Uniq操做,获取某段时间全部数据排重值:set。
- 使用list能够构建队列系统
Redis应用开发
根据场景开发工程
- 梳理业务场景流
- 设计各模块接口
- 若是使用的是安全集群,须要进行安全认证
- 熟悉Redis提供的相应API
- 调用业务须要的API实现各功能
数据结构设计
- 计算过程当中使用的用户信息使用hash结构存取,KEY设计为userinfo-<user id>,
- field为用户的属性。
数据读写原则
- MR任务天天定时将用户信息从后端存储源(HBase)批量导入Redis中。
- 业务系统获取数据时,先从Redis中获取,获取不到再取后端HBase获取即实时计算,并同步写入到Redis。
样例说明-String类型操做
- set:将字符串值value关联到key
- get:返回key所关联的字符串值,
- setex:将字符串值value关联到key,并设置key的生存时间
- append:将value追加到key原值的末尾,相似Java String类型的“+”操做。
样例说明-List类型操做
- Ipush/rpush:往列表头/尾添加一个元素。
- Irange:返回列表中start至end之间的元素
- llen:返回列表的长度
- lpop/rpop:从列表头/尾获取一个元素,并将其中列表中删除。
样例说明-Hash类型操做
- hset
- hget
- hgettall
- hmset
- hincrby
- hkeys
- hvals
- hmget
- hexists
- hdel
Streaming应用开发
- 掌握Streaming基本业务开发流
- 熟悉Streaming经常使用API接口使用
- 掌握Streaming业务设计基本原则
- 了解Streaming应用开发环境
- 了解CQL开发流及使用
Streaming的定义
Streaming基于开源Storm,是一个分布式、实时计算框架。Streaming在开源Storm的基础上增长了持续查询语言CQL、加强了安全性和可靠性。
- 事件驱动
- 连续查询
- 数据不存储、先计算
- 实时响应,低延迟
CQL(Continuous Query Language),持续查询语言,是一种用于实时数据流上的查询语言。
它是一种SQL-like的语言,目前主要适配Storm。
相对于SQL,CQL中增长了(时序)窗口的概念,将待处理的数据保存在内存中,进行快速的内存计算,CQL的输出结果为数据流在某一时刻的计算结果。
Streaming的适用场景
Streaming主要应用于如下几种对响应时延有严重要求的场景:
- 实时分析:如实时日志处理,交通流分析等
- 实时统计:如网站的实时访问统计、排序等
- 实时推荐:如实时广告定位、事件营销等
提交拓扑
当前Streaming支持三种方式提交拓扑
- Linux命令行提交-CMD模式
- Eclipse远程提交-Remote模式
- 本地模式提交-Local模式
Spout设计
- 数据接受
- 数据反序列化
- 数据拆分
- 数据筛选
- 数据缓存
- 数据发送
counting Bolt设计
功能:
- 窗口定义
- 刷新窗口
- 发送数据
Storm提供接口
1 REST接口
- REST(Representational State Tansfer)表述性状态转移接口。
2 Thrift接口
- 由Numbus提供。Thrift是一个基于静态代码生成的跨语言的RPC协议栈实现。
Spout接口
- Spout的Ack开关
Bolt接口
- Bolt的Ack开关
Flume应用开发
要求:
- 了解Flume应用开发适用场景
- 掌握Flume应用开发
Flume应用场景
Flume的核心是把数据从数据源收集过来,在送到目的地。为了保证输送必定成功,发送到目的地以前,会先缓存数据,待数据真正的到达目的地后,删除本身缓存的数据。
Flume采用流式方法采集和传输数据,程序配置好后,不须要外部条件触发下,一直监控数据源,源源不断地采集、传送数据到目的地。
主要应用于一下几种场景:
- 将分布式节点上大量数据实时采集、汇总和转移
- 将集群内、外地本地文件、实时数据流采集到FusionInsight集群内的HDFS、HBase,Kafka,Solr中。
- 将Avro、System,http,Thrift,JMS、Log4j协议发送过来地数据采集到FusionInsight集群内
Flume基本概念
- Source:数据源,便是产生日志信息地源头,Flume会将原始数据建模抽象成本身处理地数据对象:event
- Channel:通道,主要做用是临时缓存Source发过来地数据
- Sink:主要是从channel中取出数据并将数据放到不一样地目的地
- event:一个数据单元,带有一个可选地消息头,Flume传输地数据地基本单位是event,若是是文本文件,一般是一行记录。event从Source,流向Channel,再到Sink,Sink将数据写入目的地
方案设计:
1)首先肯定数据源:集群外
2)数据最终流向:KafKa(集群内)
Oozie应用开发
要求:
- 了解Oozie应用开发适用场景
- 掌握Oozie应用开发
- 熟悉并使用Oozie经常使用API
Oozie简介
- Oozie是一个Hadoop做业的工做流调度管理系统
- Oozie工做流(workflow)是放置在控制依赖DAG(有向无环图)中的一组动做(Action)集合,控制依赖可确保后续操做在见面的操做已经成功完成后才会启动。
- Oozie的协调做业(Coordinator)是经过时间(频率)和有效数据来触发当前的Oozie工做流。
- Oozie支持多种Hadoop做业(包括:HDFS,Map Reduce、Hive、Streaming MP、Loader、Spark、Distcp)以及系统类做业(Java和shell)
Oozie应用场景
Oozie是一个工做流调度引擎,对各类类型的Hadoop做业进行编排与调度。
- 编排与管理逻辑复杂的多种类型的Hadoop
- 基于时间(频率)触发工做流
- 基于数据有效性触发工做流
- 实时监控与管理集群的工做流,快速定位问题