0%

Spark性能优化

性能优化

对于某些工作负载,可以通过在内存中缓存数据或打开一些实验性选项来提高性能。

在内存中缓存数据

Spark SQL可以通过调用spark.catalog.cacheTable("tableName")dataFrame.cache()来使用内存中的列状格式缓存表。然后Spark SQL将只扫描所需的列,并自动调优压缩,以最小化内存使用和GC压力。可以调用spark.catalog.uncacheTable("tableName")从内存中删除表。

可以使用SparkSession上的setConf方法或使用SQL运行SET key=value命令来配置内存缓存。

属性名 默认值 描述
spark.sql.inMemoryColumnarStorage.compressed true 当设置为true时,Spark SQL将根据数据的统计信息自动为每一列选择压缩编解码器。
spark.sql.inMemoryColumnarStorage.batchSize 10000 控制列缓存的批大小。更大的批处理大小可以提高内存利用率和压缩,但是在缓存数据时存在oom风险。

其他配置选项

Read more »

Python处理各种Spark数据源

Spark SQL通过DataFrame接口支持对各种数据源进行操作。DataFrame可以使用关系型数据库转换操作,也可以用来创建临时视图。将一个DataFrame注册为临时视图允许您对其数据运行SQL查询。现在本人介绍使用Spark加载和保存数据的基本使用方法,然后介绍内置数据源的读取和保存。

数据的加载和保存

  1. 普通方式加载和保存spark默认数据类型parquet
1
2
df = spark.read.load("examples/src/main/resources/users.parquet")
df.select("name", "favorite_color").write.save("namesAndFavColors.parquet")
  1. 在加载和保存时,通过参数指定数据源类型

我们可以在保存和读取时指定要使用的数据源以及希望传递给数据源的其他参数。数据源由它们的全限定名,也可以使用它们的名称,比如json、parquet、jdbc、orc、libsvm、csv、text等后面将一一介绍。从任何数据源类型的数据都可以使用这种语法转换为其他类型。

1
2
df = spark.read.load("examples/src/main/resources/people.json", format="json")
df.select("name", "age").write.save("namesAndAges.parquet", format="parquet")
  1. 在读取文件的的时候直接运行SQL
1
df = spark.sql("SELECT * FROM parquet.`examples/src/main/resources/users.parquet`")
Read more »

Python性能优化建议

优化算法时间复杂度

算法的时间复杂度对程序的执行效率影响最大,在Python中可以通过选择合适的数据结构来优化时间复杂度,如list和set查找某一个元素的时间复杂度分别是O(n)和O(1)。不同的场景有不同的优化方式,总得来说,一般有分治,分支界限,贪心,动态规划等思想。

减少冗余数据

如用上三角或下三角的方式去保存一个大的对称矩阵。在0元素占大多数的矩阵里使用稀疏矩阵表示。

使用性能分析工具

Read more »

Python并行编程

由于GIL的存在,Python很难充分利用多核CPU的优势。但是,可以通过内置的模块multiprocessing实现下面几种并行模式:

  • 多进程

对于CPU密集型的程序,可以使用multiprocessing的Process,Pool等封装好的类,通过多进程的方式实现并行计算。但是因为进程中的通信成本比较大,对于进程之间需要大量数据交互的程序效率未必有大的提高。

  • 多线程

对于IO密集型的程序,multiprocessing.dummy模块使用multiprocessing的接口封装threading,使得多线程编程也变得非常轻松(比如可以使用Pool的map接口,简洁高效)。

  • 分布式

multiprocessing中的Managers类提供了可以在不同进程之共享数据的方式,可以在此基础上开发出分布式的程序。

下面对Python的多进程、多线程等进行一一介绍:

Python线程与进程简介

Read more »

旋转数组

题目说明

给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
示例 1:

1
2
3
4
5
6
输入: [1,2,3,4,5,6,7] 和 k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右旋转 1 步: [7,1,2,3,4,5,6]
向右旋转 2 步: [6,7,1,2,3,4,5]
向右旋转 3 步: [5,6,7,1,2,3,4]

示例 2:

1
2
3
4
5
输入: [-1,-100,3,99] 和 k = 2
输出: [3,99,-1,-100]
解释:
向右旋转 1 步: [99,-1,-100,3]
向右旋转 2 步: [3,99,-1,-100]

说明:

  • 尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。
  • 要求使用空间复杂度为O(1)的原地算法。
    Read more »

旋转图像

题目说明

给定一个 n×n 的二维矩阵表示一个图像。

将图像顺时针旋转90度。

你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。
示例 1:

1
2
3
4
5
6
7
8
9
10
11
12
给定 matrix =
[
[1,2,3],
[4,5,6],
[7,8,9]
],
原地旋转输入矩阵,使其变为:
[
[7,4,1],
[8,5,2],
[9,6,3]
]

示例 2:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
给定 matrix =
[
[ 5, 1, 9,11],
[ 2, 4, 8,10],
[13, 3, 6, 7],
[15,14,12,16]
],
原地旋转输入矩阵,使其变为:
[
[15,13, 2, 5],
[14, 3, 4, 1],
[12, 6, 8, 9],
[16, 7,10,11]
]
Read more »

验证数独是否有效

题目说明

判断一个9x9的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。

  1. 数字 1-9 在每一行只能出现一次。
  2. 数字 1-9 在每一列只能出现一次。
  3. 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
    sample

上图是一个部分填充的有效的数独。
数独部分空格内已填入了数字,空白格用 ‘.’ 表示。

Read more »

使你的Python代码更优雅

注: 本人代码主要以Python3为主。

遍历一个范围的数字

  1. Python2的普通写法

    1
    2
    for i in [0, 1, 2, 3, 4, 5]:
    print i ** 2

    或者:

    1
    2
    for i in range(6):
    print i ** 2
  2. Python2最好的优雅的写法是

    1
    2
    for i in xrange(6):
    print i ** 2
  3. 在Python3中的优雅写法

    1
    2
    for i in range(6):
    print(i ** 2)

    xrange会返回一个迭代器,用来一次一个值地遍历一个范围。这种方式会比range更省内存。xrange在Python3中已经改名为range。

遍历一个集合

Read more »

Parquet简介

创建Parquet是为了让Hadoop生态系统中的任何项目都可以使用压缩的、高效的列式数据表示。

parquet是在考虑复杂嵌套数据结构的基础上,采用Dremel论文中描述的记录分解和装配算法构建的。我们认为这种方法优于简单地扁平化嵌套名称空间。

parquet支持非常有效的压缩和编码方案。多个项目已经证明了对数据应用正确的压缩和编码方案对性能的影响。parquet允许在每一列水平上指定压缩方案,并且在发明和实现时允许添加更多的编码,这是对未来的证明。

parquet是供任何人使用的。Hadoop生态系统拥有丰富的数据处理框架,我们不感兴趣。我们认为,一个高效的、实现良好的柱状存储底层应该对所有框架都有用,而不需要花费大量的成本,也不需要建立依赖关系。

Parquet的组成

Parquet仅仅是一种存储格式,它是语言、平台无关的,并且不需要和任何一种数据处理框架绑定,目前能够和Parquet适配的组件包括下面这些,可以看出基本上通常使用的查询引擎和计算框架都已适配,并且可以很方便的将其它序列化工具生成的数据转换成Parquet格式。

Parquet适配多种计算框架

Read more »

Hadoop和Spark大数据框架

Hadoop是什么

Hadoop分布式文件系统(HDFS),它将文件以Hadoop本机格式存储并在集群中并行化,包括:

  • YARN:协调应用程序运行时的调度程序

  • MapReduce:并行处理数据的算法

  • Sqoop:它将关系数据移入HDFS

  • Hive:一种类似SQL的接口,允许用户在HDFS上运行查询

  • Mahout:可以实现机器学习。

除了将HDFS用于文件存储之外,Hadoop现在还可以配置使用S3 buckets或Azure blob作为输入。

Hadoop使用Java编程语言构建,其上的应用程序也可以使用其他语言编写。通过一个Thrift客户端,用户可以编写MapReduce或者Python代码。

hadoop的安装部署可以点击本人博客CentOS下安装Hadoop

Spark是什么

Read more »