hadoop使用

1:使用命令将文本上传到HDFS中

1.1 创建文件夹

hdfs dfs -mkdir -p  input

1.2 将*.txt 放到input目录

hdfs dfs -put *.txt input

1.3查看input目录中的文件

hdfs dfs -ls input

结果:

Found 1 items

-rw-r--r--  1 hegh supergroup        53 2020-11-30 22:42 input/text.txt

1.4 Hadoop Streaming使用:

hadoop streaming的工作方式如下图(在这里我们只谈跟hadoop streaming相关的部分,至于MapReduce的细节不予赘述)。与标准的MapReduce(以下简称MR)一样的是整个MR过程依然由mapper、[combiner]、reducer组成(其中combiner为可选加入)。用户像使用java一样去用其他语言编写MR,只不过Mapper/Reducer的输入和输出并不是和java API打交道,而是通过该语言下的标准输入输出函数来进行。我在图中尤其标注了绿色的框框,是你应该关注并自己编写的mapper和reducer的位置


mapper的角色:hadoop将用户提交的mapper可执行程序或脚本作为一个单独的进程加载起来,这个进程我们称之为mapper进程,hadoop不断地将文件片段转换为行,传递到我们的mapper进程中,mapper进程通过标准输入的方式一行一行地获取这些数据,然后设法将其转换为键值对,再通过标准输出的形式将这些键值对按照一对儿一行的方式输出出去。

虽然在我们的mapper函数中,我们自己能分得清key/value(比方说有可能在我们的代码中使用的是string key,int value),但是当我们采用标准输出之后,key value是打印到一行作为结果输出的(比如sys.stdout.write("%s\t%s\n"%(birthyear,gender))),因此我们为了保证hadoop能从中鉴别出我们的键值对,键值对中一定要以分隔符'\t'即Tab(也可自定义分隔符)字符分隔,这样才能保证hadoop正确地为我们进行partitoner、shuffle等等过程。

reducer的角色:hadoop将用户提交的reducer可执行程序或脚本同样作为一个单独的进程加载起来,这个进程我们称之为reducer进程,hadoop不断地将键值对(按键排序)按照一对儿一行的方式传递到reducer进程中,reducer进程同样通过标准输入的方式按行获取这些键值对儿,进行自定义计算后将结果通过标准输出的形式输出出去。

在reducer这个过程中需要注意的是:传递进reducer的键值对是按照键排过序的,这点是由MR框架的sort过程保证的,因此如果读到一个键与前一个键不同,我们就可以知道当前key对应的pairs已经结束了,接下来将是新的key对应的pairs

mapper.py:

import sys

for linein sys.stdin:

    line = line.strip()

    words = line.split()

    for wordin words:

        print("%s\t%s" % (word, 1))


reducer.py:

import sys

countMap = {}

for linein sys.stdin:

    line = line.strip()

    word, count = line.split('\t')

    try:

        count =int(count)

    except ValueError:#count如果不是数字的话,直接忽略掉

            continue

    if wordnot in countMap:

        countMap[word] = count

    else:

        countMap[word] = countMap[word] + count

    for keyin countMap:

        print("%s\t%s" % (key, countMap[key]))


Hadoop Streaming的使用方式

$HADOOP_HOME/bin/hadoop jar $HADOOP_HOME/.../hadoop-streaming.jar [genericOptions] [streamingOptions]

你可能感兴趣的:(hadoop使用)