当前位置:   article > 正文

【Python机器学习】Hadoop流

【Python机器学习】Hadoop流

Hadoop是一个开源的Java项目,为运行MapReduce作业提供了大量所需的功能。除了分布时计算之外,Hadoop自带分布式文件系统。

Hadoop可以运行Java之外的其他语言编写的分布式程序。Hadoop流很像Linux系统重的管道(管道使用符号 | ,可以将一个命令的输入作为另一个命令的输出)。如果用mapper.py调用mapper,用reducer.py调用reducer,那么Hadoop流就可以想Linux命令一样执行,例如

cat inputFile.txt | python3 mapper.py | sort | python3 reducer.py > outputFile.txt

这样,类似的Hadoop流就可以在多台机器上分布式执行,用户可以通过Linux命令来测试python语言编写的MapReduce脚本。

分布式计算均值和方差的mapper

下面是一个在海量数据上构建的分布式计算均值和方差的MapReduce作业:

  1. import sys
  2. from numpy import mat,mean,power
  3. def read_input(file):
  4. for line in file:
  5. yield line.strip()
  6. input = read_input(sys.stdin)
  7. input=[float(line) for line in input]
  8. numInputs=len(input)
  9. input=mat(input)
  10. sqInput=power(input,2)
  11. print('%d\t%f\%f' % (numInputs,mean(input),mean(sqInput)))
  12. print >> sys.stderr,'report: still alive'

Linux下的调用命令:

cat inputFile.txt | python3 map.py

Windows系统下调用命令,在DOS窗口:

python3 map.py < inputFile.txt

分布式计算均值和方差的reducer

mapper接受原始的输入并产生中间值传递给reducer。很多mapper是并行执行的,所以需要将这些mapper的输出合并成一个值。接下来是reducer的代码:将中间的key/value对进行组合:

  1. import sys
  2. from numpy import mat,mean,power
  3. def read_input(file):
  4. for line in file:
  5. yield line.strip()
  6. input=read_input(sys.stdin)
  7. mapperOut=[line.split('\t') for line in input]
  8. cumVal=0.0
  9. cumSumSq=0.0
  10. cumN=0.0
  11. for instance in mapperOut:
  12. nj=float(instance[0])
  13. cumN=cumN+nj
  14. cumVal=cumVal+float(instance[1])
  15. cumSumSq=cumSumSq+float(instance[2])
  16. mean=cumVal/cumN
  17. varSum=(cumSumSq-2*mean*cumVal+cumN*mean*mean)/cumN
  18. print('%d\t%f\t%f' % (cumN,mean,varSum))
  19. print >> sys.stderr,'report: still alive'

Linux下的调用命令:

%cat inputFile.txt | python3 map.py | python3 reduce.py

Windows系统下调用命令,在DOS窗口:

%python3 map.py < inputFile.txt | python3 reduce.py

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/喵喵爱编程/article/detail/1005940
推荐阅读
相关标签
  

闽ICP备14008679号