Linux大数据处理踩坑实录

2023-05-16

最近开发需要在linux服务器上做大数据处理,由于对Linux开发并不是很熟悉,因此踩了很多坑,先作如下记录:

1.bash shell实现多进程

背景如下:需要从hadoop的hdfs上向服务器下拉数据,共7200多个数据文件,每个文件约1G左右,共7T左右的数据。
单纯的我一开始写了个shell脚本文件然后开始拉数据,结果发现拉了一下午,也才下载了100多个文件。。。照此速度基本得拉倒天荒地老了。。。多核的机器得用起来啊,于是开始研究如何在bash shell中实现多进程同时拉数据。参考了一些教程,主要有以下三点技能需要get:
1.for 循环
2.后台运行符&
3.wait等待所有子进程结束
get到了这3点技能后,说干就干的我开始写出了如下的脚本代码:

#!/bin/bash

for((i=0;i<7252;i++));do
{
    #拉取第i个文件
}&
done
wait

保存,运行~动作完美和谐,一气呵成。然而。。呵呵。。机器挂了。。。。世界陷入了一片死寂。。。
不明真相的我开始找运维。。运维说是机器背部电源板老化导致宕机。修复后重新登上机器,我又准备运行我的脚本,然而不出所料,机器再一次挂掉了。。。我觉得运维应该有杀了我全家的冲动。。。
此时的我终于意识到应该是我的脚本文件导致机器挂掉。于是开始仔细反思,在脚本中,我设定了循环中的变量从0到7151,后台运行符表明此段应该要后台并发执行,所以意味着我要同时开7252个进程去执行这段代码。。。再强大的机器也没这么多核。。。理解了多进程原理后,找到症结的我重新修改了代码:

#!/bin/bash

for((i=0;i<7252;i+=10));do
{
    for((j=0;j<10;j++));do
    {
        index=$(expr $i + $j)
        #拉取第index个文件
    }&
    done 
    wait
}
done

上面的代码中,每次同时开10个进程拉取10个文件,等这10个进程都拉取完毕后,再开10个进程拉取下一批10个文件,直到把所有的7252个文件拉取完毕。
总结这个坑,是因为对Linux多进程实现机制不了解所致,以后再写多进程脚本时,应该会吃一堑长一智了。

2.TAB的ascii码

写下这个小标题的时候我的内心是崩溃的,这种初学计算机的菜鸟都应该懂的知识,我一个在BAT互联网工作了两年的工程师居然都是后知后觉才Get到。
背景是这样的:
上面提到的这些数据都是SQL查询得到的表,我现在需要分析表中每行的记录,提取有用的信息。用fstream 的getline得到了一行string,接着理所当然地想去用string.find函数来查找空格,以此来分隔数据。然而发现find(” “)返回的结果为-1,即没有空格。然而我可没瞎,用Notepad打开文档后可是很整齐的数据表格式。此时的我内心如柯南遇到棘手的杀人案件一样,深深滴发出了疑问。。调试发现,该string中原本是空格的位置显示的是’9’,即ascii码是9,查ASCII表后发现,十进制数字9对应的是符号HT。。。HT是神马。。。敖!!!HT是TAB啊。。。我真是蠢死了~改代码为find(“\t”)后,成功对数据表进行了处理。。。
对于这个坑,我对我的无知已经无话可说~只能说,活到老学到老,思维要放宽阔。

3.多线程与多进程

每次上多线程与多进程学习的课程,讲师总会俗不可耐地提出如下疑问:多线程与多进程的区别是什么?答对了有小礼品赠送哦~星星眼~原来的我对这个问题答案的理解也只是停留在了概念阶段,比如,最核心的区别,应该就是多线程可以共享同一块内存,而多进程是程序运行实例的多个副本,是独立的,并不共享数据。这种概念性的东西讲起来头头是道,可是真正在实际工作中用起来,却并不那么顺手。
背景如下:我需要从这些数据表文件中,分析每行数据,提取每行数据的uin(类似于用户id之类的字段,约10亿量级),然后统计每个uin出现的次数。原理很简单,就是建一个hash map,然后依次读入每行数据,在每个uin对应的数值累加就可以了。然而不要忘记了这是大数据处理。如果一根筋的用一个线程(进程)依次统计这7252个文件(每个文件约百万行数据),那么估计等我被炒鱿鱼了都还没处理完。。。由于可用的服务器就一台,还是得考虑单机多核。
有了for循环多进程的知识,单纯的我又开始写起了shell脚本,同时开16个进程,每个进程统计约454(7252/16)个文件,然后把得到的结果写到对应的文件中,最后得到的这16个文件结果再合并起来,因为中间肯定有重复的uin。行云流水的写完代码后,脚本欢快地运行了起来,然而没过多久,一些进程就被kill了。。。原来是机器内存使用超过了99%,运维GG再一次出马了。。。
简直欲哭无泪,本来觉得很简单的一项工作实施起来备受阻碍。思考了一下,发现了问题所在:我在程序中开辟了map来做统计,如果开16个进程,相当于在这16个运行实例中都要开map,共有16个map,并且考虑最坏情况,如果我每个进程统计的这454个文件中涵盖了所有的uin,那么我的每个进程都有一份这10亿uin的hash表,16个进程就是16个10亿份。。。系统内存不崩我都要崩了。。再次被自己的智商蠢哭。。。
所以说,为了只维护一份hash表,我应该实现的是多线程,而非多进程。。。这样,我每个线程中统计不同的文件,但所有线程共同维护一份map,统计的结果也只有一份。想通这一点后,开始改程序。linux下实现多线程的最便捷的方法就是pthread,只需如下几步

#include<pthread.h>
#include<unistd.h>

void *thread(void *arg)
{
 //do sth.
 return 0 ;
}

int main()
{
    pthread_t id ;
    int ret = pthread_create(&id, NULL, thread, NULL);
    if(ret) {
        cout << "Create pthread error!" << endl;
        return 1;
    }
    //do sth.
    pthread_join(id, NULL);
    return 0;
}

其中,pthread_join很重要,他会在父进程中一直等到直到子进程结束后才退出,否则,不等子进程执行完,父进程就return了。
这个坑让我意识到,掌握多线程和多进程开发很有必要,而且很多概念应该要学会活学活用,更重要的是,在做事情之前要三思!三思!三思!

最后,贴一些最近用到的很有用的linux系统命令
wc -l a.txt 查看a.txt文档中的行数
查找所有空目录
find ./ -depth -empty -type d -type d为只找目录,不加则找出所有空目录和空文件
find ./ -depth -empty -type d -exec rmdir -v {} \;
统计文件夹下的文件数量
ls -l|grep “^-“|wc -l
统计文件夹下(包括子文件夹)的文件数量
ls -lR|grep “^-“|wc -l
统计文件夹下的文件夹数量
ls -l|grep “^d”|wc -l

df -h 查看挂载的硬盘信息
cat /proc/meminfo 或者 free 查看内存使用情况 或 剩余可用内存

CPU占用最多的前10个进程:
ps auxw|head -1;ps auxw|sort -rn -k3|head -10
内存消耗最多的前10个进程
ps auxw|head -1;ps auxw|sort -rn -k4|head -10
虚拟内存使用最多的前10个进程
ps auxw|head -1;ps auxw|sort -rn -k5|head -10

seq -f %06g 1 10 产生000001 000002 … 000010的数据序列
seq -f %06g 1 2 10 以2为步长,产生000001 000003 000005…000009的数据序列

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux大数据处理踩坑实录 的相关文章

随机推荐

  • 【Apple Studio Display】苹果显示器无法连接Dell 5488

    Apple Studio Display 苹果显示器无法连接Dell 5488 xff08 1 xff09 Dell 5488 could not use the Apple studio display via the type c ca
  • 【macbook air M1】采用Rosetta方式运行,在macbook M1 Air上比macBook Pro M1,速度慢一些的原因?

    My application use rosetta run on macbook air M1 slowly than run on macbook M1 Why xff1f It 39 s possible that you 39 re
  • python serial模块

    安装注意 xff1a 1 easy install 是无法安装 提示找不到serial 2 可以通过exe文件安装 xff0c 不过网上的exe多数是针对win32操作系统的 3 最保险的安装方式 https pypi python org
  • libcurl长连接高并发高性能

    libcurl长连接高并发高性能 自己开发了一个股票智能分析软件 xff0c 功能很强大 xff0c 需要的点击下面的链接获取 xff1a https www cnblogs com bclshuai p 11380657 html 目录
  • 树莓派3B使用mavlink串口连接PIXHAWK_V5

    参考网址 xff1a http ardupilot org dev docs raspberry pi via mavlink html https dev px4 io en robotics dronekit html https do
  • C++ 通过TCP Socket实现简单Http服务器

    实现一个简单的Http服务器 xff0c 基于windows 平台 总共五个文件 HttpServer hpp HttpServer cpp Utils hpp Utils cpp main cpp Utils hpp span class
  • Java并发编程--自旋锁的实现和使用

    1 自旋锁介绍 自旋锁是这样一类锁 xff1a 当线程等待加锁时 xff0c 不会阻塞 xff0c 不会进入等待状态 xff0c 而是保持运行状态 大致的思路是 xff1a 让当前线程不停地的在循环体内执行 xff0c 当循环的条件被其他线
  • [Ubuntu] 可用云盘-尝试记录

    Ubuntu可用云盘 xff1a https github com Aruelius cloud189 说明 xff1a 这是一个调用天翼云API的开源命令行工具 xff0c 基于Python编写 xff1b 天翼云官方没有客户端支持Lin
  • 【无人机】基于遗传算法实现无人机编队位置规划附matlab代码

    1 内容介绍 现代社会的无人机成本造价低 不易损耗 轻巧灵便 易躲藏 能精确打击 目标这些特点 xff0c 使其在一些高危任务中发挥了不可替代的作用 5 无人机的用处主要有两种 xff1a 民用和军事 在民用方面 xff0c 我们可以运用无
  • 【路径规划】基于DWA实现机器人动态避障附matlab代码

    1 内容介绍 DWA 算法是基于机器人运动学与动力学理论的一种局部避障算法 xff0c 它将对机器人的位置控制转换为对机器人的速度控制 DWA 算法可以概括为三步 一是根据机器人自身的限制以及环境制约将速度的采样空间约束在一定范围内 二是根
  • 飞控pixhawk硬件框架

    本文转载于 xff1a https blog csdn net csshuke article details 78952026 xfeff xfeff 1 Phxhawk连接线路 2 Phxhawk硬件芯片列表 处理器 STM32F427
  • PCB_layout_misc

    AD的规则设置参考 https blog csdn net geek monkey article details 80249217 一些PCB厂家的工艺 嘉立创https www jlc com portal vtechnology ht
  • 怎样把经纬度坐标转换为空间直角坐标

    怎样把经纬度坐标转换为空间直角坐标 假设你的空间直角坐标以地球球心为原点 原点到北极为正z轴 原点到经纬度 0 0 为正x轴 那么纬度a 北正南负 经度b 东正西负 的空间直角坐标为 x 61 Rcos a cos b y 61 Rcos
  • APM添加参数

    APM添加参数 参考 https ardupilot org dev docs code overview adding a new parameter html 添加应用参数模块 例如 battery Parameters h k par
  • pixhawk6x/5x 电源插座/插头的型号

    型号 xff1a molex CLIK Mate 5024430670 5024390600
  • intellij idea: git tag操作 及 master branch相互合并操作

    git tag和git branches区别 xff1f tag就像是里程碑标志的一个点 branch是一个新的征程的一条线 tag是静态的 是只读的 不能修改 而branch是要往前走的 稳定版本备份用tag 新功能开发多人用branch
  • C++之STL和Boost

    最近一年我电话面试了数十位 C 43 43 应聘者 xff0c 惯用的暖场问题是 工作中使用过 STL 的哪些组件 xff1f 使用过 Boost 的哪些组件 xff1f 得到的答案大多集中在 vector map 和 shared ptr
  • ubuntu 下安装intel realsense驱动

    在安装之前一定要确保系统是ubuntu 14 04 3 64位 xff01 在安装之前一定要确保系统是ubuntu 14 04 3 64位 xff01 在安装之前一定要确保系统是ubuntu 14 04 3 64位 xff01 重要的事情说
  • windows下安装numpy,scipy遇到的问题总结

    最近开始研究3D手势识别 xff0c 下载的源码包是基于python的 xff0c 需要用到扩展包numpy scipy等 xff0c 安装过程汇总遇到的问题总结如下 xff1a 1 安装numpy 下载numpy编译包 xff0c 进入该
  • Linux大数据处理踩坑实录

    最近开发需要在linux服务器上做大数据处理 xff0c 由于对Linux开发并不是很熟悉 xff0c 因此踩了很多坑 xff0c 先作如下记录 xff1a 1 bash shell实现多进程 背景如下 需要从hadoop的hdfs上向服务