Apache Spark

小米流式平台架构演进与实践

三世轮回 提交于 2020-02-28 07:57:16
小米业务线众多,从信息流,电商,广告到金融等覆盖了众多领域,小米流式平台为小米集团各业务提供一体化的流式数据解决方案,主要包括数据采集,数据集成和流式计算三个模块。目前每天数据量达到 1.2 万亿条,实时同步任务 1.5 万,实时计算的数据 1 万亿条。 伴随着小米业务的发展,流式平台也经历三次大升级改造,满足了众多业务的各种需求。最新的一次迭代基于 Apache Flink,对于流式平台内部模块进行了彻底的重构,同时小米各业务也在由 Spark Streaming 逐步切换到 Flink。 背景介绍 小米流式平台的愿景是为小米所有的业务线提供流式数据的一体化、平台化解决方案。具体来讲包括以下三个方面: 流式数据存储 :流式数据存储指的是消息队列,小米开发了一套自己的消息队列,其类似于 Apache kafka,但它有自己的特点,小米流式平台提供消息队列的存储功能; 流式数据接入和转储 :有了消息队列来做流式数据的缓存区之后,继而需要提供流式数据接入和转储的功能; 流式数据处理 :指的是平台基于 Flink、Spark Streaming 和 Storm 等计算引擎对流式数据进行处理的过程。 下图展示了流式平台的整体架构。从左到右第一列橙色部分是数据源,包含两部分,即 User 和 Database。 User 指的是用户各种各样的埋点数据,如用户 APP 和 WebServer

Hadoop with Python 英文原版下载

坚强是说给别人听的谎言 提交于 2020-02-28 05:55:06
如果你是python开发者,又或者你想从python开启你的学习hadoop之旅,那么本书一定是你的入门必备图书。本书涵盖hadoop\pig\spark等一系列前沿技术。 虽然是英文原版,但读起来一鼓作气,丝毫没有语言上的问题。 链接:https://pan.baidu.com/s/1U57CbqsVJOwfvyT4noVfZg 提取码:ctoa 来源: oschina 链接: https://my.oschina.net/weiwubunengxiao/blog/3169104

Spark性能优化:资源调优篇

China☆狼群 提交于 2020-02-28 05:35:12
在开发完Spark作业之后,就该为作业配置合适的资源了。Spark的资源参数,基本都可以在spark-submit命令中作为参数设置。很多Spark初学者,通常不知道该设置哪些必要的参数,以及如何设置这些参数,最后就只能胡乱设置,甚至压根儿不设置。资源参数设置的不合理,可能会导致没有充分利用集群资源,作业运行会极其缓慢;或者设置的资源过大,队列没有足够的资源来提供,进而导致各种异常。总之,无论是哪种情况,都会导致Spark作业的运行效率低下,甚至根本无法运行。因此我们必须对Spark作业的资源使用原理有一个清晰的认识,并知道在Spark作业运行过程中,有哪些资源参数是可以设置的,以及如何设置合适的参数值。 Spark作业基本运行原理 详细原理见上图。我们使用spark-submit提交一个Spark作业之后,这个作业就会启动一个对应的Driver进程。根据你使用的部署模式(deploy-mode)不同,Driver进程可能在本地启动,也可能在集群中某个工作节点上启动。Driver进程本身会根据我们设置的参数,占有一定数量的内存和CPU core。而Driver进程要做的第一件事情,就是向集群管理器(可以是Spark Standalone集群,也可以是其他的资源管理集群,美团•大众点评使用的是YARN作为资源管理集群)申请运行Spark作业需要使用的资源

使用SparkLauncher提交Spark作业

随声附和 提交于 2020-02-27 04:30:26
通常情况下,使用spark-submit来提交作业。 是否有办法使用代码动态地提交作业? 本文使用SparkLauncher提供了一种解决方法。 提交Spark Application val handle: SparkAppHandle = newSparkLauncher() .setSparkHome("/path/to/spark/home") .setAppResource("/path/to/your/spark/program/jar") .setConf("spark.driver.memory", "2") .setConf("spark.driver.extraClassPath", "/your/class/path") .setConf("spark.executor.extraClassPath", "/your/class/path") .setConf("spark.executor.memory", "2") .setConf("spark.executor.cores", "10") .setConf("spark.num.executors", "5") .setMainClass("XXXXCLASS") .setVerbose(true) .setMaster("yarn") .setDeployMode("cluster")

Spark History Server的配置

瘦欲@ 提交于 2020-02-26 23:31:30
spark-env.sh export SPARK_HISTORY_OPTS="-Dspark.history.retainedApplications=50-Dspark.history.fs.logDirectory=hdfs://node04:9000/directory" #spark.history.retainedApplications:仅显示最近50个应用 #spark.history.fs.logDirectory:Spark History Server只显示该路径下的信息 spark-defaults.conf spark.eventLog.enabled true spark.eventLog.dir hdfs://node04:8020/directory #应用在运行过程中所有的信息均记录在该属性指定的路径下 spark.eventLog.compress true HistoryServer启动 $SPARK_HOMR/bin/start-histrory-server.sh HistoryServer停止 $SPARK_HOMR/bin/stop-histrory-server.sh 来源: oschina 链接: https://my.oschina.net/u/4427158/blog/3165814

大数据量下寻找相邻单词的数量

折月煮酒 提交于 2020-02-26 23:28:12
这题目和Leetcode中的一些搜索题目有点类似。 想处理的问题是:统计一个单词相邻前后两位的数量,如有w1,w2,w3,w4,w5,w6,则: 最终要输出为(word,neighbor,frequency)。 我们用五种方法实现: MapReduce Spark Spark SQL的方法 Scala方法 Scala版Spark SQL MapReduce //map函数 @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { String[] tokens = StringUtils.split(value.toString(), " "); //String[] tokens = StringUtils.split(value.toString(), "\\s+"); if ((tokens == null) || (tokens.length < 2)) { return; } //计算相邻两个单词的计算规则 for (int i = 0; i < tokens.length; i++) { tokens[i] = tokens[i].replaceAll("\\W+", ""); if

import spark.implicits._ 报红,无法导入

孤街醉人 提交于 2020-02-26 17:00:43
先给出错误的代码 def main(args: Array[String]): Unit = { //Create SparkConf() And Set AppName SparkSession.builder() .appName("Spark Sql basic example") .config("spark.some.config.option", "some-value") .getOrCreate() //import implicit DF,DS import spark.implicits._ //这里的spark出现了红色,无法导入 } 解决方法:给SparkSession.builder一个对应的变量值,这个变量值是spark。 这里的spark不是某个包下面的东西,而是我们SparkSession.builder()对应的变量值,下面是正确的写法 def main(args: Array[String]): Unit = { //Create SparkConf() And Set AppName val spark= SparkSession.builder() .appName("Spark Sql basic example") .config("spark.some.config.option", "some-value") .getOrCreate

pyspark 调 mysql jdbc读取了参数出来,待续

会有一股神秘感。 提交于 2020-02-26 13:56:26
#!/usr/bin/python # -*- coding: utf-8 -*- from __future__ import print_function from pyspark.sql import SparkSession from pyspark.sql import SQLContext import os, time,sys def main(argv): print(argv[1]) print(argv[2]) print(argv[3]) spark = SparkSession.builder\ .appName("test")\ .master("local")\ .getOrCreate() sc = spark.sparkContext sqlContext=SQLContext(sc) jdbcDf=sqlContext.read.format("jdbc").options(url="jdbc:mysql://ip:3306/test",\ driver="com.mysql.jdbc.Driver",\ dbtable="(SELECT * FROM test LIMIT 5) tmp",\ user="test",password="1111123").load() #print(jdbcDf.select('job_name').show(2

Spark性能优化:数据倾斜调优

我是研究僧i 提交于 2020-02-26 11:06:57
调优概述 有的时候,我们可能会遇到大数据计算中一个最棘手的问题——数据倾斜,此时Spark作业的性能会比期望差很多。数据倾斜调优,就是使用各种技术方案解决不同类型的数据倾斜问题,以保证Spark作业的性能。 数据倾斜调优 数据倾斜发生时的现象 绝大多数task执行得都非常快,但个别task执行极慢。比如,总共有1000个task,997个task都在1分钟之内执行完了,但是剩余两三个task却要一两个小时。这种情况很常见。 原本能够正常执行的Spark作业,某天突然报出OOM(内存溢出)异常,观察异常栈,是我们写的业务代码造成的。这种情况比较少见。 数据倾斜发生的原理 数据倾斜的原理很简单:在进行shuffle的时候,必须将各个节点上相同的key拉取到某个节点上的一个task来进行处理,比如按照key进行聚合或join等操作。此时如果某个key对应的数据量特别大的话,就会发生数据倾斜。比如大部分key对应10条数据,但是个别key却对应了100万条数据,那么大部分task可能就只会分配到10条数据,然后1秒钟就运行完了;但是个别task可能分配到了100万数据,要运行一两个小时。因此,整个Spark作业的运行进度是由运行时间最长的那个task决定的。 因此出现数据倾斜的时候,Spark作业看起来会运行得非常缓慢,甚至可能因为某个task处理的数据量过大导致内存溢出。

我读过的一些书推荐

陌路散爱 提交于 2020-02-26 05:21:26
本文总结了一些读书的时候和工作后看过的书,这些书是从我的书单中挑出来的。 不完全统计我个人在京东、当当、亚马逊和Kindle上共买了几百本书,当然算起来其实没有花多少钱,有大量的书都是搞活动买到的。我挑了其中一些个人认为很值得看的书,大家可以搜一下,其实大部分书都可以在往上找到电子版。如果你打算仔细看看,推荐还是买基本纸质书籍,比如我个人其实还是更喜欢看一些纸质的书。 ⚠️注意啦。这些书只是我个人看过的,包括计算机基础,算法,语言,后端开发,大数据开发,也包含了一些机器学习和算法的书,好坏也是从个人角度出发,如果某一本书你也看过,但是你觉得就是垃圾,那它就是你眼中的垃圾。 第一部分:语言和基础篇 读者中应该有一部分不是计算机专业,或者是本科跨考的计算机大类的研究生,还有一些其他的情况,那么这里我强烈建议你要把下面这些基础书看看,补上自己的基础。 朋友们,下面这套书每本都是板砖那么厚,不管你是用来防身还是垫桌子都是不二之选。那就是国内机械工业出版社引进的黑皮书系列。 这套书我个人全部看下来的三分之一都不到... 太TM难啃了。后来到处找视频看... 如果你的英文足够好,硬刚原版也可以[手动狗头]。 好了,接下来是我买到几本好书。 《重构:修改代码的艺术》,这本书怎么说,是我买到的好书中排名前几的,这本书可以帮助你改掉代码中的'坏味道',写出高质量的代码。 这本书毁誉参半