Python海量数据处理之_Hadoop(三)程序调用
2017-12-25 18:25
281 查看
1. 说明
前两篇分别介绍了Hadoop的配置方法和基本原理,本篇将介绍如何让程序借助Hadoop调用服务器集群中的算力。Hadoop是Java语言实现的,它不仅支持Java,还支持C++,Python等程序的分布计算。下面以Python为例介绍如何使用Hadoop的MapReduce功能。2. 工作过程
在原理部分介绍过,Hadoop分为两部分,一部分是存储,一部分是运算,而各个部分又可分为主控和局部实现。这里忽略细节,主要说明运算的主控部分是如何运作的。 从程序调用的角度看,程序员首先需要把待处理的文件复制到HDFS文件系统之中,然后调Hadoop提供的java程序执行分布计算,具体需要执行的python代码用参数的形式提供;最后在HDFS生成输出文件,程序员再将其拷回本地即可。 这里的分布计算主要指MapReduce,MapReduce框架将输入数据分割成数据块,传给Mapper,然后Map任务在各个服务器上以完全并行的方式处理,接着MapReduce框架对Map任务的输出进行排序,并将结果做为Reduce任务的输入,最后由Reduce任务输出最终的结果。请注意,在Map和Reduce中有个排序的过程,因为必须完成所有map后才能reduce,这也局限了MapReduce的工作场景。 MapReduce的核心数据是<key,value>键值对,Mapper处理完数据输出的是键值对(如果不输出,则起到了过滤的作用),框架对键值对排序(后面在具体例子中介绍排序的原因),再输出给Reducer继续处理。Mapper的数量由输入文件的大小确定,Reducer的数量由程序员指定.3. HDFS文件系统操作
Hadoop集群中的服务器处理的是HDFS中的数据,因此需要在本地和HDFS之间复制文件,常用命令如下:$ hadoop fs -mkdir /tmp/input # 建立目录 $ hadoop fs -ls /tmp/ # 查看目录中文件 $ hadoop fs -copyFromLocal /tmp/test_items.txt /tmp/input/ # 复制本地文件到HDFS $ hadoop fs -cat /tmp/input/test_items.txt # 查看文件内容 $ hadoop fs -copyToLocal /tmp/input . # 将HDFS中文件夹复制到本地更多命令见:http://hadoop.apache.org/docs/r1.0.4/file_system_shell.html
4. 例程
1) 实现功能
统计文件中单词出现的次数。2) 程序mapper.py
注意将程序设置为可执行权限#!/usr/bin/env python# -*- coding: utf-8 -*-import sysfor line in sys.stdin: # 从标准输入中按行读数据line = line.strip() # 将行尾行首的空格去除words = line.split() #按空格将句子分割成单个单词for word in words:print '%s\t%s' %(word, 1) # 输出键值对,每单词出现1次
3) 程序reducer.py
注意将程序设置为可执行权限#!/usr/bin/env python# -*- coding: utf-8 -*-import syscurrent_word = None # 当前单词current_count = 0 # 当前单词频数word = Nonefor line in sys.stdin:words = line.strip()word, count = words.split('\t') # 按照制表符分隔单词和数量try:count = int(count) # 将字符串类型的‘1’转换为整型1except ValueError:continueif current_word == word: # 如果当前的单词等于读入的单词current_count += count # 单词频数加1else:if current_word: # 如果当前的单词不为空则打印其单词和频数print '%s\t%s' %(current_word, current_count)current_count = count # 否则将读入的单词赋值给当前单词,且更新频数current_word = wordif current_word == word:print '%s\t%s' %(current_word, current_count)
4) 在本地实验
程序在Hadoop上运行前,先在本地运行,以保证其正确性,运行命令:$ echo "Dear Bear River Car Car River Dear Car Bear" | ./mapper.py | sort -k 1,1 | ./reducer.py可以看到命令用管道的方式将map,reduce和数据连接到了一起,中间还有sort命令用于排序,排序原因从reducer.py程序中可以看到。也可参见下图:
5) Hadoop实验
$ hadoop jar /home/hadoop/hadoop/share/hadoop/tools/lib/hadoop-streaming-2.7.5.jar -files ./mapper.py,./reducer.py -mapper ./mapper.py -reducer ./reducer.py -input /tmp/input/*.txt -output /tmp/output/这里py文件被指定了两次,files指定的是上传两个py文件,这里还可以上传配置文件等,后面是分别指定作为mapper和reducer的程序,然后是指定输入输出。非常简单,甚至不需要在python文件中加任何的支持库,只要读写输入输出却可。
5. 应用场景
Hadoop主要是针对海量数据处理的,试想当数据以TB,PB计量的时候,我们不可能用单机一次性打开所有数据。Hadoop方式可用多台便宜PC组合的方式处理海量数据。 看了一些典型的Hadoop应用场景,觉得现在使用Hadoop主要以HDFS加数据库的共享数据为主,更多的时候是被其它上层工具封装后调用。技术文章定时推送请关注公众号:算法学习分享相关文章推荐
- Python海量数据处理之_Hadoop(二)概念和原理
- Python海量数据处理之_Hadoop&Spark
- Python海量数据处理之_Hadoop家族
- 使用python+hadoop-streaming编写hadoop处理程序
- 从Hadoop框架与MapReduce模式中谈海量数据处理(含淘宝技术架构)
- 使用Web程序,调用Bat自动处理文件
- 从Hadoop框架与MapReduce模式中谈海量数据处理(含淘宝技术架构)
- python处理risk_app告警Log小程序
- Python调用(运行)外部程序参数问题
- apue第三版 在信号处理程序中调用不可再入函数 的例子遇到的问题
- Python调用win7系统exe程序
- 如何使用Python为Hadoop编写一个简单的MapReduce程序(这个人T字还有好几篇精华的可以看)
- 程序中,调用Bison和Flex结合的小例子(语法分析中处理数据)
- Linux内核spin_lock 要防止该锁在中断处理程序调用
- Python利用hadoop Streaming编写的Map-Reduce程序命令运行和本地调试运行
- 捕获阶段调用事件处理程序和冒泡阶段调用事件处理程序的区别是什么呢?
- PY++ 自动将你的C++程序接口封装供python调用
- 从Hadoop框架与MapReduce模式中谈海量数据处理(含淘宝技术架构)
- Python调用C++程序的方法详解
- 从Hadoop框架与MapReduce模式中谈海量数据处理(含淘宝技术架构)