我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python海量数据处理之_Hadoop

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python海量数据处理之_Hadoop

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 sys

for 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 sys

current_word = None  # 当前单词
current_count = 0  # 当前单词频数
word = None

for line in sys.stdin:
    words = line.strip() 
    word, count = words.split('\t')  # 按照制表符分隔单词和数量
    
    try:
        count = int(count)  # 将字符串类型的‘1’转换为整型1
    except ValueError:
        continue

    if current_word == word:  # 如果当前的单词等于读入的单词
        current_count += count  # 单词频数加1
    else:
        if current_word:  # 如果当前的单词不为空则打印其单词和频数
            print '%s\t%s' %(current_word, current_count)  
        current_count = count  # 否则将读入的单词赋值给当前单词,且更新频数
        current_word = word

if 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程序中可以看到。也可参见下图:

 Hadoop将三行数据分成三份,mapper.py处理后如第三列所示,排序后变为第四列,它把同样的单词都放在一起了,使得在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加数据库的共享数据为主,更多的时候是被其它上层工具封装后调用。


技术文章定时推送
请关注公众号:算法学习分享

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python海量数据处理之_Hadoop

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python海量数据处理之_Hadoop

1. 说明 前两篇分别介绍了Hadoop的配置方法和基本原理,本篇将介绍如何让程序借助Hadoop调用服务器集群中的算力。Hadoop是Java语言实现的,它不仅支持Java,还支持C++,Python等程序的分布计算。下面以Python为
2023-01-31

MongoDB怎么处理海量数据

要处理海量数据,可以采取以下措施来优化MongoDB的性能:使用合适的索引:在MongoDB中,索引对于查询性能至关重要。确保为经常查询的字段创建索引,以加快查询速度。使用分片:通过分片将数据分布在多个服务器上,可以提高MongoDB的横向
MongoDB怎么处理海量数据
2024-05-07

Java高频面试题之海量数据处理分析

海量信息处理日益成为当前程序员笔试面试中一个新的亮点。硬件扩容是难满足海量数据处理需要的,如何利用现有条件进行海量信息处理?本文就来为大家解答一下
2022-11-13

索引在Oracle中处理海量数据的能力

索引是Oracle数据库中非常重要的性能优化工具,可以加快数据检索速度,特别是在处理海量数据时。以下是索引在Oracle中处理海量数据的能力:加速数据检索:索引可以帮助数据库引擎快速定位需要的数据行,从而加快数据检索速度。在海量数据量时,索
索引在Oracle中处理海量数据的能力
2024-08-14

怎么用python处理大量数据

处理大量数据,可以使用一些Python库和技术来优化效率和提高处理速度。以下是一些常用的方法:1. 使用适当的数据结构:使用适当的数据结构可以提高数据的访问和操作效率。例如,使用NumPy数组可以有效地处理大规模数值数据,使用Pandas数
2023-09-01

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录