![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
大数据
文章平均质量分 86
大数据
spark man
crazy for coding
展开
-
shuffle过程
案例假设我们写一个wordcount的程序:sc.textFile("hdfs://hadoop102:8020/spark-input/word.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).saveAsTextFile("hdfs://hadoop102:8020/spark-out/wcout")观看job:划分了两个stage,因为出现了shuffle:一共是4个task,第一个stage两个task,第二个原创 2021-10-21 17:58:54 · 879 阅读 · 0 评论 -
mapJoin与reduceJoin
mapreduce中可以实现map端的join以及reduce端的join,我们看下有什么区别。mapJoin与reduceJoin数据准备reduce joinmap joinhive的map join测试数据准备有一张订单表(order):1001 01 11002 02 21003 03 31004 01 41005 02 51006 03 6三列对应的字段分别是订单ID,产品ID以及产品数量。然后还有一张产品表(pd):01 小米02 华为03 格力对应的字段分别是原创 2021-10-15 20:27:08 · 721 阅读 · 0 评论 -
推荐系统的基础算法和企业级设计
推荐系统的基础算法和企业级设计推荐系统介绍推荐系统的技术选型和基础数据2.1 技术选取2.2 数据简介算法讨论基于统计学的推荐算法LFM算法实时推荐算法推荐系统介绍在互联网时代,为了能够给用户良好的体验并且增大用户的留存率,推荐系统应运而生。简单的推荐系统就是依据统计的推荐,也就是说,这与用户无关,每个人的界面看到的东西都是一样的。比如电商中Hot的商品,或者电影观看网站的Top N的电影。只要能够获得所有用户的够买或者评分数据,我们就能够做出统计推荐。另一部分的推荐则是个性化推荐,每个用户推到的东原创 2021-10-15 09:57:29 · 408 阅读 · 0 评论 -
hbase rowkey设计案例
介绍hbase中的rowkey可以唯一定位一条数据。rowkey设计的合不合理,很大程度上可以解决数据倾斜的问题。和rowkey密切相关的是分区键,我们可以用命令行或者代码方式创建分区键:比如staff这个表就有4个分区键:aaaabbbbccccdddd由此切割成5个分区。rowkey带着一条数据来了之后就要和这些分区键去比较,决定自己进入哪一个分区。比较的规则是字典排序。我们想要的是,第一,一条数据来了之后,立马能够知道他进入哪个分区,而不用一位一位的比较。能够达成这个想法的做原创 2021-10-15 08:30:01 · 1224 阅读 · 0 评论 -
自定义分区并区内排序
简单的wordCount假设我们的文件中有这么一些数据:sparksparkhivehadoopsparksparkhivehadoopsparksparkhivehadoopsparksparkhivehadoopsparksparkhivehadoopsparksparkhivehadoopsparksparkhivehadoopsparksparkhivehadoopsparksparkhivehadoopsparkspar原创 2021-10-15 08:28:24 · 351 阅读 · 0 评论 -
rdd之行动算子
行动算子就是会触发action的算子,触发action的含义就是真正的计算数据。一些行动算子collectreduceaggregateforeachcounttakeOrderedmincollectcollect就是将executor端的数据收集到driver端。比如一个简单的wordcount程序:object CollectAction { def main(args: Array[String]): Unit = { val conf: SparkConf = new Spa原创 2021-10-15 08:27:36 · 641 阅读 · 0 评论 -
rdd算子之cogroup
coGroup及其应用cogroupintersectionleftOuterJoin, rightOuterJoin, fullOuterJoin, joincogroupcogroup也能组合RDD。例子:object CogroupOperator { def main(args: Array[String]): Unit = { val sparkConf: SparkConf = new SparkConf().setAppName(this.getClass.getSimpl原创 2021-10-15 08:26:41 · 332 阅读 · 0 评论 -
rdd算子之byKey系列
spark中有一些xxxByKey的算子。我们来看看。rdd算子之byKey系列groupByKey解释实现groupByreduceByKeydistinctaggregateByKeycombineByKeygroupByKey解释假设我们要对一些字符串列表进行分组:object GroupByKeyOperator { def main(args: Array[String]): Unit = { val conf = new SparkConf().setMaster("loc原创 2021-10-15 08:25:54 · 486 阅读 · 0 评论 -
rdd算子之map相关
首先是RDD算子中与map有关的几个算子的理解。rdd算子之map相关mapmapPartitionsmapPartitionsWithIndexmapmap其实就是一种数据结构的映射,将一种结构转换成另一种结构。一个简单的spark程序实现列表中的每个数乘以2:object MapOperator { def main(args: Array[String]): Unit = { val conf = new SparkConf().setMaster("local[*]").set原创 2021-10-14 20:42:38 · 2502 阅读 · 0 评论 -
Spark源码之通信环境
Spark通信通信组件RpcEndpoint,RpcEnv,RpcEndpointRef,RpcAddressTransportServer,TransportClient,Outbox,Inbox,DispatcherDriver端Executor端通信组件为了了解spark的通信环境,我们需要了解它的主要组件。RpcEndpoint,RpcEnv,RpcEndpointRef,RpcAddress首先是RpcEndpoint:一个通信终端有他自己的生命周期:constructor ->原创 2021-10-14 20:37:11 · 210 阅读 · 0 评论 -
spark源码之环境准备
我们使用yarn集群作为研究spark环境准备yarn环境准备启动Driver启动Executoryarn环境准备spark的入口类是SparkSubmit,在这里,我们开始提交参数这里的args就是--class这些的。解析好这些参数后,我们会返回一个SparkSubmitArguments的一个属性action的值并进行模式匹配。我们可以看到,action默认就是SUBMIT。于是走submit分支:假设我们没有使用--proxy-user参数,于是走runMain(args,原创 2021-10-14 18:58:08 · 201 阅读 · 0 评论 -
电商数仓简介
数仓是为决策用的,它的架构逻辑十分严密。数仓分区ods层dwd与dim层事务型事实表周期型事实表累计型快照事实表dws层dwt层ads层用户行为路径分析漏斗模型留存用户ods层数仓是分层的。ods层是直接从hdfs拿数据,不做任何修改,只是添加了时间分区。添加时间分区后,方便后续的查询和管理。那hdfs的原始数据从哪里来呢?如果是业务数据,那就是从mysql用sqoop导进来的,导入的时候就会使用压缩(比如LZO压缩)。mysql有什么表,hdfs就对应有什么表。如果是日志数据,那就从文件导入原创 2021-10-14 17:41:10 · 1227 阅读 · 0 评论 -
hdfs上传文件
hdfs写数据流程将文件添加到目录树将数据写入队列机架感知DN写数据、客户端收到应答将文件添加到目录树假设我们有一段创建文件并写入数据的代码: FileSystem fileSystem; @Before public void init() throws Exception{ String user = "ocean"; Configuration configuration = new Confi![image.png](http://oce原创 2021-10-14 13:40:31 · 1384 阅读 · 0 评论 -
namenode的启动
我们简单看下namenode启动需要经历的步骤。namenode启动要做什么启动9870服务端口加载镜像文件和编辑日志文件初始化RPC服务启动资源检查检查心跳检查是否进入安全模式启动9870服务端口因为namenode是一个进程,所以找到它的main方法:进入createNameNode:找到new NodeNode(conf),进去。找到初始化方法,进入:他要获取绑定的地址,我们希望知道这个地址是什么。看看这个默认的地址:端口号是9870。这就是我们经常用的namenode的原创 2021-10-14 12:24:19 · 4079 阅读 · 0 评论 -
MapReduce之Reduce
我们接着MapReduce之ShuffleReduceCopyMergeReduceCopy走到这里,我们就进入到reduce了。reduce有三个明确的阶段:copy,sort,reduce。在初始化ShuffleConsumerPlugin的时候,他需要创建一个MergeManager:这个MergeManager就是用来做文件合并的。接下来我们使用localFetcher去拉取map的输出文件。在此我们将获取file.out文件和file.out.index文件。我们将原创 2021-10-14 12:05:58 · 391 阅读 · 0 评论 -
MapReduce之Shuffle
承接上文MapReduce之Map阶段。我们需要将map后的数据往外写。shuffle收集数据排序和溢写合并收集数据我们写出的数据是("I", 1)。我们需要往kvbuffer中写key和value。写key的时候我们既要写I,又要写它的位置,不然怎么能找到它呢?写的时候,如果剩余内存不够用了,就会发生溢写:写I之前,我们已经有1这个位置了:写了I之后就有了它的ASCII值了:接着写1这个值,因为我们的1是Long,占8个字节,所以会占用kvbuffer的8个位置:此时我们原创 2021-10-14 11:03:19 · 126 阅读 · 0 评论 -
MapReduce之Map阶段
MapReduce阶段分为map,shuffle,reduce。map进行数据的映射,就是数据结构的转换,shuffle是一种内存缓冲,同时对map后的数据分区、排序。reduce则是最后的聚合。此文探讨map阶段的主要工作。map的工作代码介绍split启动mapTask代码介绍我们还是准备word count的代码:maper:public class WordCountMapper extends Mapper<LongWritable, Text, Text, LongWrita原创 2021-10-14 10:32:04 · 2715 阅读 · 0 评论 -
namenode的fsimage与edits文件
引入hadoop集群中,namenode管理了元数据。那么,元数据存储在哪里呢?如果是磁盘中,必然效率过低,如果是内存中,又会不安全。所以元数据存储在内存中,但是有一个备份文件fsimage在磁盘。这就防止了断电元数据丢失的问题。现在内存中的元数据增加之后,需要不断同步fsimage吗?这样又很没有效率。但你又必然要更新元数据,所以,可以将追加的操作写入一个文件edits。fsimage与edits一起加载到内存中,就会得到所有的元数据。合并元数据一旦变得庞大,加载到内存就会很慢。所以,还需要原创 2021-10-14 09:21:56 · 550 阅读 · 0 评论