Hadoop 의 MapReduce 프로그램 을 PHP 로 작성 합 니 다.

4517 단어 mapreduce
Hadoop 흐름
Hadoop 은 자바 로 작성 되 었 지만 Hadoop 은 Hadoop 흐름 을 제공 합 니 다.Hadoop 흐름 은 API 를 제공 하여 사용자 가 모든 언어 로 map 함수 와 reduce 함 수 를 작성 할 수 있 도록 합 니 다.Hadoop 흐름 의 관건 은 UNIX 표준 흐름 을 프로그램 과 Hadoop 사이 의 인터페이스 로 사용 하 는 것 입 니 다.따라서 모든 프로그램 이 표준 입력 흐름 에서 데 이 터 를 읽 을 수 있 고 데 이 터 를 표준 출력 흐름 에 기록 할 수 있다 면 Hadoop 흐름 을 통 해 MapReduce 프로그램의 map 함수 와 reduce 함 수 를 모든 언어 로 작성 할 수 있 습 니 다.예 를 들 어 bin/hadop jar contrib/streaming/hadop-streaming-0.20.203.0.jar-mapper/usr/local/hadop/mapper.php-reducer/usr/local/hadop/reducer.php-input test/*-output out 4 Hadoop 흐름 이 도입 한 가방:hadop-streaming-0.20.20.20.203.0.jar,Hadoop 루트 디 렉 터 리 에 hadop-streaming.jar 가 없습니다.streaming 은 contrib 이기 때문에 contrib 아래 에서 찾 아야 합 니 다.hadop-0.20.2 를 예 로 들 면 여기 있 습 니 다:-input:hdfs 파일 을 입력 하 는 경 로 를 가리 키 는-output:hdfs 파일 을 출력 하 는 경 로 를 가리 키 는-mapper:map 함수-reducer:reduce 함 수 를 가리 키 는
mapper 함수
mapper.php 파일 은 다음 코드 를 기록 합 니 다.
#!/usr/local/php/bin/php
<?php
$word2count = array();
// input comes from STDIN (standard input)
// You can this code :$stdin = fopen(“php://stdin”, “r”);
while (($line = fgets(STDIN)) !== false) {
    // remove leading and trailing whitespace and lowercase
    $line = strtolower(trim($line));
    // split the line into words while removing any empty string
    $words = preg_split('/\W/', $line, 0, PREG_SPLIT_NO_EMPTY);
    // increase counters
    foreach ($words as $word) {
        $word2count[$word] += 1;
    }
}
// write the results to STDOUT (standard output)
// what we output here will be the input for the
// Reduce step, i.e. the input for reducer.py
foreach ($word2count as $word => $count) {
    // tab-delimited
    echo $word, chr(9), $count, PHP_EOL;
}
?>

이 코드 의 대체적인 뜻 은 입력 한 줄 마다 텍스트 의 단 어 를 찾 아서
             hello    1
             world  1″
이런 형식 으로 출력 하 다.
이전에 쓴 PHP 와 거의 다 르 지 않 습 니 다.그 렇 죠?조금 낯 설 게 느껴 질 수도 있 습 니 다.두 가지 가 있 습 니 다.
실행 가능 한 프로그램 으로 PHP
첫 줄 의
4
#!/usr/local/php/bin/php
Liux 에 게\#!/usr/local/phop/bin/phop 이 프로그램 은 다음 코드 의 해석 기로 사 용 됩 니 다.Liux 셸 을 쓴 사람 은 이런 쓰기 에 익숙 할 것 입 니 다.모든 셸 스 크 립 트 의 첫 줄 은 이 렇 습 니 다.\#!/bin/bash, #!/usr/bin/python
이 줄 이 있 으 면 이 파일 을 저장 한 후에 이렇게 mapper.php 를 cat,grep 와 같은 명령 으로 실행 할 수 있 습 니 다.
stdin 으로 입력 받 기
PHP 는 다양한 인자 가 들 어 오 는 방법 을 지원 합 니 다.여러분 이 가장 잘 아 는 것 은$GET, $_POST 초 전역 변수 에서 웹 을 통 해 전달 되 는 인 자 를 가 져 옵 니 다.그 다음은$입 니 다.SERVER[argv]에서 명령 행 을 통 해 들 어 오 는 인 자 를 가 져 옵 니 다.여 기 는 표준 입력 stdin 을 사용 합 니 다.
그것 의 사용 효 과 는:
링크 ux 콘 솔 에.../mapper.php 를 입력 하 십시오.
mapper.php 가 실행 되 고 콘 솔 이 사용자 키보드 입력 을 기다 리 는 상태 로 들 어 갑 니 다.
사용자 가 키 보드 를 통 해 텍스트 를 입력 하 다
사용자 가 Ctrl+D 를 누 르 면 입력 을 종료 합 니 다.mapper.php 는 실제 업무 논 리 를 실행 하고 결 과 를 출력 합 니 다.
그럼 stdout 어디 있어 요?print 자체 가 stdout 입 니 다.우리 가 예전 에 웹 프로그램 을 썼 던 것 과 CLI 스 크 립 트 는 다 르 지 않 습 니 다.
reducer 함수
reducer.php 파일 을 만 들 고 다음 코드 를 기록 합 니 다.
#!/usr/local/php/bin/php
<?php
$word2count = array();
// input comes from STDIN
while (($line = fgets(STDIN)) !== false) {
    // remove leading and trailing whitespace
    $line = trim($line);
    // parse the input we got from mapper.php
    list($word, $count) = explode(chr(9), $line);
    // convert count (currently a string) to int
    $count = intval($count);
    // sum counts
    if ($count > 0) $word2count[$word] += $count;
}
// sort the words lexigraphically
//
// this set is NOT required, we just do it so that our
// final output will look more like the official Hadoop
// word count examples
ksort($word2count);
// write the results to STDOUT (standard output)
foreach ($word2count as $word => $count) {
    echo $word, chr(9), $count, PHP_EOL;
}
?>

이 코드 의 대 의 는 단어 마다 얼마나 많은 횟수 가 나 타 났 는 지 통계 하고
hello   2
world  1″
이런 식 으로 출력.
Hadoop 으로 가 겠 습 니 다.
파일 을 Hadoop 의 DFS 에 넣 기:
phop 프로그램 을 실행 하여 이 텍스트 를 처리 합 니 다(
PHP mapreduce 프로그램 을 Streaming 방식 으로 실행 합 니 다:)
bin/hadoop jar contrib/streaming/hadoop-streaming-0.20.203.0.jar -mapper /usr/local/hadoop/mapper.php -reducer /usr/local/hadoop/reducer.php -input test/* -output out
주의:
1)input 와 output 디 렉 터 리 는 hdfs 의 경로 입 니 다.
2)mapper 와 reducer 는 로 컬 기기 의 경로 입 니 다.절대 경 로 를 써 야 합 니 다.상대 경 로 를 쓰 지 마 십시오.그때 hadop 에서 mapreduce 프로그램 을 찾 을 수 없다 고 잘못 말 하지 않도록 해 야 합 니 다.
3)mapper.php 와 reducer.php 는 모든 DataNode 서버 의 같은 경로 로 복사 해 야 합 니 다.모든 서버 에 php 가 설치 되 어 있 고 설치 경로 가 같 습 니 다.
결과 보기
bin/hadoop d fs -cat /tmp/out/part-00000

좋은 웹페이지 즐겨찾기