本文分享自华为云社区《Hadoop Streaming:用Python 编写Hadoop MapReduce 程序》,作者:Donglian Lin。
随着数字媒体、物联网等发展的涌现,每天产生的数字数据量呈指数级增长。这种情形给创建下一代工具和技能来存储和操作这些数据带来了寻衅。这便是 Hadoop Streaming 的用武之地!
下面给出的图表描述了从2013年起环球每年产生的数据增长情形。IDC估计,到2025年,每年产生的数据量将达到180 Zettabytes!
IBM 表示,每天有近2.5 千万字节的数据被创建,个中 90% 的天下数据是在过去两年中创建的!
存储如此弘大的数据量是一项具有寻衅性的任务。Hadoop可以比传统的企业数据仓库更有效地处理大量构造化和非构造化数据。它跨分布式打算机集群存储这些弘大的数据集。Hadoop Streaming 利用MapReduce 框架,该框架可用于编写运用程序来处理海量数据。

由于MapReduce 框架基于 Java,您可能想知道如果开拓职员没有 Java 履历,他/她如何事情。好吧,开拓职员可以利用他们喜好的措辞编写mapper/Reducer 运用程序,而无需节制太多 Java 知识,利用Hadoop Streaming而不是切换到 Pig 和 Hive 等新工具或技能。
1.什么是 Hadoop 流?Hadoop Streaming 是 Hadoop 发行版附带的实用程序。它可用于实行大数据剖析程序。Hadoop 流可以利用Python、Java、PHP、Scala、Perl、UNIX 等措辞实行。该实用程序许可我们利用任何可实行文件或脚本作为映射器和/或化简器来创建和运行 Map/Reduce 作业。例如:
$HADOOP_HOME/bin/hadoop jar$HADOOP_HOME/hadoop-streaming.jar
-input myInputDirs
-输出我的输出目录
-文件夹/垃圾箱/猫
-减速器/bin/wc
参数解释:
Python MapReduce 代码:
mapper.py#!/usr/bin/pythonimport sys#Word Count Example# input comes from standard input STDINfor line in sys.stdin:line = line.strip() #remove leading and trailing whitespaceswords = line.split() #split the line into words and returns as a listfor word in words:#write the results to standard output STDOUTprint'%s %s' % (word,1) #Emit the word
reducer.py
#!/usr/bin/pythonimport sysfrom operator import itemgetter# using a dictionary to map words to their countscurrent_word = Nonecurrent_count = 0word = None# input comes from STDINfor line in sys.stdin:line = line.strip()word,count = line.split(' ',1)try:count = int(count)except ValueError:continueif current_word == word:current_count += countelse:if current_word:print '%s %s' % (current_word, current_count)current_count = countcurrent_word = wordif current_word == word:print '%s %s' % (current_word,current_count)
跑:
1. 创建一个包含以下内容的文件并将其命名为 word.txt。
猫鼠狮鹿虎狮象狮鹿
2. 将 mapper.py 和 reducer.py 脚本复制到上述文件所在的同一文件夹中。
3. 打开终端并找到文件所在的目录。 命令:ls:列出目录中的所有文件cd:变动目录/文件夹
4. 查看文件的内容。
命令:cat file_name
> mapper.py 的内容
命令:cat mapper.py
>reducer.py 的内容
命令:cat reducer.py
我们可以在本地文件(例如:word.txt)上运行 mapper 和reducer。为了在 Hadoop 分布式文件系统 (HDFS) 上运行Map 和 Reduce,我们须要Hadoop Streaming jar。以是在我们在HDFS 上运行脚本之前,让我们在本地运行它们以确保它们事情正常。
>运行映射器
命令:catword.txt | python mapper.py
>运行reducer.py
命令: cat word.txt | python mapper.py | sort -k1,1 | pythonreducer.py
我们可以看到映射器和减速器按预期事情,因此我们不会面临任何进一步的问题。
在 Hadoop 上运行Python 代码
在我们在Hadoop 上运行 MapReduce 任务之前,将本地数据(word.txt)复制到 HDFS
> 示例:hdfs dfs -put source_directory hadoop_destination_directory
命令:hdfs dfs -put/home/edureka/MapReduce/word.txt /user/edureka
复制jar文件的路径
基于jar版本的Hadoop Streaming jar路径为:
/usr/lib/hadoop-2.2.X/share/hadoop/tools/lib/hadoop-streaming-2.2.X.jar
因此,在您的终端上找到 Hadoop Streaming jar 并复制路径。
命令:
ls/usr/lib/hadoop-2.2.0/share/hadoop/tools/lib/hadoop-streaming-2.2.0.jar
运行 MapReduce 作业
命令:
hadoop jar/usr/lib/hadoop-2.2.0/share/hadoop/tools/lib/hadoop-streaming-2.2.0.jar -file/home/edureka/mapper.py -mapper mapper.py -file /home/ edureka/reducer.py-reducer reducer.py -input /user/edureka/word -output /user/edureka/Wordcount
Hadoop 为统计和信息供应了一个基本的 Web 界面。当Hadoop 集群运行时,在浏览器中打开http://localhost:50070。这是Hadoop Web 界面的屏幕截图。
现在浏览文件系统并找到天生的 wordcount 文件以查看输出。下面是截图。
我们可以利用这个命令在终端上看到输出
命令:hadoopfs -cat /user/edureka/Wordcount/part-00000
您现在已经学会了如何利用 Hadoop Streaming 实行用Python 编写的 MapReduce 程序!
点击关注,第一韶光理解华为云新鲜技能~华为云博客_大数据博客_AI博客_云打算博客_开拓者中央-华为云