整套大数据学习资料(视频+笔记)百度网盘无门槛下载:http://www.edu360.cn/news/content?id=3377

2. 2.使用Unix工具来分析数据

hadoop 花牛 8℃ 0评论

在这个数据集中,每年全球气温的最高记录是多少?我们先不使用Hadoop来解决这个问题,因为只有提供了性能基准和结果检査工具,才能和Hadoop进行有效对比。

传统处理按行存储数据的工具是awk。范例2-2是一个程序脚本,用于计算每年的最高气温。

范例2-2.该程序从NCDC气象记录中找出每年最高气温

#!/usr/bin/envbash

foryearinall/*

do

echo-ne’basename$year.gz'”\t”

gunzip-c$year|\

awk'{temp=substr($0,88,5)+0;

q=substr($0,93,1);

if(temp!=9999&&q-/[01459]/&&temp>max)max=temp}

END{printmax}’

done

 

 

这个脚本循环遍历按年压缩的数据文件,首先显示年份,然后使用awk处理每一个文件。awk从数据中提取两个字段:气温和质量代码。气温值加0后转换为整数。接着测试气温值是否有效(用9999替代NCDC数据集中的缺失的值),通过质量代码来检测读取的数值是否有疑问或错误。如果数据读取正确,那么该值将与目前读取到的最大气温值进行比较,如果该值比原先的最大值大,就替换目前的最大值。处理完文件中所有的行后,再执行END块中的代码并在屏幕上输出最大气温值。

 

下面是某次运行结果的起始部分:

%./max_temperature.sh

1901 317

1902 244

1903 289

1904 256

1905 283

由于源文件中的气温值被放大10倍,所以1901年的最高气温是31.7oC(20世纪初记录的气温数据比较少,所以这个结果也是可能的)。使用亚马逊的EC2High-CPUExtraLargeInstance运行这个程序,只需要42分钟就可以处理完一个世纪的气象数据,找出最高气温。

为了加快处理速度,我们需要并行处理程序来进行数据分析。从理论上讲,这很简单:我们可以使用计算机上所有可用的硬件线程(hardwarethread)来处理,每个线程负责处理不同年份的数据。但这样做仍然存在一些问题。

首先,将任务划分成大小相同的作业通常并不是一件容易的事情。在我们这个例子中,不同年份数据文件的大小差异很大,所以有一部分线程会比其他线程更早结束运行。即使可以再为它们分配下一个作业,但总的运行时间仍然取决于处理最长文件所需要的时间。另一种更好的方法是将输入数据分成固定大小的块(chunk),然后每块分到各个进程去执行,这样一来,即使有一些进程可以处理更多数据,我们也可以为它们分配更多的数据。

其次,合并各个独立进程的运行结果,可能还需要额外进行处理。在我们的例子中,每年的结果独立于其他年份,所以可能需要把所有结果拼接起来,然后再按年份进行排序。如果使用固定块大小的方法,则需要一种精巧的方法来合并结果。在这个例子中,某年的数据通常被分割成几个块,每个块独立处理。我们最终获得每个块的最高气温,所以最后一步找出最大值作为该年的最高气温,其他年份的数据都像这样处理。

最后,还是得受限于单台计算机的处理能力。即便开足马力,用上所有处理器,至少也得花20分钟,系统无法更快了。另外,某些数据集的增长可能会超出单台计算机的处理能力。一旦开始使用多台计算机,整个大环境中的其他因素就会互相影响,最主要的两个因素是协调性和可靠性。哪个进程负责运行整个作业?我们如何处理失败的进程?

因此,虽然并行处理是可行的,不过实际上也很麻烦。使用Hadoop这样的框架来解决这些问题很有帮助。

转载请注明:全栈大数据 » 2. 2.使用Unix工具来分析数据

喜欢 (0)or分享 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址