Hadoop 生态系统
存储方案: HDFS/Hbase
HDFS架构
namenode(内存)
:存储系统元数据,管理datanode,会向datanode发送创建/删除/备份块指令由datanode执行
datanode
:负责实际块存储,响应客户端块的操作,向namenode汇报自身状态信息.
secondarynamenode
:(单机环境下),辅助namenode完成对edits和fsimage文件的管理(数据归并),加速namenode启动速度,在分布式架构中被废弃.
block
:切割数据的基本单位,大小128,hdfs-site.xml dfs.blocksize =128m
,一个文件最多只有一个不足128MB的块信息.
rack
:机架,用于物理编排存储节点和计算节点,优化在存储和计算过程中的网络传输(优化带宽)
为什么在第一次搭建HDFS的时候需要namenode格式化?
hdfs namenode -format
作用生成namenode在启动时候需要加载的fsimage
镜像文件,用于恢复namenode内存信息,类似于Redis的RDB文件.
什么SSH免密码认证(基于秘钥)
[root@CentOS ~]# ssh-keygen -t rsa
[root@CentOS ~]# ssh-copy-id CentOS
是一种Linux主机间远程登录一种协议,使用SSH 登录方式两种:1,基于口令(用户名|密码)2.基于秘钥(公私钥)
离线计算方案- Map Reduce
分布式计算框架,充分利用了存储节点运行主机的计算资源(内存/cpu/网络/少许磁盘),同过在datanode主机上运行NodeManager服务管理本机的计算资源(Container)- 一个NodeManager管理8GB计算资源.一个Container消耗1GB内存.
MapReduce框架通过使用ResourceManger管理所有计算节点计算资源,在任务计算过程中分配计算资源.
函数式编程
- 在网络传递代码 | 矢量编程
- 有向无环图DAG|阶段 M->R
NodeManager
:管理本机上的计算资源Container
ResourceManager
:负责计算任务的资源分配|调度
Container
:代表一个计算资源(1GB内存|CPU),该Container主要运行 MRAppMaster
|YarnChild
MRAppMaster
:任何一个计算任务Job只有一个MrAppMaster负责管理和检测YarnChild的执行
Yarn Child
:表示是MapReduce任务进程中的MapTask|ReduceTask
任务提交11个步骤:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gAHjV4wf-1575329696402)(.\MapReduce\计算流程.png)]
任务运行的11个步骤
1.运行job-runjar
2.获取应用ID|JobID -- YarnRunner
3.拷贝资源(代码片段/切片信息/job.xml)-- hdfs
4.提交任务给ResourceManager -- YarnRunner
5.选择一个NodeManager启动一个Container运行MRAppMaster
6.MRAppMaster初始化job,完成任务监测对象初始化
7.MRAppMaster连接HDFS查询切片信息(第一阶段|Map阶段并行度)
8.MRAppMaster连接ResourceManager申请Container计算资源
9.MRAppMaster连接其他的NodeManager,启动YarnChid
10.YarnChid连接HDFS获取任务资源(代码片段/切片信息/job.xml)
11.YarnChid运行MapTask或者ReduceTask
Job提交6个步骤
//1.创建Job
Configuration conf=getConf();
Job job=Job.getInstance(conf);
//2.设置数据读入和写出格式
job.setInput|OutPutFormatClass(TextIn|OutputForamt.class)
//3.设置数据路劲
TextInputForamt.addInputPath(job,src);
TextOutputFormat.setInputPath(job,dst);
//4.设置数据处理代码片段 Mapper|Reducer
job.setMapper|ReducerClass(WordMapper.class|WordReducer.class);
//5.设置Mapper和Reducer输出k-v泛型
job.setMapOutputKey|ValueClass(Class<? extends WritableComparable>(key)|Class<? extends Writable>(value))
job.setOutputKey|ValueClass(取决于OutputFormat)
//6.任务提交
job.waitForcompletion(true);
任务发布-远程发布
public class CustomJobSubmiter extends Configured implements Tool {
public int run(String[] args) throws Exception {
//6个步骤
job.setJarByClass(CustomJobSubmiter.class);
}
public static void main(String[] args) throws Exception {
ToolRunner.run(new CustomJobSubmiter(),args);
}
}
[root@CentOS ~]# hadoop jar xxx.jar 入口类 -libjars /xxx.jar路径 (计算时依赖)
InputFormat/OutputFormat
常规Format使用
读入:TextInputFormat/MultiInputs/TableInputFormt(Hbase)
写出:TextOutputFormat/DBOutputFormat(RDBMS|MySQL/Oracle)/TableOutputFormt(Hbase)
CombineTextInputFormat(常用优化-√)
洗牌shuffle
Map Reduce 优化策略
- 干预切片计算逻辑 -CombineTextInputFormat (小文件优化)
- 实现Partitioner策略防止数据倾斜,实现Reduce Task负载均衡- 经验 选择合适key
- 适当调整YarnChild内存参数,需要查阅Yarn参数配置手册,一般调整vcores和内存参数cpu使用
- 适当调整溢写缓冲区大小和阈值
- 适当调整合并流文件并行度
mapreduce.task.io.sort.factor=10'
- 对Map端输出的溢写文件使用gzip压缩,节省网络带宽
conf.setBoolean("mapreduce.map.output.compress", true);
conf.setClass("mapreduce.map.output.compress.codec",
GzipCodec.class, CompressionCodec.class);
- 可以根据情况判断是否满足Combiner条件
Combiner 优化
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hS6zz1ZN-1575329696402)(E:/%E8%AE%AD%E7%BB%83%E8%90%A5%E5%A4%A7%E6%95%B0%E6%8D%AE/MapReduce/combiner.png)]
job.setCombinerClass(Class<? extends Reducer>);
Map Reduce在生产中应用
1)画像分析,人物画像-数学模型,用于描述人物的特征,将研究对象拆分成若干个研究的维度,计算该分析对象在某一个维度的值.
人:抽取人物画像 - 相亲应用
性别 | 身高 | 体重 | 年龄 | 职业 | 年收入 | 家庭成员 |
---|---|---|---|---|---|---|
男 | 175 | 120 | 25 | 白领 | 100W | 3 |
人:抽取人物画像 - 电商 购物DNA
手机类 | 服装 | 零食 | 化妆 | 家居 | 母婴 |
---|---|---|---|---|---|
10000 | 15000 | 5000 | 20000 | 0 | 0 |
爪机党 | 时尚达人 | 吃货 | 臭美达人 | 闲人 | 单身狗 |
小视屏:视屏向量
作者 | 类别 | 时长 | 关键字 |
---|---|---|---|
冯提莫 | mv | 短 | 学猫叫 |
1 | 2 | 1 | 1 |
广告定向推广
,分类
,聚类
、推荐
(成型算法库-mahout
)
协同过滤算法(最常用的算法)个性化推荐算法
- 基于用户协同-找相似用户
- 基于物品协同-找相似物品(√)
数据格式
userID,itemID,Score
1,101,5.0
1,102,3.0
1,103,2.5
2,101,2.0
2,102,2.5
2,103,5.0
2,104,2.0
3,101,2.5
3,104,4.0
3,105,4.5
3,107,5.0
4,101,5.0
4,103,3.0
4,104,4.5
4,106,4.0
5,101,4.0
5,102,3.0
5,103,2.0
5,104,4.0
5,105,3.5
5,106,4.0
- 安装Mahout(下载Mahout算法库)
[root@CentOS ~]# tar -zxf apache-mahout-distribution-0.13.0.tar.gz -C /usr/
- 将准备好的数据存储到/demo/recomand
- 调用Mahout的推荐算法(该算法分为4个阶段)
[root@CentOS ~]# hadoop jar /usr/apache-mahout-distribution-0.13.0/mahout-mr-0.13.0-job.jar
org.apache.mahout.cf.taste.hadoop.item.RecommenderJob --input /demo/recomand --output
/demo/mahout-out -s SIMILARITY_LOGLIKELIHOOD
参数说明:
--input 指定输入
--output 指定输出
-s 指定计算相似度的算法
--startPhase 0(从哪个过程开始)
--endPhase=2147483647 (截止到哪个过程)
--numRecommendations= 20 (一个用户推荐多少条记录)
--threshold double设置推荐阈值
最终结果
1 [104:2.8088317,106:2.5915816,105:2.5748677]
2 [105:3.5743618,106:3.3991857]
3 [103:4.336442,106:4.0915813,102:4.0915813]
4 [102:3.6903737,105:3.6903737]
5 [107:3.663558]
org.apache.mahout.cf.taste.hadoop.item.RecommenderJob
Message Queue
即时消息
|异步消息
-消息队列
使用场景:异步消息/系统间解耦/削峰填谷
kafka架构
>./bin/kafka-topic.sh
--zookeeper CentOS:2181
--create
--topic topic01
--partitions 3
--replication-factor 3
消费者对Topic消费形式
组内
:均分分区数据,
组间
:广播
分区数可以决定topic消费和生产的
并行度
.
Kafka Streaming:
是一个基于kafka消息队列的流处理的工具jar,相比较一些Storm
/Spark Sateaming
而言,更加轻巧集成方便,但是不适用于大规模数据集的计算.因为Kafka Streaming是将计算嵌套在应用中,并没有提供任务管理的UI界面,不利于管理.
Hbase - NoSQL
Hbase全称Hadoop database(基于HDFS的数据库),该设计源于goole 的bigtable论文,hbase仿照bigtable设计(bigtable时google filesystem之上NoSQL数据库)基于HDFS之上构建一款数据库.(HDFS和Hbase关系|区别?)
列存储优势?
传统数据库:面向行-行为单位操作数据
列存储:面向列-Cell 单元格 操作单位
rowkey-列簇:列-时间戳 - 三个维度描述单元格
Hbase架构图:
hbase架构图01.png
MR on Hbase
//1.封装job对象
Configuration conf=getConf();
Job job=Job.getInstance(conf);
//2.设置数据读入和写出格式
job.setInputFormatClass(TableInputFormat.class);
job.setOutputFormatClass(TableOutputFormat.class);
TableMapReduceUtil.initTableMapperJob(
"baizhi:t_user",
new Scan(),
UserMapper.class,
Text.class,
DoubleWritable.class,
job
);
TableMapReduceUtil.initTableReducerJob(
"baizhi:t_result",
UserReducer.class,
job);
//6.提交任务
//job.submit();
job.waitForCompletion(true);
return 0;
public static class UserMapper extends TableMapper<Text,DoubleWritable> {
@Override
protected void map(ImmutableBytesWritable key, Result value, Context context) throws IOException, InterruptedException {
byte[] bytes = key.get();
String company= Bytes.toString(bytes).split(":")[0];
byte[] salaryBytes = value.getValue("cf1".getBytes(), "salary".getBytes());
double salary=Bytes.toDouble(salaryBytes);
context.write(new Text(company),new DoubleWritable(salary));
}
}
public static class UserReducer extends TableReducer<Text,DoubleWritable, NullWritable> {
@Override
protected void reduce(Text key, Iterable<DoubleWritable> values, Context context) throws IOException, InterruptedException {
double totalCount=0.0;
int count=0;
for (DoubleWritable value : values) {
totalCount+=value.get();
count++;
}
Put put=new Put(key.copyBytes());
put.addColumn("cf1".getBytes(),"avgSalary".getBytes(),(totalCount/count+"").getBytes());
context.write(null,put);
}
}
Flume日志采集
常规组件:
source: avro|thrift source/Spooling Directory Source/Taildir Source
channel:memroy|file|jdbc|kafka
sink:avro|thrift sink/file_roll/HDFS Sink/Kafka Sink
分布式日志采集和分析系统构建
Apache Hive
hive在Hadoop位置
Hive操作数据:json
|csv
|纯文本日志
- 默认分隔符|自定义分隔符|正则
Hive表分类:管理表
|外部表
|分区表
Hive On Hbase
CREATE EXTERNAL table t_user_hbase(
id string,
name string,
age int,
salary double,
company string
)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES('hbase.columns.mapping' = ':key,cf1:name,cf1:age,cf1:salary,cf1:company')
TBLPROPERTIES('hbase.table.name' = 'zpark:t_user');
0: jdbc:hive2://CentOS:10000> select avg(salary),max(salary),min(salary),sum(salary) ,company from t_user_hbase group by company;
Apache Storm
Storm常规组件
Topology:等价于MapReduce中job任务.不同于MapReduce的job,因为Topology一旦运行,永远不会停止,除非调用storm kill topology-name
Spout:是整个Topology处理数据的源头,负责从外围系统读取数据封装成Tuple,并且将数据emit|发射到stream中,IRichSpout
|BaseRichSpout
Bolt:所有的Topology中的Tuple是通过Bolt处理,Bolt作用是用于过滤/聚合/函数处理/join/存储数据到DB中等.
IRichBolt
|BaseRichBolt
,IBasicBolt
|BaseBasicBolt
,IStatefulBolt
| BaseStatefulBolt
stream:由无止境的Tuple(元组)构成序列,并且给这些序列中的Tuple携带上schema信息.
Stream shuffle
方式 | 含义 |
---|---|
shuffleGrouping | 随机将tuple发送给下游的Bolt |
fieldsGrouping | 基于某个field将tuple发送给下游的Bolt |
Storm 并行度理解
宏观架构
Worker
:是由Supervisor启动JVM进程,一个Topology需要消耗的Worker是通过config.setNumWorkers(4);//设置 worker进程数据4
Executor
: 代表作线程,一个executor代表者一个线程,通常一个Executor执行一个Task(Bolt|Spout实例)
Task
:表示Bolt或者是Spout实例
//1.构建Topology
TopologyBuilder topologyBuilder=new TopologyBuilder();
//组件构建,默认并行度1
topologyBuilder.setSpout("LineSpout",new LineSpout());
topologyBuilder.setBolt("LineSplitBolt",new LineSplitBolt(),3)
.shuffleGrouping("LineSpout");//随机接收来自于LineSpout输出tuple分发给下游3个bolt
topologyBuilder.setBolt("WordCountBolt",new WordCountBolt(),4)
.fieldsGrouping("LineSplitBolt",new Fields("word"));
topologyBuilder.setBolt("PrintWordsBolt",new PrintWordsBolt(),3)
.fieldsGrouping("WordCountBolt",new Fields("word"));
StormTopology topology = topologyBuilder.createTopology();
//2.创建配置类
Config config=new Config();
config.setMaxTaskParallelism(20);
config.setNumWorkers(1);//设置 worker进程数据1
config.setNumAckers(0);//关闭 Storm Tuple 追踪机制
//3.提交任务
new LocalCluster().submitTopology("hello-world",config,topology);
Storm如何保障Tuple的可靠处理的?
Storm 消息Tuple可以通过一个叫做__acker
Bolt去监测整个Tuple Tree是否能够被完整消费,如果消费超时或者失败该__acker
会调用Spout组件的fail方法,要求Spout重新发送Tuple.
开启Storm可靠性处理方法:
//Spout在发射 tuple 的时候必须提供msgID
collector.emit(new Values(line),i);
//所有的下游的Bolt,必须锚定当前tuple,并且在处理完后,必须调用ack方法
try {
//锚定 当前 tuple
collector.emit(tuple,new Values(word,count));
//给上游应答
collector.ack(tuple);
} catch (Exception e) {
//通知失败
collector.fail(tuple);
}
T1 ^ T2 ^ Tn … ^T1 ^ T2 … Tn =0
状态管理
Distributed RPC
Storm的DRPC真正的实现了并行计算.Storm Topology接受用户的参数进行计算,然后最终将计算结果以Tuple形式返回给用户.
窗口Bolt
Storm支持以窗口为单位,计算tuple,窗口一般会有两个属性:
- 窗口长度- the length or duration of the window
- 滑动间隔- the interval at which the windowing slides
Trident Topology理解
只用当Tuple需要网络传送的时候才会划分(优先本地计算Bolt|State),例如:group/shuffle/repartition/join/聚合等都会产生网络传递.
Distributed RPC
Storm的DRPC真正的实现了并行计算.Storm Topology接受用户的参数进行计算,然后最终将计算结果以Tuple形式返回给用户.
窗口Bolt
Storm支持以窗口为单位,计算tuple,窗口一般会有两个属性:
- 窗口长度- the length or duration of the window
- 滑动间隔- the interval at which the windowing slides
Trident Topology理解
只用当Tuple需要网络传送的时候才会划分(优先本地计算Bolt|State),例如:group/shuffle/repartition/join/聚合等都会产生网络传递.