最近跟着晓宁哥学到了不少东西,今天有空就总结一下吧。
一 .Linux 的一些命令:
1.nohup 命令的使用:
①这个命令我主要用来执行后台任务,使用方法很简单:
nohup 命令 &
就可以将命令后台执行了。
②另外上述的命令只会将命令的输出重定向到当前目录的nohup.out文件里,要想将命令的输出重定向到指定的文件就得用一下的命令了:
nohup 命令 >文件 2>&1 &
附:nohup命令参考
nohup 命令
用途:不挂断地运行命令。
语法:nohup Command [ Arg … ] [ & ]
描述:nohup 命令运行由 Command 参数和任何相关的 Arg 参数指定的命令,忽略所有挂断(SIGHUP)信号。在注销后使用 nohup 命令运行后台中的程序。要运行后台中的 nohup 命令,添加 & ( 表示”and”的符号)到命令的尾部。
无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。如果没有文件能创建或打开以用于追加,那么 Command 参数指定的命令不可调用。如果标准错误是一个终端,那么把指定的命令写给标准错误的所有输出作为标准输出重定向到相同的文件描述符。
退出状态:该命令返回下列出口值:
126 可以查找但不能调用 Command 参数指定的命令。
127 nohup 命令发生错误或不能查找由 Command 参数指定的命令。
否则,nohup 命令的退出状态是 Command 参数指定命令的退出状态。
nohup命令及其输出文件
nohup命令:如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令。该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。nohup就是不挂起的意思( n ohang up)。
该命令的一般形式为:nohup command &
使用nohup命令提交作业
如果使用nohup命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中,除非另外指定了输出文件:
nohup command > myout.file 2>&1 &
在上面的例子中,输出被重定向到myout.file文件中。
使用 jobs 查看任务。
使用 fg %n 关闭。
这条简单的命令算是我最近使用最频繁的,因为写的数据解析入库的四个大程序、调用程序和监控程序都是后台运行的,还得将输出流重定向到指定的log里,这些频繁的操作让我记住了这实用命令。
2.tail 命令的使用
其实以前也用过类似的命令用来查看文件比如 cat,但是这个命令看来比cat更加强大,他有很多参数,所以应用的场合也就更广泛。最近我用到的只是动态的查看程序的输出重定向文件,也就是tail -f file ,后来查了一下他的全部使用参数:
-f 循环读取
-q 不显示处理信息
-v 显示详细的处理信息
-c<数目> 显示的字节数
-n<行数> 显示行数
--pid=PID 与-f合用,表示在进程ID,PID死掉之后结束.
-q, --quiet, --silent 从不输出给出文件名的首部
-s, --sleep-interval=S 与-f合用,表示在每次反复的间隔休眠S秒
3.scp 命令的使用
以前听土豪说过这个命令,因为后来没用过就没有后话了。最近几天想把服务器上的代码都拷贝回来做个备份,所以就差了一下这个命令。
scp主要适用于服务器和服务器之间的文件拷贝工作。使用如下:
命令基本格式:
scp [可选参数] file_source file_target
scp 本地用户名 @IP 地址 : 文件名 1 远程用户名 @IP 地址 : 文件名 2
[ 本地用户名 @IP 地址 :] 可以不输入 , 可能需要输入远程用户名所对应的密码 .
可能有用的几个参数 :
-v 和大多数 linux 命令中的 -v 意思一样 , 用来显示进度 . 可以用来查看连接 , 认证 , 或是配置错误 .
-C 使能压缩选项 .
-P 选择端口 . 注意 -p 已经被 rcp 使用 .
-4 强行使用 IPV4 地址 .
-6 强行使用 IPV6 地址 .
4.grep 命令的使用
说起grep,其实以前也用过,但是没有深入的查一下它更强大的使用规则。因为在监控脚本中要通过不停地cat后台程序的log文件并且要在log中查找一些错误或警告信息,所以就深入的学习了一下这个命令的使用:
grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。
主要参数
[options]主要参数:
-c:只输出匹配行的计数。
-I:不区分大 小写(只适用于单字符)。
-h:查询多文件时不显示文件名。
-l:查询多文件时只输出包含匹配字符的文件名。
-n:显示匹配行及 行号。
-s:不显示不存在或无匹配文本的错误信息。
-v:显示不包含匹配文本的所有行。
pattern正则表达式主要参数:
\: 忽略正则表达式中特殊字符的原有含义。
^:匹配正则表达式的开始行。
$: 匹配正则表达式的结束行。
\<:从匹配正则表达 式的行开始。
\>:到匹配正则表达式的行结束。
[ ]:单个字符,如[A]即A符合要求 。
[ - ]:范围,如[A-Z],即A、B、C一直到Z都符合要求 。
。:所有的单个字符。
* :有字符,长度可以为0。
其实grep相当强大,但是我也是用到一小部分,比如:
grep -v char 忽略char
grep -E 'ch1 | cha2' 查找出ch1和ch2所在的行
或者是将两者组合满足更多的查找条件。
5.awk 命令的使用
这又是一个相当强大的命令,以前并没有接触过,百度了一下也看不懂也多东西。记录一下我自己用过的部分吧:
ps -fe |grep python |grep -v grep |awk '{print $2}' | xargs kill
这个命令是将所有的python的程序全部杀掉。
而awk是用来输出整个进程那个一行中的pid 。
6. echo 1 > /proc/sys/vm/drop_caches
这是一个极具杀伤力的命令,当主机的内存资源消耗殆尽时,尤其是因为java虚拟机没有正常回收资源时,这个命令会强制回收内存让主机重新充满动力!
7.wc 命令的使用
第一次接触到这个命令,确实比较实用。wc(Word Count)命令的功能为统计指定文件中的字节数、字数、行数,并将统计结果显示输出。以下是参数说明:
-c 统计字节数。
-l 统计行数。
-m 统计字符数。这个标志不能与 -c 标志一起使用。
-w 统计字数。一个字被定义为由空白、跳格或换行字符分隔的字符串。
-L 打印最长行的长度。
-help 显示帮助信息
--version 显示版本信息
二.Python的一些库的使用
1.time
①记得以前在SPSI写的一个拨号脚本的时候,需要检查开机时间,顺便看了一下这个库当时就给我看蒙逼了(因为当时水平太菜)。到了后来写网站的时候知道了什么是时间戳,但是始终没在python中用过时间的格式化输出。来到bupt看到的第一个脚本给我留下最深印象的就是这几段代码:
![](https://i-blog.csdnimg.cn/blog_migrate/7d10858c1b6f741f9068ae7d4eb876db.png)
感觉好神奇,哈哈哈。。。mark一下吧
就是这个:
c_time = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(time.time()))
dirDate = time.strftime("%Y-%m-%d",time.localtime(time.time()))
dirTime = time.strftime("%H",time.localtime(time.time()))
②还有一个常用的是睡眠函数time.sleep() ,接的参数是秒也就是执行这句话以后程序休眠多少秒。
2.pxssh
这个是个是以后经常用到的库,用于程序ssh登陆服务器执行一些操作。用这个库
首先要创建一个ssh对象:s = pxssh.pxssh() ,参数可以是指定的服务名也可为空。
它有如下几个常用函数:
login(hostname, username, password,login_timeout=30):登陆
sendline(cmd)发送命令行命令
prompt(timeout=3):执行相应操作
before():来获取执行命令的返回值
logout():注销
三.spark的学习
其实经过多番改造过的代码在单机上已经可以满足每小时一次的数据更新频率了,但是考虑到以后的更新频率可能会提高所以还是要将代码部署到集群上来提高执行效率。所以首先第一件事就是要搭建服务器集群。
1.搭建spark服务器集群
①安装 anaconda2(直接拷贝)
②更新 /root/.bashrc
③安装hadoop
④安装spark
⑤更新hosts
⑥更新/root/.ssh/id_dsa.pub (其实就是设置一下master到worker的ssh免密登陆)
⑦安装配置jdk
至此,集群的worker节点已经配置完毕了。一下测试一下是否正常工作:
①在 master 运行
hdfs namenode -format
cd **/hadoop-2.6.2/sbin
./start-dfs.sh
下图表示hadoop和hdfs运行起来了。
![](https://i-blog.csdnimg.cn/blog_migrate/1e70f4d2d3e83ad5b5c038e38dad24f4.png)
②在 master 运行
cd **/spark-1.6.0-bin-hadoop2.6/sbin
./start.all.sh
下图表示spark集群已经正常运行了。
![](https://i-blog.csdnimg.cn/blog_migrate/dc02b6ded439f0196fcb4fbfa35da4f6.png)
③在 master 运行
hadoop fs -mkdir /ssymmetry/
测试hadoop是否可用并创建目录 /ssymmetry/ 。
![](https://i-blog.csdnimg.cn/blog_migrate/f9ff5352d32fe1e7bcc8f65ddad26777.png)
④向hdfs 传文件
hadoop fs -put /home/**/*.bz2 /ssymmetry/2016-08-02
测试可用:
![](https://i-blog.csdnimg.cn/blog_migrate/ca79ff2bf5e7f020985e07ec69fbd35e.png)
⑤在代码中测试集群从hdfs加载数据,即将文件路径的
file:/// 改成 hdfs:///
![](https://i-blog.csdnimg.cn/blog_migrate/705adaf4abf5a30083140547c4fa873c.png)
分布式读取应该比 nfs集中读取要快很多,尤其是在读取大文件的时候优势比较明显。
⑥在集群上运行自己的spark程序:
spark-submit --master spark://10.33.128.16:7077 --deploy-mode client --executor-memory 8G --driver-memory 8G --executor-cores 8 --verbose super.py
当然这些性能参数是可以根据任务的资源需求进行调节的。
2.使用spark的map、reduce函数来用集群进行分布式计算
其实一开始学长说用map、reduce的时候我是比较蒙逼的,毕竟以前没有接触过分布式相关的东西。然后就查了相关的资料,就目前而言我用到的都比较简单,其实主要是因为spark都已经给做好了,根本不需要关心具体的任务分配,结果回收等等具体细节。所以整个过程就变得非常简单了:
conf = SparkConf().setAppName("The user visitor analysis app")
sc = SparkContext(conf = conf)
sqlContext = SQLContext(sc)
因为我主要是用来加载json数据和解析的工作,所以先来创建一个SparkContext 对象。
path = 'hdfs:///home/***/*.json'
jsonFile=sqlContext.read.json(path)
jsonFile.printSchema()
jsonFile.registerTempTable("people")
用spark从hdfs中读取全部的json文件,然后注册成一个临时表用来以后做查询数据。
sqlContext.sql("select CPU.*,operationSystem.load.ip from people where operationSystem.load.ip != 'None'").map(function)
用类似sql语句来操作这些json内容然后将这些内容做为map函数的输入来分布式的计算。
t = teen.collect()
用来提取出所有的数据项。
3.尝试使用HDFS(
Hadoop Distributed File System)
尝试使用了以下命令:
hadoop fs -put sourcePath targetPath 把数据上传到hdfs
hadoop fs -ls / 查看
hadoop fs -mkdir 在hdfs创建目录
hadoop fs -cat /* 看 hdfs文件内容
好嘞,就写这么多吧。
现在spark就只用了他的分布式文件系统、还有分布式计算。后续还要学习它提供的机器学习框架Milib,matplotlib和numpy。
愿接下来的学习一切顺利!