- 博客(190)
- 资源 (4)
- 收藏
- 关注
转载 Spark shuffle相关参数调优
Spark Shuffle是比较消耗性能的环节,本文对涉及shuffle过程的部分参数进行讲解,方便在使用Spark编写任务时进行调优。spark.shuffle.file.buffer默认值:32参数说明:该参数用于设置shuffle write task的BufferedOutputStream的buffer缓冲大小。将数据写到磁盘文件之前,会先写入buffer缓冲中,待缓冲写满之后,才会溢写到磁盘。调优建议:如果作业可用的内存资源较为充足的话,可以适当增加这个参数的大小(比如64k),从而减少
2022-03-14 09:18:43
751
原创 维度数据建模的概念和术语
维度建模关注的焦点是为终端用户展现数据,而通常来说,维度数据模型正是关注于让终端用户理解和访问数据更加简单。这种设计技术的特征就是主动地以更多开发人员的工作量来换取易于最终用户理解和使用的结果。根据维度数据模型,大多数数据集市的设计工作以数据的ETL处理结束。维度数据模型是实体关系型数据模型的子集,也具有实体、属性和关系等基本组件。实体一般有两种基本类型:事实(fact)——提供度量;维度——提供上下文。在简单维度中的关系被包含并贯穿于事实表中,所有的维度到事实的关系是一对多(1 : M)。1 事实
2022-03-06 10:38:14
2558
原创 HBase协处理器及二级索引
前言在使用 HBase 时,如果你的数据量达到了数十亿行或数百万列,此时能否在查询中返回大量数据将受制于网络的带宽,即便网络状况允许,但是客户端的计算处理也未必能够满足要求。在这种情况下,协处理器(Coprocessors)应运而生。它允许你将业务计算代码放入在 RegionServer 的协处理器中,将处理好的数据再返回给客户端,这可以极大地降低需要传输的数据量,从而获得性能上的提升。同时协处理器也允许用户扩展实现 HBase 目前所不具备的功能,如权限校验、二级索引、完整性约束等。1 协处理器-
2022-03-05 16:21:12
879
原创 浅谈Hive调优
Hive 作为大数据领域常用的数据仓库组件,在平时设计和查询时要特别注意效率。影响 Hive 效率的几乎从不是数据量过大,而是数据倾斜、数据冗余、Job或I/O过多、MapReduce 分配不合理等等。对Hive 的调优既包含 Hive 的建表设计方面,对HiveHQL 语句本身的优化,也包含 Hive 配置参数 和 底层引擎 MapReduce 方面的调整。1 Hive建表设计调优Hive的建表设计层面调优,主要讲的怎么样合理的组织数据,方便后续的高效计算。比如建表的类型,文件存储格式,是否压缩等
2022-03-05 15:25:20
855
原创 NameNode和Secondary NameNode工作机制
1 工作机制第一阶段:NameNode启动第一次启动NameNode格式化后,创建Fsimage文件和Edits日志;如果不是第一次启动,直接加载Fsimage和Edits文件到内存 客户端对元数据进行增删改的请求 NameNode记录操作日志,更新滚动日志 NameNode在内存中对数据进行增删改第二阶段:Secondary NameNode工作SecondaryNameNode询问NameNode是否需要checkpoint,直接带回NameNode的询问结果 Secon.
2022-03-05 12:18:37
455
1
原创 NameNode的HA机制
1 HA机制NameNode维护了HDFS所有的元数据信息,当该节点所在服务器宕机或服务不可用时,整个HDFS都将处于不可用状态,那么怎么才能避免这个NameNode节点宕机呢?一个容易想到的解决方案是部署两台NameNode节点,形成主备模式(active/standby模式),这样一旦active节点宕机,standby节点立即切换到active模式。事实上HA机制就是采取的这种方案。但实现该机制,需要解决以下问题:1)为什么选择主备模式,而不是主主模式(active/active模式)?也即让
2022-03-05 11:45:53
3020
原创 HDFS读、写数据流程
1 读数据客户端通过Distributed FileSystem向NameNode请求下载文件,NameNode通过查询元数据,找到文件块所在的DataNode地址 挑选一台DataNode(就近原则,然后随机)服务器,请求读取数据 DataNode开始传输数据给客户端(从磁盘里面读取数据输入流,以Packet为单位来做校验) 客户端以Packet为单位接收,先在本地缓存,然后写入目标文件2 写数据客户端通过DistributedFileSystem模块向NameNode请求上传..
2022-03-05 10:40:36
208
原创 HDFS集群安全模式
1 NameNode启动NameNode启动时,首先将镜像文件(Fimage)载入内存,并执行编辑日志(Edits)中的各项操作。一旦在内存中成功建立文件系统元数据的映像,则创建一个新的Fimage文件和一个空的编辑日志。此时,NameNode开始监听DataNode请求。这个过期期间,NameNode一直运行在安全模式,即NameNode的文件系统对于客户端来说是只读的。2 DataNode启动系统中的数据块的位置并不是由NameNode维护的,而是以块列表的形式存储在DataNode中。在系
2022-03-05 10:24:42
250
转载 什么情况下,hive只会产生一个reduceTask,而没有mapTask
正常逻辑下,mapTask的职责就是负责读数据,做ETL,也可以利用combiner局部聚合;ReduceTask输入严重依赖于mapper输出,所以‘一直’的逻辑仅有reducer无法执行的。hql常规解析后依赖的mapreduce主要还是ExecReducer/ExecMapper--通过实现hadoop的mapper和reducer来实现具体执行逻辑。hive自己的mapreducer有一个实现案例,就是GenericMR,实现源码如下:public final class Generi
2022-03-05 09:17:36
529
原创 浅谈3NF(范式)建模
范式一张数据表的表结构所符合的某种设计标准的级别构造数据库必须遵循一定的规则。在关系型数据库中,这种规则就是范式。范式是符合某一种级别的关系模式的集合,目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、第四范式(4NF)、第五范式(5NF)和第六范式(6NF)。第一范式(1NF)定义:在关系模式R中的每一个具体关系r中,必须要有主键,并且每个属性值都是不可再分的最小数据单元表一不符合第一范式的属性,购买商品一列,可以拆分为商品和数量两列。.
2022-03-05 08:38:01
7419
原创 HBase建表属性与RowKey设计
1 建表高级属性1.1 BLOOMFILTER(布隆过滤器)默认是NONE,是否使用布隆过滤及使用何种方式,布隆过滤可以每个列簇单独启用使用HColumnDescriptor.setBloomFilterType(NONE | ROW | ROWCOL)对列簇单独启用布隆过滤,Default = ROW对行进行布隆过滤对ROW,行键的哈希在每次插入时将被添加到布隆对ROWCOL,行键 + 列簇 + 列簇修饰的哈希将在每次插入行时添加到布隆使用方法:create 'table',{N
2022-03-04 12:35:32
1458
原创 Kafka LEO & HW原理
LEOLast And Offset,日志末端偏移量,记录了该副本对象底层日志文件中下一条消息的位移值;举一个例子,若LEO = 10,那么表示在该副本日志上已经保存了10条消息,位移范围是[0, 9]。HWHigh Watermark,高水印值,任何一个副本对象的HW值一定不大于其LEO值,而小于或等于HW值的所有消息被认为是“已提交的”或“已备份的”。HW指向的是实实在在的消息,而LEO总是指向下一条待写入消息,也就是说LEO指向的位置上是没有消息的,例如HW值是7,这表示当8条消息(位
2022-03-03 21:49:43
472
原创 HBase架构设计和工作原理
1 HBase系统架构Client职责1、HBase有两张特殊表:.META.:记录用户所有表拆分出来的Region映射信息,.META可以有多个Region -ROOT-:记录了.META.表的Region信息,-ROOT-只有一个Region,无论如何都不会分裂split2、Client访问用户数据前需要首先访问Zookeeper,找到-ROOT-表的Region所在的服务器位置,然后访问-ROOT-表,接着访问META表,最后才能找到用户数据的服务器位置去访问,中间需要多次网络操
2022-03-03 20:49:34
1793
原创 Flink的检查点(checkpoint)
Flink具体如何保证exactly-once呢? 它使用一种被称为"检查点"(checkpoint)的特性,在出现故障时将系统重置回正确状态1 Flink的检查点算法Flink检查点的核心作用是确保状态正确,即使遇到程序中断,也要正确。记住这一基本点之后,我们用一个例子来看检查点是如何运行的。Flink为用户提供了用来定义状态的工具。例如,以下这个Scala程序按照输入记录的第一个字段(一个字符串)进行分组并维护第二个字段的计数状态。val stream: DataStrea...
2022-03-02 15:25:13
2428
1
原创 浅谈Spark Shuffle机制
1 概述大多数Spark作业的性能主要就是消耗在了shuffle环节,因为该环节包含了大量的磁盘IO、序列化、网络数据传输等操作。因此,如果要让作业的性能更上一层楼,就有必要对shuffle过程进行调优。但是也必须提醒大家的是,影响一个Spark作业性能的因素,主要还是代码开发、资源参数以及数据倾斜,shuffle调优只能在整个Spark的性能调优中占到一小部分而已。因此大家务必把握住调优的基本原则,千万不要舍本逐末。下面我们就给大家详细讲解 shuffle 的原理,以及相关参数的说明,同时给出各个参数
2022-03-01 19:52:42
737
原创 Kafka消费者Consume常用参数
下面先来个消费者Demo:import java.util.Arrays;import java.util.Properties;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import org.apache.kafka.clients.consumer.ConsumerRecord;import org.apache.kafka.clients.consumer.Con
2022-02-26 11:26:21
2774
原创 Kafka生产者Producer常用参数
下面先来个Producer生产者的Demo案例:import org.apache.kafka.clients.producer.Callback;import org.apache.kafka.clients.producer.KafkaProducer;import org.apache.kafka.clients.producer.ProducerRecord;import org.apache.kafka.clients.producer.RecordMetadata;public
2022-02-26 11:02:58
2763
原创 Synchronize的对象锁与类锁的区分
对象锁Java的所有对象都含有1个互斥锁,这个锁由JVM自动获取和释放。线程进入synchronized方法的时候获取该对象的锁,当然如果已经有线程获取了这个对象的锁,那么当前线程会等待,synchronized方法正常返回或者抛异常而终止,JVM会自动释放对象锁。这里也体现了用synchronized来加锁的一个好处,方法抛异常的时候,锁仍然可以由JVM来自动释放。 // 对象锁:形式1(方法锁) public synchronized void Method1() {
2022-01-23 15:43:12
284
转载 Flink实时维表join方法总结
1、ETL背景在我们实时数仓日常工作中,经常会有一些实时的需求,这些需求往往都是一些拉宽的需求。为了给实时数仓来进行OLAP对来进行Ad-hoc查询,但是我们工作中一些维度表的数据是会发生变化的,可能是缓慢变化维度。那么这个时候就需要进行flink连接其他数据源来进行查询。那么这个时候我们肯定可以想到就是来一条查一次,这个是肯定可以做到的。但是在大数据场景下,我们是不是会觉得有点慢呢?我们是否有更好的解决方案,就像我写代码的时候 有时候就会思考有没有更好的解决方案。但是针对于要进行交付给用户,所
2021-12-26 22:42:45
1362
转载 基于Flink百亿数据实时去重
基于传统的Set方法去重,以及弊端去重处理方法:需要一个全局 set集合来维护历史所有数据的主键。当处理新日志时,需要拿到当前日志的主键与历史数据的 set 集合按照规则进行比较,若 set集合中已经包含了当前日志的主键,说明当前日志在之前已经被处理过了,则当前日志应该被过滤掉,否则认为当前日志不应该被过滤应该被处理,而且处理完成后需要将新日志的主键加入到set 集合中,set 集合永远存放着所有已经被处理过的数据弊端:百亿数据去重,就按照每天100亿数据来算,由于数据量巨大,所以主键.
2021-12-26 22:33:48
1957
原创 C++ const关键字用法
const是constant的缩写,本意是不变的,不易改变的意思。在C+中是用来修饰内置类型变量、自定义对象、成员函数、返回值、函数参数C++ const允许指定一个语义约束,编译器会强制实施这个约束,允许程序员告诉编译器某值是保持不变的。如果在编程中确实有某个值保持不变,就应该明确使用const,这样可以获得编译器的帮助。一、const修饰普通类型的变量const int a = 7; int b = a; // 正确a = 8; // 错误,不能改变a被定义为一个常
2021-09-25 18:26:38
444
原创 C++函数参数传递的三种方式
(1)传值,就是把你的变量的值传递给函数的形式参数,实际就是用变量的值来新生成一个形式参数,因而在函数里对形参的改变不会影响到函数外的变量的值。(2)传址,就是传变量的地址赋给函数里形式参数的指针,使指针指向真实的变量的地址,因为对指针所指地址的内容的改变能反映到函数外,也就是能改变函数外的变量的值。(3)传引用,实际是通过指针来实现的,能达到使用的效果如传址,可是使用方式如传值。说几点建议:如果传值的话,会生成新的对象,花费时间和空间,而在退出函数的时候,又会销毁该对象,花费时间和空间。因而如果i
2021-09-20 22:01:23
4658
原创 查看kafka topic的消息offset范围
查看各个patition消息的最大Offsetbin/kafka-run-class.sh kafka.tools.GetOffsetShell --topic topic_name --time -1 --broker-list host1:9092,host2:9092,host3:9092查看各个partition消息的最小Offsetbin/kafka-run-class.sh kafka.tools.GetOffsetShell --topic topict_name --time
2021-01-26 09:43:19
2577
1
原创 Kafka高性能之零拷贝机制
所谓的零拷贝是指将数据直接从磁盘文件复制到网卡,而不需要经由应用之手。零拷贝大大提高了应用程序的性能,减少了内核和用户模式之间的上下文切换。对Linux操作系统而言,零拷贝技术依赖于底层的sendfile()方法实现,对于Java语言,FileChannel.transferTo()方法的底层实现就是sendfile()方法。单纯从概念上理解“零拷贝”比较抽象,这里简单地介绍一下它。考虑这样一种常用的情形:你需要将静态内容(类似图片、文件)展示给用户。这个情形就意味着需要先将静态内容从磁盘中复制出来放到
2021-01-16 10:37:49
368
原创 Kafka高性能之页缓存(page cache)使用
页缓存是操作系统实现的一种主要的磁盘缓存,以此用来减少对磁盘I/O的操作。具体来说,就是把磁盘中的数据缓存到内存中,把对磁盘的访问变为对内存的访问。为了弥补性能上的差异 ,现代操作系统越来越多地将内存作为磁盘缓存,甚至会将所有可用的内存用途磁盘缓存,这样当内存回收时也几乎没有性能损失,所有对于磁盘的读写也将经由统一的缓存。当一个进程准备读取磁盘上的文件内容时,操作系统会先查看待读取的数据所在的页(page)是否在页缓存(page cache)中,如果存在(命中)则直接返回数据,从而避免了对物理磁盘I/O
2021-01-10 21:48:40
4599
原创 Kafka高性能之顺序读写
Kafka依赖于文件系统(更底层地来说即磁盘)来存储和缓存消息,对于各种存储介质如下图所示,层级越高代表速度越快。在传统的消息中间件RabbitMQ中,就使用了内存作为默认的存储介质,而磁盘作为备选介质,以此实现高吞吐和低延迟的特性。有关测试结果表明,一个由6块7200r/min的RAID-5阵列组成的磁盘簇的线性(顺序)写入速度可以达到600MS/s,而随机写入速度只有100KB/s,两者性能相关6000倍。操作系统可以针对线性读写做深层次的优化,比如预读(read-ahead,提前将一个比较大的
2021-01-10 21:18:19
1139
原创 Kafka高性能之日志索引
在《Kafka日志文件目录布局》中提到Kafka中每个日志分段文件对应了两个索引文件——xxx.index(偏移量索引文件用来建立消息偏移量到物理地址之间的映射关系)和xxx.timeindex(用于根据指定的时间戳来查找对应的偏移量信息)。Kafka中的索引文件以稀疏索引(sparse index)的方式构造消息的索引,每当写入一定量(由broker端参数log.index.interval.bytes指定,默认值为4096,即4KB)的消息时,偏移量索引文件和时间戳索引文件分别增加一个偏移量索引项和
2021-01-10 20:33:53
263
原创 Kafka高性能之日志文件目录布局
Kafka中的消息是以主题为基本单位进行,各个主题在逻辑上相互独立,每个主题又可以分为一个或多个分区。每条消息在发送的时候会根据分区规则被追加到指定的分区中,分区中的每条消息都会被分配唯一的序列号,即偏移量(Offset),如下图如果分区规则设置得合理,消息可以均匀地分布到不同的分区中,从而可以实现水平扩展。在不考虑多副本的情况, 一个分区对应一个日志(Log),为防止Log过大,Kafka引入了日志分段(LogSegment)的概念,将Log切分为多个LogSegment,相当于一个巨型文件被平均
2021-01-09 22:41:50
784
原创 Java简单实现Kafka生产者与消费者
<dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-clients</artifactId> <version>1.0.0</version></dependency>1、生产者示例代码public class ProducerFastStart { public static fin.
2020-12-27 12:33:02
563
1
原创 shell脚本校验方法
exitCodeCheck(){if [ $1 -ne 0 ]; then echo 'shell execute return value is' $1 'is not 0' exit $1else echo 'shell execute success'fi}#########指令######echo 111exitCodeCheck $?
2020-12-24 14:58:35
1401
原创 SparkStreaming简易实现Kafka偏移量保存
import kafka.common.TopicAndPartitionimport kafka.message.MessageAndMetadataimport kafka.serializer.StringDecoderimport org.apache.spark.streaming.dstream.InputDStreamimport org.apache.spark.streaming.kafka.KafkaCluster.Errimport org.apache.spark.stre
2020-12-19 16:57:07
451
1
原创 SparkStreaming自定义数据源
object MyReceiverDemo { def main(args: Array[String]): Unit = { val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("MyReceiverDemo") val ssc = new StreamingContext(conf, Seconds(3)) val sourceStream
2020-12-18 23:27:42
306
1
原创 Spark配置JDBC连接数据的参数种类
在Spark配置JDBC连接关系型数据库时,可调优的参数比较多,但往往搜索时不好查,其实Spark提供了一个JDBCOptions类,配置了JDBC可配置的信息,如下:object JDBCOptions { private val curId = new java.util.concurrent.atomic.AtomicLong(0L) private val jdbcOptionNames = collection.mutable.Set[String]() private def
2020-09-15 09:37:30
1859
原创 Flink广播流——BroadcastStream
在日常Flink开发中,有时需要给正在运行中的Flink程序修改参数,比如过滤一些字段、字段值等,而这些值有时是配置在Mysql中的,但如果进行高吞吐计算的Function中动态查询配置文件有可能使任务阻塞,甚至导致任务出现失败的情况。遇到上述场景时,可以考虑通过广播流查询配置文件,广播到某个operator的所有并发实例中,然后与另一个条流数据连接进行计算。实现步骤:1、首先定义一个Mysql的实体类,下面例子的属性名可以自己根据实际中Mysql中表名来变化class Flow {
2020-09-12 16:47:01
7392
原创 Flink消费Kafka数据指定offset的五种模式
FlinkKafkaConsumer consumer = new FlinkKafkaConsumer("topic", new SimpleStringSchema(), props);/*** Flink从topic中最初的数据开始消费*/consumer.setStartFromEarliest();/*** Flink从topic中指定的时间点开始消费,指定时间点之前的数据忽略*/consumer.setStartFromTimestamp(1559801580000l);.
2020-09-09 14:43:00
2298
1
原创 Spark 2.4.0如何优雅地解决sparksql小文件过多的问题
在使用SparkSql进行项目开发的过程,往往会碰到一个比较头疼的问题,由于SparkSql的默认并行度是200,当sql中包含有join、group by相关的shuffle操作时,会产生很多小文件;从集群优化的角度来说,太多的小文件对NameNode的压力比较大,而且太多的小文件对后续使用该表进行计算时会启动很多必要的maptask,任务耗时高。因此,需要对小文件问题进行优化。在Dataset/Dataframe中有repartition/coalesce算子减少输出文件个数,但用户往不喜欢编写和部
2020-09-05 15:05:41
3798
3
原创 Shell脚本变量接收hive语句的返回值
有时在写shell脚本时,脚本变量需要接收hive语句的返回值#!bin/bashsql1="use test;select count(1) from table_name;"var1=`hive -S -e "${sql1}"`但有时,hive -S -e "sql"语句执行完后,有时候执行会包含WARN开头的日志WARN: The method class org.apache.commons.logging.impl.SLF4JLogFactory#release() w.
2020-07-30 10:01:42
1735
原创 IDEA关闭当前文件改为ctrl + w
一般的编辑器中关闭当前文件快捷键为Ctrl+W,而idea中默认为Ctrl+F4,用起来很不顺手。可以将其改为自己熟悉的键位。依次点击进入:File—>settings—>keymap—>main menu—>window—>editor tabs—>close右键添加即可。...
2020-07-11 14:46:42
1563
原创 Mac安装Mysql后无初始密码的解决办法
很多小伙伴都有在Windows或者Linux下安装Mysql的经验,但在Mac下安装Mysql时却犯难了,因为不知道初始密码,无法登陆。其实mac安装完后有发一条消息告知初始密码,细心发现即可。
2020-06-15 21:03:15
590
glibc-2.14.zip
2020-01-03
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人