首页 > 编程语言 >干货:PHP与大数据开发实践

干货:PHP与大数据开发实践

时间:2023-05-18 16:32:51浏览次数:48  
标签:mapper php set reducer Hadoop 实践 干货 hadoop PHP


大数据是使用工具和技术处理大量和复杂数据集合的术语。能够处理大量数据的技术称为MapReduce。




image


何时使用MapReduce

MapReduce特别适合涉及大量数据的问题。它通过将工作分成更小的块,然后可以被多个系统处理。由于MapReduce将一个问题分片并行工作,与传统系统相比,解决方案会更快。

大概有如下场景会应用到MapReduce:

1 计数和统计
2 整理
3 过滤
4 排序

Apache Hadoop

在本文中,我们将使用Apache Hadoop。

开发MapReduce解决方案,推荐使用Hadoop,它已经是事实上的标准,同时也是开源免费的软件。
另外在Amazon,Google和Microsoft等云提供商租用或搭建Hadoop集群。

还有其他多个优点:

可扩展:可以轻松清加新的处理节点,而无需更改一行代码
成本效益:不需要任何专门和奇特的硬件,因为软件在正常的硬件都运行正常
灵活:无模式。可以处理任何数据结构 ,甚至可以组合多个数据源,而不会有很多问题。
容错:如果有节点出现问题,其它节点可以接收它的工作,整个集群继续处理。

另外,Hadoop容器还是支持一种称为“流”的应用程序,它为用户提供了选择用于开发映射器和还原器脚本语言的自由度。

本文中我们将使用PHP做为主开发语言。

Hadoop安装

Apache Hadoop的安装配置超出了本文范围。您可以根据自己的平台,在线轻松找到很多文章。为了保持简单,我们只讨论大数据相关的事。

映射器(Mapper)

映射器的任务是将输入转换成一系列的键值对。比如在字计数器的情况下,输入是一系列的行。我们按单词将它们分开,把它们变成键值对(如key:word,value:1),看起来像这样:

the 1
water 1
on 1
on 1
water 1
on 1
... 1

然后,这些对然后被发送到reducer以进行下一步骤。

reducer

reducer的任务是检索(排序)对,迭代并转换为所需输出。 在单词计数器的例子中,取单词数(值),并将它们相加得到一个单词(键)及其最终计数。如下:

water 2
the 1
on 3

mapping和reducing的整个过程看起来有点像这样,请看下列之图表:






diagram.jpg



使用PHP做单词计数器

我们将从MapReduce世界的“Hello World”的例子开始,那就是一个简单的单词计数器的实现。 我们将需要一些数据来处理。我们用已经公开的书Moby Dick来做实验。

执行以下命令下载这本书:

wget http://www.gutenberg.org/cache ... 1.txt

在HDFS(Hadoop分布式文件系统)中创建一个工作目录

hadoop dfs -mkdir wordcount

我们的PHP代码从mapper开始

#!/usr/bin/php
<?php
    // iterate through lines
    while($line = fgets(STDIN)){
        // remove leading and trailing
        $line = ltrim($line);
        $line = rtrim($line);

        // split the line in words
        $words = preg_split('/\s/', $line, -1, PREG_SPLIT_NO_EMPTY);
        // iterate through words
        foreach( $words as $key ) {
            // print word (key) to standard output
            // the output will be used in the
            // reduce (reducer.php) step
            // word (key) tab-delimited wordcount (1)
            printf("%s\t%d\n", $key, 1);
        }
    }
?>

下面是 reducer 代码。

#!/usr/bin/php
<?php
    $last_key = NULL;
    $running_total = 0;

    // iterate through lines
    while($line = fgets(STDIN)) {
        // remove leading and trailing
        $line = ltrim($line);
        $line = rtrim($line);
        // split line into key and count
        list($key,$count) = explode("\t", $line);
        // this if else structure works because
        // hadoop sorts the mapper output by it keys
        // before sending it to the reducer
        // if the last key retrieved is the same
        // as the current key that have been received
        if ($last_key === $key) {
            // increase running total of the key
            $running_total += $count;
        } else {
            if ($last_key != NULL)
                // output previous key and its running total
                printf("%s\t%d\n", $last_key, $running_total);
            // reset last key and running total
            // by assigning the new key and its value
            $last_key = $key;
            $running_total = $count;
        }
    }
?>

你可以通过使用某些命令和管道的组合来在本地轻松测试脚本。

head -n1000 pg2701.txt | ./mapper.php | sort | ./reducer.php

我们在Apache Hadoop集群上运行它:

hadoop jar /usr/hadoop/2.5.1/libexec/lib/hadoop-streaming-2.5.1.jar \
 -mapper "./mapper.php"
 -reducer "./reducer.php"
 -input "hello/mobydick.txt"
 -output "hello/result"

输出将存储在文件夹hello / result中,可以通过执行以下命令查看

hdfs dfs -cat hello/result/part-00000

计算年均黄金价格

下一个例子是一个更实际的例子,虽然数据集相对较小,但是相同的逻辑可以很容易地应用于具有数百个数据点的集合上。 我们将尝试计算过去五十年的黄金年平均价格。

我们下载数据集:

wget https://raw.githubusercontent. ... a.csv

在HDFS(Hadoop分布式文件系统)中创建一个工作目录

hadoop dfs -mkdir goldprice

将已下载的数据集复制到HDFS

hadoop dfs -copyFromLocal ./data.csv goldprice/data.csv

我的reducer看起来像这样

#!/usr/bin/php
<?php
    // iterate through lines
    while($line = fgets(STDIN)){
        // remove leading and trailing
        $line = ltrim($line);
        $line = rtrim($line);

        // regular expression to capture year and gold value
        preg_match("/^(.*?)\-(?:.*),(.*)$/", $line, $matches);

        if ($matches) {
            // key: year, value: gold price
            printf("%s\t%.3f\n", $matches[1], $matches[2]);
        }
    }
?>

reducer也略有修改,因为我们需要计算项目数量和平均值。

#!/usr/bin/php
<?php
    $last_key = NULL;
    $running_total = 0;
    $running_average = 0;
    $number_of_items = 0;

    // iterate through lines
    while($line = fgets(STDIN)) {
        // remove leading and trailing
        $line = ltrim($line);
        $line = rtrim($line);

        // split line into key and count
        list($key,$count) = explode("\t", $line);

        // if the last key retrieved is the same
        // as the current key that have been received
        if ($last_key === $key) {
            // increase number of items
            $number_of_items++;
            // increase running total of the key
            $running_total += $count;
            // (re)calculate average for that key
            $running_average = $running_total / $number_of_items;
        } else {
            if ($last_key != NULL)
                // output previous key and its running average
                printf("%s\t%.4f\n", $last_key, $running_average);
            // reset key, running total, running average
            // and number of items
            $last_key = $key;
            $number_of_items = 1;
            $running_total   = $count;
            $running_average = $count;
        }
    }

    if ($last_key != NULL)
        // output previous key and its running average
        printf("%s\t%.3f\n", $last_key, $running_average);
?>

像单词统计样例一样,我们也可以在本地测试

head -n1000 data.csv | ./mapper.php | sort | ./reducer.php

最终在hadoop集群上运行它

hadoop jar /usr/hadoop/2.5.1/libexec/lib/hadoop-streaming-2.5.1.jar \
 -mapper "./mapper.php"
 -reducer "./reducer.php"
 -input "goldprice/data.csv"
 -output "goldprice/result"

查看平均值

hdfs dfs -cat goldprice/result/part-00000

小奖励:生成图表

我们经常会将结果转换成图表。 对于这个演示,我将使用gnuplot,你可以使用其它任何有趣的东西。

首先在本地返回结果:

hdfs dfs -get goldprice/result/part-00000 gold.dat

创建一个gnu plot配置文件(gold.plot)并复制以下内容

# Gnuplot script file for generating gold prices
set terminal png
set output "chart.jpg"
set style data lines
set nokey
set grid
set title "Gold prices"
set xlabel "Year"
set ylabel "Price"
plot "gold.dat"

生成图表:

gnuplot gold.plot

这会生成一个名为chart.jpg的文件。

标签:mapper,php,set,reducer,Hadoop,实践,干货,hadoop,PHP
From: https://blog.51cto.com/dupeng0811/6304773

相关文章

  • web实践
    学了点前端,练个手代码<html><head><title>Web程序设计作业1</title><metacharset="utf-8"><scriptsrc="js/jquery-1.9.1.min.js"type="text/javascript"></script>&......
  • OpenHarmony Docker移植实践
      Docker简介从操作系统诞生之日起,虚拟化技术就不断的演进与发展,结合目前云原生的发展态势,容器无疑是其中的重要一环。Docker是一个开源的软件项目,可以在Linux操作系统上提供一层额外的抽象,让用户程序部署在一个相对隔离的运行环境,并提供自动管理机制。需要额外指出的是......
  • 【实用干货】造价工具箱正式上​线
    一.前言去年跟大家说过,要和大家分享我做的新网站。这不,来了。经过1年的打磨,造价工具箱终于正式上线了,同时这个网站也是我们的企业官网.请大家牢记以下网址:(合象谷管理的拼音首字母)www.hxggl.com二.工具介绍工具分为两部分:工具箱(提供一些实用的在线工具)联络站(提供线下的专业......
  • 【Python】数据分析与可视化实践:收支日统计数据可视化的实现
    Python数据分析与可视化实践:收支日统计数据可视化的实现Author:萌狼蓝天Date:2023-5-7数据读入与基本处理上图是原始数据的一部分,存放于excel中,首先使用pd读入数据。读入数据后,删除不是收入,也不是支出的行。#读取数据datas=pd.read_excel("账单.xlsx",sheet_name=0)#......
  • Spring Cloud开发实践(六): 基于Consul和Spring Cloud 2021.0的演示项目
    目录SpringCloud开发实践(一):简介和根模块SpringCloud开发实践(二):Eureka服务和接口定义SpringCloud开发实践(三):接口实现和下游调用SpringCloud开发实践(四):Docker部署SpringCloud开发实践(五):Consul-服务注册的另一个选择SpringCloud开发实践(六):基......
  • Spring Cloud开发实践(五): Consul - 服务注册的另一个选择
    目录SpringCloud开发实践(一):简介和根模块SpringCloud开发实践(二):Eureka服务和接口定义SpringCloud开发实践(三):接口实现和下游调用SpringCloud开发实践(四):Docker部署SpringCloud开发实践(五):Consul-服务注册的另一个选择关于ConsulHashiCorpConsul......
  • #yyds干货盘点# LeetCode程序员面试金典:相交链表
    1.简述:给你两个单链表的头节点 headA和headB,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回null。图示两个链表在节点c1开始相交:题目数据保证整个链式结构中不存在环。注意,函数返回结果后,链表必须保持其原始结构。自定义评测:评测系统的输入......
  • #yyds干货盘点# LeetCode程序员面试金典:从中序与后序遍历序列构造二叉树
    题目:给定两个整数数组inorder和postorder,其中inorder是二叉树的中序遍历,postorder是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例1:输入:inorder=[9,3,15,20,7],postorder=[9,15,7,20,3]输出:[3,9,20,null,null,15,7]示例2:输入:inorder=[-1],postorder......
  • 29、利用 LNMP 实现phpMyAdmin并利用redis会话保持,用页面管理数据库
    建设第二个网站,利用LNMP实现实现phpMyAdmin并利用redis会话保持,用页面管理数据库在100web1、200web2上创建网站数据存放目录[root@ubunt~]#mkdir/data/php2进入官网https://www.phpmyadmin.net/下载[root@ubuntphp2]#wgethttps://files.phpmyadmin.net/phpMyAdmin/5.......
  • PHP+MySql+jQuery实现的“顶”和“踩”投票功能
    当我们浏览网页时,我们想对网页内容如文章、评论中的观点持赞同或反对意见时,可以通过点击网页中的“顶”和“踩”来进行投票。而整个交互过程,开发者可以通过ajax异步来实现,从而提高用户体验。 本文结合实例,讲解使用PHP+MySql+jQuery实现的“顶”和“踩”投票功能,通过记录用户IP,判断......