python——hadoop系列

详细介绍python操作hadoop的Hdfs和MapReduce

一、hdfs

1、环境准备

在操作hdfs的时候使用了pyhdfs库,需要pip或者anaconda安装一下,我使用了pip
ps:我已经把pip的源换成清华源的了,特别提醒要换国内的源,不然很慢很慢很慢…

pip install pyhdfs

2、python代码剖析

import pyhdfs
#通过ip连接hadoop的集群,我使用的是root用户此处的user_name用的root
fs = pyhdfs.HdfsClient(hosts="192.168.1.101",user_name="root")
# 创建目录
fs.mkdirs("/zzx/file")
# 输出/下的目录
f = fs.listdir("/")
print(f)
#删除目录
fs.delete("/zzx/file")

PS:时间不是很充足hdfs的就研究了怎么多,但是python的代码很简单,其他的操作也都是一行代码就可以解决,个人感觉python的速度运行起来比java的速度快不少(可能是用python用习惯的错觉吧。。。)。

二、MapReduce

这个不需要去安装别的库,但是mapreduce能百度到的大部分都是python2版本的,python3的我没找到,就自己改了一个出来。

1、剖析map的代码

import sys


for line in sys.stdin:
    # 按行读取
    line = line.strip()#去首尾的空格
    # 按空格拆分字符串
    words = line.split()
    #遍历每一个单词
    for word in words:
        print(word,1)

本地运行一下map的代码看一下效果
本地运行的命令如下

echo "foo foo quux labs foo bar quux" | python3 mapper.py

在这里插入图片描述

2、reduce代码剖析

import sys
# 初始化一堆参数
current_word = None
current_count = 0
word = None
for line in sys.stdin:
    # 拆成行
    line = line.strip()
    #此处我了解为接受的map的输出,跟sort -k1,1有关系,但是sort我不懂
    word, count = line.split(' ', 1)
    try:
        count = int(count)
    except ValueError:  # count如果不是数字的,忽略
        continue
    #计数
    if current_word == word:
        current_count += count
    else:
        if current_word != None:
           print(current_word,current_count)
        current_count = count
        current_word = word
if current_word == word:
    print(current_word, current_count)

看一下本地运行效果
mapreduce本地运行命令如下

echo "foo foo quux labs foo bar quux" | python3 mapper.py | sort -k1,1 | python3 reduce.py

在这里插入图片描述

三、在集群上跑python3的mapreduce

这个命令一言难尽啊。。。
先开启hadoop集群
命令如下

hadoop jar /opt/module/hadoop-2.7.2/share/hadoop/tools/lib/hadoop-streaming-2.7.2.jar
 -input /user/zzx/conf/core-site.xml 
 -output /output 
 -mapper "python3 mapper.py" 
 -reducer "python3 reduce.py" 
 -file ./mapper.py 
 -file ./reduce.py

分析:
1、用的是hadoop-streaming-xxx.jar这个包,
2、input output 大家都太熟了不写了
3、-mapper 运行mapper.py -reducer 运行reduce.py,这两处一定用双引号引起来(亲测)。
4、-file 此处是mapper.py文件和reduce.py的文件的路径,现在使用的这两文件的当前路径,两个file的顺序不要弄错了。

PS:这一大串是连在一块写的不要直接复制,我是为了看着方便写成这样了。

看一下运行效果
在这里插入图片描述
在这里插入图片描述
看一下运行结果

在这里插入图片描述

总结

谈一下总体感受,python版本的不管是hdfs还是mapreduce从代码量比用java写的要小很多,还有关键一点我觉得在我的电脑的相同环境下python版本的运行速度要比java的快(个人观点)。如有不妥的地方地方请多留言指正,sort -k1,1这个地方,回头这个时间来填这个坑。

### 配置 Python 连接 Hadoop 的方法 为了使 Python 能够与 Hadoop 结合并执行数据分析或文件操作,通常可以通过多种方式来完成这一目标。以下是几种常见的配置和连接方法: #### 方法一:利用 `subprocess` 执行命令行接口 (CLI) Python 可以通过调用 Hadoop 提供的 CLI 工具来进行基本的操作。这需要确保本地环境已经安装了 Hadoop 并正确设置了路径。 ```python import subprocess def run_hadoop_command(command): process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) output, error = process.communicate() if process.returncode != 0: raise Exception(f"Hadoop command failed with error: {error.decode('utf-8')}") return output.decode('utf-8') # 示例:列出 HDFS 中的内容 hdfs_ls_output = run_hadoop_command("hadoop fs -ls /") print(hdfs_ls_output) ``` 这种方法简单易用,但功能有限,仅适用于简单的文件管理任务[^1]。 --- #### 方法二:使用 PySpark API 处理数据 如果希望进行复杂的大规模数据处理,则可以考虑使用 Apache Spark 和其对应的 Python 接口——PySpark。PySpark 不仅能够访问存储在 HDFS 上的数据,还能提供高效的分布式计算支持。 首先需确认 Spark 环境已部署完毕并与 Hadoop 正常通信。接着可通过如下代码初始化 SparkSession 对象,并加载来自 HDFS 的数据源。 ```python from pyspark.sql import SparkSession spark = SparkSession.builder \ .appName("ExampleApp") \ .getOrCreate() df = spark.read.csv("hdfs://namenode_address/user/data/input.csv", header=True, inferSchema=True) # 数据预览 df.show(5) ``` 此方案特别适合于涉及机器学习模型训练或者实时流式传输的应用场景[^2]。 --- #### 方法三:编写 MapReduce 脚本并通过 Streaming 方式运行 对于某些特定需求来说,直接采用原生 Java 编写的 MapReduce 应用程序可能显得过于繁琐;此时可借助 Python 来快速开发自定义逻辑。具体做法是创建两个独立模块分别代表 Mapper 函数以及 Reducer 函数,之后再由 hadoop-streaming.jar 将两者串联起来形成完整的作业流程。 下面给出一个简化版的例子用于统计单词频率: Mapper.py 文件内容: ```python #!/usr/bin/env python3 import sys for line in sys.stdin: words = line.strip().split() for word in words: print("%s\t%s" % (word.lower(), 1)) ``` Reducer.py 文件内容: ```python #!/usr/bin/env python3 import sys current_word = None current_count = 0 for line in sys.stdin: try: word, count = line.split("\t") count = int(count) if current_word and current_word != word: print(f"{current_word}\t{current_count}") current_word = word current_count = count else: current_word = word current_count += count except ValueError as e: continue if current_word: print(f"{current_word}\t{current_count}") ``` 最后提交至集群上执行即可获得结果。 上述过程展示了如何运用 Python 构建简易版本 mapreduce 流程[^3]. --- ### 总结 以上介绍了三种主要途径让 Python 成功对接到 Hadoop 生态圈当中去。每种都有各自适用范围及优缺点所在,在实际项目选型阶段应当综合考量各方面因素后再做决定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值