Practice make perfect

hadoop学习笔记1

hadoop学习笔记1

简介

官网简介

Apache Hadoop 是一个框架,该框架允许使用简单的编程模型跨计算机集群对大型数据集进行分布式处理。它旨在从单个服务器扩展到数千台机器,每台机器都提供本地计算和存储。库本身的设计目的是在应用层检测和处理故障,而不是依赖硬件来提供高可用性。每台计算机都容易出现故障,但在计算机集群之上提供高可用性服务。

了解更多»

为分布式计算提供解决方案,Hdoop核心 = HDFS(分布式文件系统) + Map Reduce(分布式计算系统)+YARN(资源管理系统)

HDFS 提供了高可靠性(主要通过多副本来实现)、高扩展性(通过添加机器来达到线性扩展)和高吞吐率的数据存储服务。

Map Reduce是一个编程模型,用以进行大数据量的计算。将计算节点和存储节点部署在相同的节点之上,移动计算而不是移动数据。

YARN 是一个通用资源管理系统,可为运行在YARN之上的分布式应用程序提供统一的资源管理和调度。

  • 狭义的Hadoop:是一个适合大数据分布式存储和分布式计算的平台,包括HDFS、Map Reduce和YARN。
  • 广义的Hadoop:指以Hadoop为基础的生态圈,是一个很庞大的体系,Hadoop只是其中最重要、最基础的一部分;生态圈中的每个子系统只负责解决某一个特定的问题域(甚至可能更窄),它并不是一个全能系统,而是多个小而精的系统。

// todo hadoop 生态圈

单节点群集(伪分布式)

参考链接

编写wordcount

代码编写

map.py

#!/usr/bin/python3.6

import sys

def read_input(file):
    for line in file:
        yield line.split()

def main():
    data = read_input(sys.stdin)

    for words in data:
        for word in words:
            print(f"{word}\t1")

if __name__ == '__main__':
    main()

reduce.py

#!/usr/bin/python3.6
import sys
from operator import itemgetter
from itertools import groupby


def read_mapper_output(file, separator='\t'):
    for line in file:
        yield line.rstrip().split(separator, 1)

def main():
    data = read_mapper_output(sys.stdin)

    for current_word, group in groupby(data, itemgetter(0)):
        total_count = sum(int(count) for current_word, count in group)
        
        print(f"{current_word}\t{total_count}")

if __name__ == '__main__':
    main()

run.sh

#!/bin/bash
HADOOP_CMD="hadoop"
STREAM_JAR_PATH="/root/hadoop/hadoop-3.2.1/share/hadoop/tools/lib/hadoop-streaming-3.2.1.jar"
INPUT_FILE_PATH_1="/data/novel/*.txt"
OUTPUT_PATH="/data/wc"
MAPPER_PATH="/root/hadoop/my/wc/map.py"
REDUCER_PATH="/root/hadoop/my/wc/reduce.py"
$HADOOP_CMD fs -rm -r -skipTrash $OUTPUT_PATH
 
$HADOOP_CMD jar $STREAM_JAR_PATH \
                -input $INPUT_FILE_PATH_1 \
                -output $OUTPUT_PATH \
                -mapper $MAPPER_PATH \
                -reducer $REDUCER_PATH \
                -file $MAPPER_PATH \
                -file $REDUCER_PATH

运行

启动

$ start-dfs.sh
$ start-yarn.sh

执行

$ chmod +x map.py reduce.py run.sh
$ wget https://files.cnblogs.com/files/connect/novel.tar.gz
$ tar -xzvf novel.tar.gz
$ hdfs dfs -mkdir /data/novel
$ hdfs dfs -put novel/*.txt /data/novel
$ ./run.sh

渣渣服务器会拒绝服务半小时以上,CPU 彪满...(YARN可使用的物理内存总量配置问题)

内存占用

过程

结果

$ hdfs dfs -ls /data/wc
Found 2 items
-rw-r--r--   1 root supergroup          0 2020-04-17 21:12 /data/wc/_SUCCESS
-rw-r--r--   1 root supergroup    1590517 2020-04-17 21:12 /data/wc/part-00000
$ hdfs dfs -cat /data/wc/part-00000 |head -n 100
2020-04-17 21:30:42,656 INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false
!       1
"       7
"!Que   1
"''Tis  1
"''Twas 1
"''Twill        1
"'0ld   1
...

参考文档

Writing An Hadoop MapReduce Program In Python

评论