数据处理

Storm介绍及与Spark Streaming对比

谁说我不能喝 提交于 2020-01-20 01:22:00
1 Storm 介绍 Storm 是由 Twitter 开源的分布式、高容错的实时处理系统,它的出现令持续不断的流计算变得容易,弥补了 Hadoop 批处理所不能满足的实时要求。 Storm 常用于在实时分析、在线机器学习、持续计算、分布式远程调用和 ETL 等领域。 在 Storm 的集群里面有两种节点:控制节点 (Master Node) 和工作节点 (Worker Node) 。控制节点上面运行一个名为 Nimbus 的进程 , 它用于资源分配和状态监控;每个工作节点上面运行一个 Supervisor 的进程,它会监听分配给它所在机器的工作,根据需要启动 / 关闭工作进程。 Storm 集群架构如下图所示: 图 1 Storm 集群架构 Storm 集群中每个组件具体描述如下: l Nimbus :负责在集群里面发送代码,分配工作给机器并且监控状态,在集群中只有一个,作用类似 Hadoop 里面的 JobTracker 。 l ZooKeeper : Storm 重点依赖的外部资源, Nimbus 、 Supervisor 和 Worker 等都是把心跳数据保存在 ZooKeeper 上, Nimbus 也是根据 ZooKeeper 上的心跳和任务运行状况进行调度和任务分配的。 l Supervisor :在运行节点上,监听分配的任务,根据需要启动或关闭工作进程 Worker

spark streaming 接收kafka消息之五 -- spark streaming 和 kafka 的对接总结

你。 提交于 2020-01-19 22:45:11
Spark streaming 和kafka 处理确保消息不丢失的总结 接入kafka 我们前面的1到4 都在说 spark streaming 接入 kafka 消息的事情。讲了两种接入方式,以及spark streaming 如何和kafka协作接收数据,处理数据生成rdd的 主要有如下两种方式 基于分布式receiver 基于receiver的方法采用Kafka的高级消费者API,每个executor进程都不断拉取消息,并同时保存在executor内存与HDFS上的预写日志(write-ahead log/WAL)。当消息写入WAL后,自动更新ZooKeeper中的offset。 它可以保证at least once语义,但无法保证exactly once语义。原因是虽然引入了WAL来确保消息不会丢失,但有可能会出现消息已写入WAL,但更新comsuer 的offset到zk时失败的情况,此时consumer就会按上一次的offset重新发送消息到kafka重新获取一次已保存到WAL的数据。这种方式还会造成数据冗余(WAL中一份,blockmanager中一份,其中blockmanager可能会做StorageLevel.MEMORY_AND_DISK_SER_2,即内存中一份,磁盘上两份),大大降低了吞吐量和内存磁盘的利用率。现在基本都使用下面基于direct

Hadoop + ZK + HBase 环境搭建

家住魔仙堡 提交于 2020-01-19 21:31:19
Hadoop 环境搭建 参考资料: http://hadoop.apache.org/docs/r2.4.1/hadoop-project-dist/hadoop-common/ClusterSetup.html http://hadoop.apache.org/docs/r2.4.1/hadoop-yarn/hadoop-yarn-common/yarn-default.xml http://hadoop.apache.org/docs/r2.4.1/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml 下载 2.4.1 bin 包, 解压好以后按照链接上配置各个配置文件, 启动时会遇到 "Unable to load realm info from SCDynamicStore " 的问题, 这个问题需要在 hadoop-env.sh 中加入如下配置(配置 HBase 的时候也会遇到这个问题, 使用同样的方法在 hbase-env.sh 中加入如下配置解决) hadoop-env.sh(hbase-env.sh) 配置, 增加 export JAVA_HOME="/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home" export HBASE_OPTS="

Spark Streaming数据限流简述

≡放荡痞女 提交于 2020-01-19 21:06:02
  Spark Streaming对实时数据流进行分析处理,源源不断的从数据源接收数据切割成一个个时间间隔进行处理;    流处理与批处理有明显区别,批处理中的数据有明显的边界、数据规模已知;而流处理数据流并没有边界,也未知数据规模;   由于流处理的数据流特征,使之数据流具有不可预测性,而且数据处理的速率还与硬件、网络等资源有关,在这种情况下如不对源源不断进来的数据流速率进行限制,那当Spark节点故障、网络故障或数据处理吞吐量下来时还有数据不断流进来,那将有可能将出现OOM进而导致Spark Streaming程序崩溃;   在Spark Streaming中不同的数据源采用不同的限速策略,但无论是Socket数据源的限流策略还是Kafka数据源的限流策略其速率(rate)的计算都是使用PIDController算法进行计算而得来;   下面从源码的角度分别介绍 Socket数据源 与 Kafka数据源 的限流处理。 速率限制的计算与更新   Spark Streaming的流处理其实是基于微批处理(MicroBatch)的,也就是说将数据流按某比较小的时间间隔将数据切割成为一段段微批数据进行处理;   StreamingContext调用Start()启动的时候会将速率控制器(rateController)添加到StreamingListener监听器中;  

Apache Spark Streaming (章节四)

江枫思渺然 提交于 2020-01-19 16:31:18
Spark Streaming Spark Streaming是核心Spark API的扩展,可实现实时数据流的可扩展,高吞吐量,容错流处理。数据可以从许多来源(如Kafka,Flume,Kinesis或TCP套接字)中获取,并且可以使用以高级函数(如map,reduce,join和window)表示的复杂算法进行处理。最后,处理后的数据可以推送到文件系统,数据库和实时dashboards。 在内部,它的工作原理如下。 Spark Streaming接收实时输入数据流并将数据分成批处理,然后由Spark引擎处理以批量生成最终结果流。 Spark Streaming提供称为离散流或DStream的高级抽象,表示连续的数据流。DStream可以从来自Kafka,Flume和Kinesis等源的输入数据流创建,也可以通过在其他DStream上应用高级操作来创建。在内部DStream表示为一系列RDD。 Quick Start maven < dependency > < groupId > org.apache.spark </ groupId > < artifactId > spark-streaming_2.11 </ artifactId > < version > ${spark.version} </ version > </ dependency > 案例入门 val

spark数据倾斜

 ̄綄美尐妖づ 提交于 2020-01-19 15:28:37
大数据(spark)八个点解决数据倾斜 一:什么是数据倾斜? 于spark/hadoop 这样的分布式大数据系统来讲,数据量大并不可怕,可怕的是数据倾斜。 对于分布式系统而言,理想情况下,随着系统规模(节点数量)的增加,应用整体耗时线性下降。如果一台机器处理一批大量数据需要120分钟,当机器数量增加到3台时,理想的耗时为120 / 3 = 40分钟。但是,想做到分布式情况下每台机器执行时间是单机时的1 / N,就必须保证每台机器的任务量相等。不幸的是,很多时候,任务的分配是不均匀的,甚至不均匀到大部分任务被分配到个别机器上,其它大部分机器所分配的任务量只占总得的小部分。比如一台机器负责处理 80% 的任务,另外两台机器各处理 10% 的任务。 『不患多而患不均』,这是分布式环境下最大的问题。意味着计算能力不是线性扩展的,而是存在短板效应: 一个 Stage 所耗费的时间,是由最慢的那个 Task 决定。 由于同一个 Stage 内的所有 task 执行相同的计算,在排除不同计算节点计算能力差异的前提下,不同 task 之间耗时的差异主要由该 task 所处理的数据量决定。所以,要想发挥分布式系统并行计算的优势,就必须解决数据倾斜问题。 二、数据倾斜的现象 当发现如下现象时,十有八九是发生数据倾斜了: 绝大多数 task 执行得都非常快,但个别 task 执行极慢

Pandas数据处理三板斧——map、apply、applymap详解

泪湿孤枕 提交于 2020-01-19 03:53:18
公众号:Python读数 如有问题或建议,请公众号留言 在日常的数据处理中,经常会对一个 DataFrame 进行逐行、逐列和逐元素的操作,对应这些操作,Pandas中的 map 、 apply 和 applymap 可以解决绝大部分这样的数据处理需求。这篇文章就以 案例 附带 图解 的方式,为大家详细介绍一下这三个方法的 实现原理 ,相信读完本文后,不论是小白还是Pandas的进阶学习者,都会对这三个方法有更深入的理解。 本文演示的数据集是模拟生成的,想练手的可以按下方的代码生成。 boolean = [ True , False ] gender = [ "男" , "女" ] color = [ "white" , "black" , "yellow" ] data = pd . DataFrame ( { "height" : np . random . randint ( 150 , 190 , 100 ) , "weight" : np . random . randint ( 40 , 90 , 100 ) , "smoker" : [ boolean [ x ] for x in np . random . randint ( 0 , 2 , 100 ) ] , "gender" : [ gender [ x ] for x in np . random .

Spark 初入门

◇◆丶佛笑我妖孽 提交于 2020-01-19 00:31:30
1 简介 Spark是三大分布式计算系统开源项目之一(Hadoop,Spark,Storm)。 特点 运行速度快: Spark使用先进的DAG(Directed Acyclic Graph,有向无环图)执行引擎,以支持循环数据流与内存计算,基于内存的执行速度可比Hadoop MapReduce快上百倍,基于磁盘的执行速度也能快十倍; 容易使用: Spark支持使用Scala、Java、Python和R语言进行编程,简洁的API设计有助于用户轻松构建并行程序,并且可以通过Spark Shell进行交互式编程; 通用性: Spark提供了完整而强大的技术栈,包括SQL查询、流式计算、机器学习和图算法组件,这些组件可以无缝整合在同一个应用中,足以应对复杂的计算; 运行模式多样: Spark可运行于独立的集群模式中,或者运行于Hadoop中,也可运行于Amazon EC2等云环境中,并且可以访问HDFS、Cassandra、HBase、Hive等多种数据源。 与Hadoop相比,Spark最大的特点就是将计算数据、中间结果都存储在内存中,大大减少了IO开销,因而,Spark更适合于迭代运算比较多的数据挖掘与机器学习运算。 2.安装 Spark可以独立安装使用,也可以和Hadoop一起安装使用。和Hadoop一起安装使用,可以让Spark使用HDFS存取数据。 当安装好Spark以后

spark shuffle

六月ゝ 毕业季﹏ 提交于 2020-01-18 14:17:15
Spark Shuffle 1. Shuffle相关 当Map 的输出结果要被Reduce使用时,输出结果需要按key哈希,并且分发到每一个Reducer上去,这个过程就是shuffle。由于shuffle涉及到了磁盘的读写和网络的传输,因此shuffle性能的高低直接影响到了整个程序的运行效率。概念上shuffle就是一个沟通数据连接(map和reduce)的桥梁。每个ReduceTask从每个Map Task产生数的据中读取一片数据,极限情况下可能触发M*R个数据拷贝通道(M是MapTask数目,R是Reduce Task数目)。 在Spark1.1 之前,其shuffle只存在一种模式,即hash base。在Spark1.1版本之后加入了sort base。Spark1.1默认采用的shuffle模式还是hash base。在Spark1.2中,sort base将作为默认模式。当然,你可以通过shuffle manager进行配置。 2. Spark shuffle流程 · 首先每一个Mapper 会根据Reducer的数量创建出相应的bucket,bucket的数量是M×R,其中M是Map的个数,R是Reduce的个数。 · 其次Mapper 产生的结果会根据设置的partition算法填充到每个bucket中去。这里的partition算法是可以自定义的

数据处理奇技巧——python篇

亡梦爱人 提交于 2020-01-18 05:04:47
1、数据读取前五行方法: 1)pandas读取时限定行数:此方法只将前5行读入到内存中,所以比较快速。 import pandas as pd data = pd.read_csv('sub_customer.csv',nrows=5) 2)head函数:也是pandas中的用法,不过这个用法需要将大量数据存入到内存中,然后才会读其中的前5行。 import pandas as pd data = pd.read_csv('sub_customer.csv') data.head(5) 3)循环读取前五行方法:最原始的方法,非常耗时。 N = int(raw_input('Enter a line number : >> ')) Filename = raw_input('Enter a file path: >> ') file = open(Filename,'r') lineNum = 0 for line in file.readlines()[0:N]: print line file.close() 2、for-in的两层循环方法: 以下会将二维数据输出成一个二维的数组: data = [[i for i in j if j!='null'] for j in data] 以下会将二维数组输出成一个一维的数组: data = [i for i in [j for j