大数据实验(二)HDFS API的使用(Python 3.7)

前言

书本第六章的主要内容就是讲了HDFS的一些操作指令,还有非常简略的Java调用HDFS API代码的示例。虽然据说用Java的运行效率会高很多,可是我也没有系统地学过Java,而且看样子实际做起来比较繁琐,所以我还是选择了Python来实现HDFS API的调用。用Python特别好的地方就是后面的数据处理和可视化会方便很多,人生苦短,我用Python,哈哈哈哈哈哈哈哈。
其实用python2也可以,所以就可以省去安装python3的步骤了,不过好像要安装一下pip

Python入门

Python其实入门还是很简单的,没有接触过的同学,可以去菜鸟教程上面快速入门,还有慕课上面嵩天老师的也挺好。

本次所需工具

  1. Python安装包(官网下载速度很慢,可以从我这里下载(提取码: mxhv);
  2. VSCode(非必须)
  3. 正常启动的Hadoop集群

CentOS 7 安装Python 3.7

以下操作在Slave001上面执行,当然别的虚拟机应该也没问题

安装依赖

  • CentOS 7 本身缺少了一部分Python运行所需要的软件或者运行库,在root用户下执行以下命令安装
yum install gcc openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel libffi-devel tk-devel wget curl-devel ibffi-devel

编译和安装Python

还是在root用户下执行这些操作

  • 首先将下载好的Python安装包上传到Slave001
  • 解压(注意路径) tar -zxvf Python-3.7.0.tgz
  • 进入解压后的文件夹 cd Python-3.7.0, 编译./configure
  • 最后安装make && make install,这一步要好久好久好久好久
  • 为安装好的Python3和pip3创建软链接(可以理解为快捷方式)
ln -s /usr/local/bin/pip3 /usr/bin/pip3
ln -s /usr/local/bin/python3 /usr/bin/python3
  • 检查是否安装成功
pip3 -V
python3

输出结果如图:
在这里插入图片描述
输入exit()退出

修改pip源和安装库

切换回hadoop用户
pip是一个专门用来管理Python库的工具,可以安装删除库之类的。由于pip默认的源是国外的,下载库时的速度会很慢,所以我们把它修改为国内的源,这里我用的是阿里的源:

  • 切换到/home/hadoop目录,创建.pip/文件夹
cd ~/ && mkdir .pip
  • 创建pip.conf文件
vi .pip/pip.conf

添加以下内容

[global]
timeout = 6000
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
trusted-host = pypi.tuna.tsinghua.edu.cn
  • 安装pyhdfs
pip3 install pyhdfs --user

输入python3 -c 'import pyhdfs',如果没有报错,则是安装成功了

安装配置VSCode(可跳过)

注意VSCode是在Windows上面安装的
这里安装VSCode是为了方便远程连接虚拟机,然后写代码,因为VSCode提供了很多插件,写起代码来会方便很多。如果你习惯用别的编辑器或者vim,那这一步可以跳过。安装过程很简单,到官网下载安装包,双击安装就行了。

安装插件

在这里插入图片描述
这是我安装的一些插件:
必装的是等一下需要用到的,其它的可以看个人喜好

  • Remote Development (必装)
  • Python (必装)
  • Chinese (界面显示为中文)
  • One Dark Pro (挺好看的一个颜色主题)
  • Bracket Pair Colorizer (让你的括号五颜六色更清楚)
  • Visual Studio IntelliCode (自动补全代码的,贼好用)

连接虚拟机

  • 安装完Remote Development后,左侧会有一个这样的图标,在那里配置ssh连接到虚拟机
    在这里插入图片描述
    以这样的格式添加你的虚拟机配置:
    建议用hadoop用户登录在这里插入图片描述
    保存之后在左侧就会出现你的虚拟机,选择连接就好,然后根据提示输入密码,就能连接成功了
    在这里插入图片描述
    然后打开文件夹
    在这里插入图片描述
    再次输入密码,就可以看到左侧打开了我们的目录,这时候就可以添加文件夹和文件了,我的如图:
    在这里插入图片描述
  • 连接虚拟机后,VSCode会提示你把插件安装到虚拟机,所以还需要再安装一下,才能在虚拟机上用
    Python插件要选择一下你的Python版本:
    在这里插入图片描述

编写代码

然后就可以开始写代码了,这部分的难点其实不是Python的语法,而是pyhdfs这个库的使用,可以参考官方的doc
这里给出我的部分代码,实现了在HDFS上文件/的创建,读写,和删除,从本地上传文件和下载文件到本地,可以参考一下:

#hdfs_api_usage.py
import pyhdfs
import os

# 获取本地当前目录
local_path = '/home/hadoop/mycode/'
print('- Local path:',  local_path)


# 连接HDFS的Namenode,以在HDFS上进行文件的读写等操作
# host后面是两个Master的IP地址和端口,我们用的都是50070,user_name是hadoop
client = pyhdfs.HdfsClient(
    hosts="192.168.153.102,50070, 192.168.153.101,50070", user_name="hadoop"
)

# 获取当前用户的根目录,用print打印出来
user_home = client.get_home_directory()
print("- Current user's home:", user_home)
# 获取可用的Master
print("- Active Master:", client.get_active_namenode())

# 列出根目录下的文件
print("- Files in path /:", client.listdir("/"))


# 为当前用户创建目录
print("- Creating user's home")
if client.exists(user_home):  # 是否已存在
    print("- The user home already exists")
else:
    client.mkdirs(user_home)  # 创建
    print("- The user home has been created", client.listdir("/"))

# 创建文件
print("- Create file test.txt")
# 在/目录创建test.txt, 写入内容为Hello world,覆盖已有文件
client.create("/test.txt", "Hello world", overwrite=True)

# 写读文件
# 写文件
print('- Write file')
client.append("/test.txt", "Hello lzh")
# 读文件
print('- Read file')
test_file = client.open("/test.txt")
# 有read或者readline,下面那个是把输出的b''去掉
# print(test_file.read())
print('  ', str(test_file.readline())[2:-1])
test_file.close()

#删除文件
print('- Delete file')
client.delete('/test.txt')

#上传本地文件
#这里第一个参数指定本地机器的一个文件,第二个参数想要保存的HDFS的路径和文件名,第三个允许覆盖,不然重复文件报错
#我这里的是与代码文件同目录下的testfolder/testfile.txt
print('- Upload file')
client.copy_from_local(local_path + 'testfolder/testfile.txt', '/testfilefromlocal.txt', overwrite=True)
print('  ', client.listdir('/'))

#下载文件到本地
print('- Download file')
client.copy_to_local('/testfilefromlocal.txt', local_path + 'testfolder/testfilefromHDFS.txt')

# 测试删除文件夹
# print('Testing delete folder')
# print('Before deleting:', client.listdir('/'))
# client.mkdirs('/testfolder')  #创建
# if client.exists('/testfolder'):
#     client.delete('/testfolder')  #删除
#     print('After deleting:', client.listdir('/'))  #重新列出目录

写完代码之后,确保hadoop集群已经正常启动了,就可以在终端上面运行(当然你得先切换到代码的目录

python3 hdfs_api_usage.py

如果你已经安装好了上面提到的Python插件,也可以直接按F5运行,VScode会让你选择调试配置:
在这里插入图片描述
为了不用每次都选择配置,我们添加一个配置文件
在这里插入图片描述
点击之后VScode会创建一个文件,我们就用默认的行了
在这里插入图片描述
输出结果:
在这里插入图片描述

  • 10
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
实验三:HDFS操作方法和基础编程实验 1. 实验目的 了解HDFS的基本操作方法和基础编程实验,掌握Hadoop文件系统的操作。 2. 实验环境 - 操作系统:Windows 10 - 虚拟机软件:VMware Workstation 15 Pro - 虚拟机操作系统:CentOS 7 - Hadoop版本:2.7.7 3. 实验步骤 3.1 HDFS操作方法 3.1.1 启动HDFS服务 在CentOS 7中打开终端,输入以下命令启动HDFS服务: ``` start-dfs.sh ``` 3.1.2 创建文件夹 HDFS中的文件夹称为目录,使用以下命令在HDFS中创建一个目录: ``` hadoop fs -mkdir /test ``` 3.1.3 上传文件 使用以下命令将本地文件上传到HDFS中的目录: ``` hadoop fs -put /opt/test.txt /test ``` 3.1.4 下载文件 使用以下命令将HDFS中的文件下载到本地: ``` hadoop fs -get /test/test.txt /opt ``` 3.1.5 查看文件 使用以下命令查看HDFS中的文件: ``` hadoop fs -ls /test ``` 3.1.6 删除文件 使用以下命令删除HDFS中的文件: ``` hadoop fs -rm /test/test.txt ``` 3.2 基础编程实验 3.2.1 实验要求 编程实现一个完整的Hadoop MapReduce程序,实现词频统计功能。 3.2.2 实验步骤 3.2.2.1 编写Mapper类 在Eclipse中新建一个Java项目,创建Mapper类,代码如下: ``` public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> { private final static IntWritable one = new IntWritable(1); private Text word = new Text(); public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { String line = value.toString(); StringTokenizer tokenizer = new StringTokenizer(line); while (tokenizer.hasMoreTokens()) { word.set(tokenizer.nextToken()); context.write(word, one); } } } ``` 3.2.2.2 编写Reducer类 创建Reducer类,代码如下: ``` public class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> { private IntWritable result = new IntWritable(); public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { int sum = 0; for (IntWritable val : values) { sum += val.get(); } result.set(sum); context.write(key, result); } } ``` 3.2.2.3 编写Driver类 创建Driver类,代码如下: ``` public class WordCount { public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); Job job = Job.getInstance(conf, "word count"); job.setJarByClass(WordCount.class); job.setMapperClass(WordCountMapper.class); job.setCombinerClass(WordCountReducer.class); job.setReducerClass(WordCountReducer.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); System.exit(job.waitForCompletion(true) ? 0 : 1); } } ``` 3.2.2.4 打包 右键项目,选择Export,选择JAR file,点击Next,选择要导出的项目和要导出的类,点击Next,选择要导出的JAR文件路径和文件名,点击Finish,即可生成JAR文件。 3.2.2.5 运行 使用以下命令在Hadoop集群上运行程序: ``` hadoop jar /opt/wordcount.jar WordCount /input /output ``` 其中,/input是输入文件所在的目录,/output是输出文件所在的目录。 4. 实验结果与结论 经过以上步骤,我们可以成功地完成HDFS操作方法和基础编程实验,从而掌握了Hadoop文件系统的操作。同时,我们还通过编写MapReduce程序实现了词频统计功能,进一步加深了对Hadoop的理解和应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值