【_ 記 】Hadoop 生态系统

Hadoop 生态系统

存储方案: HDFS/Hbase

HDFS架构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wPhzcVjL-1575329696400)(.\assets\1550023446816.png)]

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免密码认证(基于秘钥)

扫描二维码关注公众号,回复: 8747622 查看本文章
[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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-abpTgAV2-1575329696402)(.\MapReduce\InputFormat.png)]

常规Format使用

读入:TextInputFormat/MultiInputs/TableInputFormt(Hbase)
写出:TextOutputFormat/DBOutputFormat(RDBMS|MySQL/Oracle)/TableOutputFormt(Hbase)

CombineTextInputFormat(常用优化-√)

洗牌shuffle

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nm5moGFj-1575329696402)(.\MapReduce\mr-shuffle.png)]

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架构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Gzszsoil-1575329696403)(.\mq\kafkacluster.png)]

>./bin/kafka-topic.sh 
				--zookeeper CentOS:2181
				--create
				--topic topic01
				--partitions 3
				--replication-factor 3

消费者对Topic消费形式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZCPfDWtS-1575329696404)(.\mq\consumer-groups.png)]

组内:均分分区数据,

组间:广播

分区数可以决定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关系|区别?)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QobNui7I-1575329696405)(.\hbase\hdfs&hbase.png)]

列存储优势?

传统数据库:面向行-行为单位操作数据

列存储:面向列-Cell 单元格 操作单位

rowkey-列簇:列-时间戳 - 三个维度描述单元格

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MY8PNQ2S-1575329696405)(.\hbase\列存储.png)]

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日志采集

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-njYvRm39-1575329696407)(.\flume\flume架构图.png)]

常规组件:

source: avro|thrift source/Spooling Directory Source/Taildir Source

channel:memroy|file|jdbc|kafka

sink:avro|thrift sink/file_roll/HDFS Sink/Kafka Sink

分布式日志采集和分析系统构建

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8YDnxuip-1575329696407)(.\日志采集实战\2019-01-17_094327.png)]

Apache Hive

hive在Hadoop位置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9lBKT53P-1575329696409)(E:\训练营大数据\hive\hive架构.png)]

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 并行度理解

宏观架构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uU2qj0bP-1575329696411)(.\assets\1548128721592.png)]

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);

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O5nsajMK-1575329696411)(.\assets\1548148559883.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eMhjxmy2-1575329696412)(.\assets\1548150474154.png)]

Storm如何保障Tuple的可靠处理的?

Storm 消息Tuple可以通过一个叫做__ackerBolt去监测整个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);
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vl3svnU7-1575329696412)(.\assets\1548214362697.png)]

T1 ^ T2 ^ Tn … ^T1 ^ T2 … Tn =0

状态管理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y55VtcEQ-1575329696413)(C:\Users\Kai\AppData\Roaming\Typora\typora-user-images\1575329627063.png)]Distributed RPC

Storm的DRPC真正的实现了并行计算.Storm Topology接受用户的参数进行计算,然后最终将计算结果以Tuple形式返回给用户.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a7P9TX4t-1575329696414)(.\assets\1548295516304.png)]

窗口Bolt

Storm支持以窗口为单位,计算tuple,窗口一般会有两个属性:

  • 窗口长度- the length or duration of the window
  • 滑动间隔- the interval at which the windowing slides

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GpOu5SmA-1575329696414)(E:\训练营大数据\assets\1548386426839.png)]

Trident Topology理解

只用当Tuple需要网络传送的时候才会划分(优先本地计算Bolt|State),例如:group/shuffle/repartition/join/聚合等都会产生网络传递.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-woaPTKQV-1575329696415)(E:\训练营大数据\assets\1548468199784.png)]
Distributed RPC

Storm的DRPC真正的实现了并行计算.Storm Topology接受用户的参数进行计算,然后最终将计算结果以Tuple形式返回给用户.

窗口Bolt

Storm支持以窗口为单位,计算tuple,窗口一般会有两个属性:

  • 窗口长度- the length or duration of the window
  • 滑动间隔- the interval at which the windowing slides

[外链图片转存中...(img-GpOu5SmA-1575329696414)]

Trident Topology理解

只用当Tuple需要网络传送的时候才会划分(优先本地计算Bolt|State),例如:group/shuffle/repartition/join/聚合等都会产生网络传递.

在这里插入图片描述

发布了116 篇原创文章 · 获赞 116 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/o_o814222198/article/details/103360423