Hadoop+hive+flask+echarts大数据可视化项目(一)
--------------系统数据收集----------------
? ? ? ?谈到大数据的项目,一般以数据可视化为主体,收集大数据中的有用信息,存储到分布式存储系统hadoop中,由hive导入hadoop中存储的数据,使用HQL语句对数据进行分析,hive底层会将HQL语句转化成mapreduce程序,flask作为python语言的后台技术,可以连接hive将HQL语句的分析结果返回前台,前台使用ajax技术获取数据后使用echarts组件图形显示分析结果。
? ? 其对应的架构图如下。
? ? ? ?从图中可知,数据来源可能是网络爬取获得,可能是收集的系统数据,也可能是业务来源的数据,还有可能是前端页面的埋点数据,比如百度图库中搜索出某个主题图片,查看其源码中有“埋点”的字样。如下图所示。
? ? ? 获取数据后,可能是大批量的数据,可能达到PB的级别,可以使用Hadoop平台进行存储,Hadoop分布式存储系统的特点是一次写入,可以多次读出。读出数据后可以使用mapreduce分布式计算进行清洗提纯,接下来对清洗提纯后的数据导入到hive数据仓库中,使用HQL语句对hive数据仓库中的数据进行分析,而hive的元数据信息存储在mysql中,所以在整个架构体系中还是需要mysql的角色存在。HQL语句的分析结果数据会返回到flask的后端接口中,flask是Python语言的后台管理程序,可以提供前端需要的界面和接口。前端通过ajax技术获取了后端接口的数据后,就可以调用echarts框架对获取的数据进行展示。
? ? ? 这里从项目的数据采集说起,先从项目的系统数据收集入手。
一、项目的系统数据来源
项目的系统数据是从linux服务器中CPU/内存/硬盘等参数来整体描述服务器系统的性能。一段时间内的CPU使用情况和增长率也说明了服务器的性能体现,一段时间内的硬盘增长率也可以为服务器的存储性能提出警示,一段时间内的内存使用情况也说明了服务器是否达到了工作的强度负荷。
一般情况下,我们获取系统的相关参数都是通过linux命令实现的,如查看服务器的ip地址可以使用ifconfig来查看,如下图所示。
?
? ? ? 由图中可知, ifconfig的命令输出有很多的信息,在这些信息中,对我们有用的可能就是ip地址,其他的信息并不符合本次查询的目的。这些信息存储在hadoop平台中后,使用mapreduce来对这些信息进行分析,根据mapreduce的原理是使用行读取器取出信息中的每一行,然后不断地获取每一行的信息进行分析,如果只获取ip地址的信息,你就会发现很多行的数据都是无用的,但是mapreduce的原理就是行读取器,没有用的信息行也是要进行读取的,遇到ip地址的信息行才会输出。Linux中很多的系统参数都是需要命令去提取的,并且提取的信息也含有大量的无用信息。这就降低了mapreduce的工作效率,能够把查询linux系统命令输出参数中有用的信息进行综合统计也就成为了一种必然。
? ? ? ?如何从ifconfig中输出ip地址的信息。就需要使用linux中的一个利器awk。
二、awk工具的介绍
? ? ? ?awk 是一种处理文本文件的语言,是一个强大的文本分析工具。
? ? ? ?它是基于模式匹配检查输入文本,逐行处理并输出。通常用在shell脚本中,获取指定的数据。单独使用时,可对文本数据做统计。
? ? ? ?一般的使用方法如下:
前置命令?|?awk? [选项]? '[条件]{指令}'
? ? ? 前置命令后面跟上管道,管道一般会前置指令的输入一行一行交由后面的awk来处理,这个从道理上与mapreduce的道理是一致的。传入到awk后,awk可以配合命令去输出相关的参数信息,也就实现了linux系统中有用参数信息的提取。
? ? ?如下面的案例。
? ? ? ?echo “hello world” 是在控制台中输出”hello world”语句,也是程序员学习语言的必修课之一。
? ? ? ?现在使用echo “hello world”结合管道,再使用awk配合print命令语句输入第一个参数。命令如下。
echo "hello world"|awk '{print $1}'
? ? ? ?其实现的功能是打印echo输出的第一个参数。
? ? ? 具体命令的解释如下图所示。
? ? ?从图中可以看出输入结果是hello,也是”hello world”的第一个参数。
? ? ?如果打印第二个参数,可以使用如下命令。
? ? ? 按照awk的使用方法提取系统的有用信息。
三、awk提取ip地址的信息
? ? ? 在ifconfig中信息输出中有ip地址的信息,只留取ip。
? ? ?首先利用管道把ifconfig输出到下一个参数。把ifconfig的输出信息使用管道一行一行做过滤,grep作为linux的查询可以做过滤。
? ? ?第一步命令如下。
ifconfig | grep "inet"
? ? ?命令的具体解释如下。
? ? ?如果打印第二个参数,可以使用如下命令。
?
? ? ? ?现在得到一个只有inet信息的行数据,把当前获取的行数据信息再进行过滤,根据最终结果是只要ip地址,那么ipv6的地址不需要,把inet6地址过滤掉。grep 查询参数中-v参数可以把包含的信息过滤掉。命令中的管道实现前面输出结果的过滤。
? ? ? ?第二步命令如下。
ifconfig | grep "inet" | grep -v "inet6"
? ? ? 命令的具体解释如下。
?
? ? ? ? 根据输出信息,127.0.0.1是每台电脑的环回口地址,这个地址可以过滤掉,过滤掉跟前面的命令一样,grep -v “127.0.0.1”实现127.0.0.1的过滤,把前面输出的内容用管道连接,连接后做为后面的命令参数。
? ? ? 第三步的命令如下。
ifconfig | grep "inet" | grep -v "inet6" | grep -v "127.0.0.1"
? ? ?命令的具体解释如下。
? ? ?现在结果只有一行数据,想到echo “hello world”|awk ‘{print $2}”,
? ? ? 这个命令在一行输出中,只取其中的第几个参数。这里是第2个,所以是$。
? ? ? 第四步的命令如下 。
ifconfig | grep "inet" | grep -v "inet6" | grep -v "127.0.0.1"| awk '{print $2}'
? ? ? 命令的具体解释如下。
?
? ? ? ?从图中输出可以,这样可以得到ip地址的信息。
四、awk提取mac地址
? ? ?mac地址在ifconfig中,ifconfig的结果一行一行利用通道传送到下一个命令中。grep接收一行一行信息,过滤包含ether的信息行。
命令如下。
ifconfig | grep "ether"
? ? ?命令的解释如下。
? ? ?因为结果只有一行,通过awk,取的第二个参数,就获得结果。
? ? ?命令如下。
ifconfig | grep "ether" | awk '{print $2}'
? ? ? 命令的解释如下。
? ? ? 这样,mac地址就获取成功了。
五、awk获取计算机的名字
? ? ? 获取计算机的名字比较容易,直接hostname就可以得到结果。
? ? ??
六、awk获取计算机的用户
? ? ?计算机的用户在linux系统中可以使用who am i来输出结果。当使用who am i后输出的用户名显示在第一个参数中,命令如下。
who am i | awk '{print $1}'
? ? ? 命令的解释如下。
七、awk获取硬盘的使用情况
? ? ? 在linux系统中可以使用df输出硬盘的使用情况,具体解释如下。
? ? ? ? 在df输出中,可以看到硬盘的百分比参数,通过以空格分隔的参数查询,可以得知百分比是属于第5个参数,现在使用管道来输出第5个参数,命令解释如下。
? ? ? ?在输出的第5个参数百分比中,100%是光盘,需要把光盘(/dev/sr0)去掉,使用grep的过滤功能,只保留硬盘的相关数据,同时还要过滤掉%Use的数据,只保留硬盘的百分比数据。其命令的解释如下。
? ? ? 之后取出所有的第5个参数,这些百分比参数之和就是最终的硬盘使用百分比结果。命令如下图的解释。
? ? ?综上所述,硬盘使用的百分比结果awk使用命令如下。
df | grep -v "/dev/sr0" | grep -v "Use%" | awk '{ a+=$5 } END { print a }'
八、awk取CPU的使用情况
? ? ? 在linux中,输入top后,就可以实现CPU/内存/进程等相关信息的展示,不过,数据一直在变化,变化的原因cpu一直在活动。数据一直在分页。如果显示单页的信息,可以使用top -n 1来指示取出top动态信息中的一个信息。
top -n 1
只取linux中cpu显示的一页数据,一页数据就不变化。
? ? ? 对CPU输出的参数中,重点参数解释如下。
?
? ? ?现在的需求是在top -n 1 中把%Cpu(s)过滤出来。结合grep来使用,然后打印空格分隔的参数个数。如下图所示。
? ? ? 这样,取CPU输出的第一个参数用户使用率的命令如下。
top -n 1 | grep "%Cpu(s)" |awk '{print $2}'
? ? ? 如下图命令使用后得出的结果。
? ? ?取CPU输出的第二个参数系统使用率的命令如下。
top -n 1 | grep "%Cpu(s)" |awk '{print $4}'
? ? ? 如下图命令使用后得出的结果。
? ? ? 取CPU输出的第四个参数空闲使用率的命令如下。
top -n 1 | grep "%Cpu(s)" |awk '{print $8}'
? ? ? ?如下图命令使用后得出的结果。
九、使用awk取内存的使用情况
? ? ? ? Linux系统中使用top指令也可以输出内存的使用情况,只不过在输出的内存信息中存在“SWAP”交换分区的信息。如下图所示。
? ? ? ? 这里可以通过输出得知,总内存标记是total,空闲内存标记是free,通过空格分隔的参数个数得知,总内存的参数是$4,空闲内存是$6。
? ? ? ?这样,取出linux中的总内存数命令如下。
top -n 1|grep "Mem" |grep -v "Swap"|awk '{print $4}'
? ? ? ?使用命令的具体输出如下。
取出linux中空闲内存命令如下。
top -n 1|grep "Mem" |grep -v "Swap"|awk '{print $6}'
使用命令的具体输出如下。
?
关注博客,后续会提及大数据可视化数据采集及脚本的合并。
|