4. 使用MapReduce进行数据处理
4.1
关于MapReduce
MapReduce是Google提出的一个软件架构,用于大规模数据集(大于1TB)的并行运算。当前的软件实现是指定一个Map(映射)函数,用来把一组键值对映射成一组新的键值对,指定并发的Reduce(化简)函数,用来保证所有映射的键值对中的每一个共享相同的键组。
4.2分布和可靠性
MapReduce通过把对数据集的大规模操作分发给网络上的每个节点实现可靠性;每个节点会周期性的把完成的工作和状态的更新报告回来。如果一个节点保持沉默超过一个预设的时间间隔,主节点记录下这个节点状态为死亡,并把分配给这个节点的数据发到别的节点。每个操作使用命名文件的不可分割操作以确保不会发生并行线程间的冲突;当文件被改名的时候,系统可能会把他们复制到任务名以外的另一个名字上去。(避免副作用)。
由于MapReduce的分布和可靠性,非常适合运用在Hadoop中进行数据处理。Hadoop发展到现在,已经将MapReduce算法的相关API封装好,可以根据官方文档,使用java编写具体的程序以进行相应的数据处理。
4.3 MapReduce实现倒排索引
假设有一文本文件,其中存放着一批通话理论,分为两列存储,第一列数据是用户A的手机号码,第二列数据是用户B的手机号码,由用户A拨给用户B,实例数据如下:
13599999999 10086
13526548965 120 13533333333 12306 13655555555 10086
13744444444 13562535265 15236589999 13562535265 08546860451 120 08546867256 12306 13965486666 120
现在需要对这批数据进行处理,实现一个倒排索引,记录拨打给某一用户B的所有用户A。参考官方文档,Map()函数如下实现:
public static class Map extends Mapper
public void map(LongWritable key,Text value,Context context) }
throws IOException,InterruptedException{
String line=value.toString();//read source line try{ }
catch(java.lang.ArrayIndexOutOfBoundsException e){ }
context.getCounter(Counter.LINESKIP).increment(1); return;
String[] lineSplit = line.split(\String nums0 = lineSplit[1]; String nums1 = lineSplit[0];
context.write(new Text(nums0), new Text(nums1));
}
Map()函数使用java.string中的split()函数进行数据切割,每行切割后的两个数据分别存入nums0和nums1,这样Map()所做的工作完成,后面的context.write只不过是设定一定的格式,将nums0和nums1传到下一步,接下来进行的Reduce() 函数。
Reduce()函数接受到数据后,将对拆分好的数据进行输出前的处理,我们将在这里设定输出的样式,具体代码如下:
public static class Reduce extends Reducer
public void reduce(Text key,Iterable
context)
}
这个MapReduce就这样完成了,这也是整个程序的核心,将程序完善后,可以得到如下数据:
}
throws IOException,InterruptedException{
String valuestring; String out=\
for(Text value:values){ }
context.write(key, new Text(out));
valuestring=value.toString(); out += valuestring+\
可以看到已经成功得到了倒排索引的结果,虽然这一程序可以不用MapReduce实现,因为数据量足够小,不过若是在大数据处理方面,使用代码直接处理与MapReduce处理的性能相差甚远。
4.4 Hadoop
的总结
根据上面对于Hadoop的介绍,以及Hadoop中使用MapReduce进行数据处理的实例,我们说搭建出来的这一数据存储和数据处理有着分布式、容错性和可靠性等优点,适用于实验数据存储、处理和管理平台。
至此,基于分布式存储的实验数据采集和管理系统的基本框架已经搭建完成,也进行了一定的数据处理测试,大体让人满意。
5. 关于openstack
5.1 使用
openstack
虽然Hadoop在数据存储和处理方面已经足够优秀,通过上面的分析也知道能够满足要求,但是数据的采集方面仍然没有更好的进行优化,还是使用传统的输入,所以使用openstack这一云端计算服务,方便数据的存储、离线和本地化。而且,也可以基于openstack拓展更多的功能。
5.2 openstack
架构
OpenStack提供了一个部署云的操作平台或工具集。旗下包含了一组由社区维护的开源项目,他们分别是OpenStackCompute(Nova),
OpenStackObjectStorage(Swift),以及OpenStackImageService(Glance)。
三个项目的基本关系如下图:
解读一下图示内容:Openstack隔离用户层和供应商,中间通过镜像Image来连接,即供应商提供镜像,其中包含着相应的服务交由用户层使用,同时还向开发人员暴露API,可以方便进行更多的功能拓展。
5.3 openstack的安装
Openstack发展到如今已经有了很大的改变,不过它的安装还是比较复杂的,要想了解openstack安装的相关信息以保障有步骤、有保障的安装,需要了解本地openstack所必须的三个节点ComputeNode、NetworkNode以及ControllerNode之间的关系。
官方给出如下架构图,很容易理解三个节点之间是怎样通信的:
如图,ComputeNode有着两块网卡eth0和eth1,NetworkNode有着三块,分别是eth0、eth1和eth2,而ControllerNode也是两块网卡eth0和eth1。
和图片所示一样的,ComputeNode、ControllerNode和NetworkNode之间靠着eth0通信,负责管理整个网络;而ComputeNode和NetworkNode之间靠eth1通信,进行网络认证;最后ControllerNode的eth1以及NetworkNode的eth2分别提供外网访问服务以及AIP暴露服务,由此可以大概的认识到openstack整个本地架构的基本信息。
而具体的安装步骤,参见官网手册和网络资源,耐心的进行搭建。