记配置20遍spark多机分布式环境

背景 最近由于论文的关系,设计的算法需要在分布式环境下,测试算法的通信时间通信代价,于是尝试配置了多台机器的分布式环境。由于配置过程较为复杂,其中也遇到许许多多问题,由于各式各样的因素,不得不一直转换不同的环境,完成机器的配置。虽然由于水平不足,犯了许多不必要的配置错误,有的问题看起来比较愚蠢,但为了之后避免踩入相同的坑,也就将这一路以来,不断配置更新的过程写成文章,以方便查找。 配置20遍 最初使用的平台是人大校级计算平台,在这个平台上,可以申请一定数量的机器,然后以科研结果作为经费抵扣。使用此平台的原因是之前有前辈在上面配置过 Spark 环境,而我有一定机会可以直接利用他配置好的成果,然而事情并没有像我想象的那么简单。此时出现了两个主要的问题,其一是该环境并没有真正配置yarn,并不能做到真正的并行;其次实际上此平台的集群是在一个大机器上分割出的小虚拟机组成集群,这样的集群实际上的通信代价是非常低的,这无法体现出我们算法的优势,因此我不得不寻找其他平台。之后就在组里先找了6台服务器,直接利用这6台服务器搭建一个集群,虽然机器数目少一点,但平摊下来,每个机器都比原来的配置要更好。当然事情不会那么顺利,由于我实验操作的数据量极大,我不断试探服务器计算能力的上限,最终这些服务器也难堪重负,纷纷内存耗尽、磁盘耗尽,引发了一系列不好的连锁反应,究其原因是我没有做docker环境隔离(要学的东西还很多)。由于当时论文ddl在即,让我只能在夜间跑代码,完全是不可能完成目标的,因此我不得不使用阿里云下的服务器。之后就搞了16台阿里云服务器,并在上面配置真·分布式环境,此时我已经有了十次左右配置环境的经验,但哪怕如此,又经历了经费不足、神秘bug等等意想不到的问题,但我最终还是勉强完成了论文,初次投稿当然还是被拒了。之后改投论文的过程中,吸取了服务器可能很容易崩,随时可能换机器的现实,尽可能地将许多作业改为了批处理,终于又配置了很多次,最终完成了实验和论文。 分布式环境的成分 HDFS 虽然说使用 Spark without Hadooop 从一定程度上配置或许会简单一点,但为了比较清晰地感受分布式环境,并更好地存储数据,我还是采用了 Hadoop 与 Spark 分开配置的策略,这里使用的 Hadoop 版本为 3.3.1。 (HDFS 其实就是一个分布式的文件管理系统,将数据分布式的存储在不同的机器上,一方面可以存的更多,一方面也是可以使得处理数据更快,数据直接分布在不同机器上,也就省去了从主机向其他机器发送数据的通信过程。) SPARK 这里使用Spark的版本是3.1.2 (Spark 分布式计算的环境,利用这样已有的环境就不需要自己去写通信、底层调度,也不必担心各种死锁的问题。) 由于我是不太会 Scala 的(但是任意一种语言,稍微看看基础代码我还能做到),为了方便上手,这里使用的是 PySpark,...

读取Graph数据的代码

背景 记录读图的一些代码,由于图一般都会储存为稀疏矩阵的形式,否则大图根本无法储存,所以最终返回的都是稀疏矩阵,比较节约空间的是csr matrix。 CSR Matrix and COO Matrix COO Matrix 比较容易理解。从图的角度出发其实就是将每条边都存下来。 要想压缩数据,无论什么方法,其实都是在合并同类项。COO Matrix有什么好压缩的呢?单个顶点出发的边可以将它们的顶点合并,用一个数表示。最终也就得到了CSR Matrix。 CSR Matrix可以理解为,先对顶点都预先编号为0-V,那么只需要记录一下,每个顶点有多少出边和出边的位置即可。CSR Matrix由三个数组构成:offsets、edges、values。有时候,offsets 在某些函数输入会拆分为 PointerB 和 PointE,意思也很简单,即某顶点开始时,已经记录边的数量,和此顶点结束时,会记录边的数量。至于 edges 记录的是边的终点,values 记录边的权重。对 CSR Matrix理解的程度决定了,你能对矩阵计算所沉浸的深度,利用CSR进行图的访问和计算是非常方便的,要使有机会写到 MKL 矩阵运算库的解析,会有更深的理解。 Python 部分...

一些乱七八糟的图片处理

背景 记录一些摸索图片处理过程中,看到的,和自己研究的图片预处理方法 图片移动 # 给定判断函数的批量图片移动 import shutil import os def movefile(source_folder,target_folder,condition): #source_folder 原文件夹,target_folder目标文件夹,condition 给定文件路径,判断是否满足移动的条件 filelist=os.listdir(source_folder) for files in filelist: if files[0]==".": continue try: if condition(os.path.join(source_folder,files)): full_path=os.path.join(source_folder,files) des_path=os.path.join(target_folder,files) shutil.move(full_path,des_path) except: print(os.path.join(source_folder,files))...

Kmeans base on Cython

背景 Kmeans 是机器学习比较基础的算法,利用包调用比较容易,未来的算法可以很复杂,但基础都是一样简单的。算法层面尽量写得简单,将优化过程尽量写复杂。由于想使用Cython,先写C++部分,这里需要定义命名空间。头文件代码如下: 代码 KMeans.h #ifndef KMEANS #define KMEANS #include <iostream> #include <Eigen/Dense> using namespace std; using namespace Eigen; namespace cluster { class Kmeans{ public: size_t n_cluster; int max_iter; double...

整理提取图片始

背景 这一切要从我清理手机开始说起,最大占用手机空间的内容当然是手机上的照片。糟糕的是,将照片传到计算机之后,照片就完全乱了,虽然之前也是一团乱麻。想到之前想存图片当壁纸,存了几万张照片,这次可以总结一下,用python对图片做些简单的分类。所以总的说,目标是尽可能提取高清的图片作为壁纸,必要时需要按风格分一下类。其次是手机上不需要的图片且质量差的,或者是无法打开的照片都清理掉。下面是清理过程中的代码: 简单整理图片的思路与实现 准备部分 #与图像处理相关的包 from PIL import Image import cv2 import matplotlib.pyplot as plt import matplotlib.image as mpimg from pylab import * #基础系统和数学包 import math import numpy as np...

Python base skill

标准数据类型 与其他语言十分不一样的是python 封装的几种数据类型 六种数据类型 Number 不用理会浮点型、整数型、为计算带来很多方便,当然不足之处还是运算比较慢,容易不精准计算 String 字符串 从String库提供的字符串处理函数来说,python String相对于其他语言十分的方便和友好 List 列表 主要用[]修饰,比其他语言方便的一点是什么东西都能放,实在是特别好用 Tuple 元组 主要用()修饰,和列表不同之处在于,不可修改 Set 集合 和列表很像,区别是没有重复的项 Dictionary 字典 是我认为除了列表以外最好用的一种容器类型 从Python语言的发明来看,这几种数据类型竟然真的几乎可以覆盖数据工作的方方面面,也就难怪python如此受人欢迎。 而python最为让新手难受,让老手方便的一点,自然是那严格的缩进规则 简单python程序 #python2 print "HelloWorld" #python3 print("HelloWorld")...