通过pyhdfs访问hdfs所遇到的相关问题

通过pyhdfs访问hdfs所遇到的相关问题

最近学习使用java API访问hdfs时,十分渴望用python访问,就在pycharm里import了pyhdfs,尝试访问hdfs。

一、本地虚拟机体验

vm打开,虚拟机跑起来:

1
2
3
4
5
from pyhdfs import HdfsClient
client = HdfsClient(hosts='IP:50070')
Res = client.open('/data/1.txt')
for lines in Res:
print(lines)

失败,显示了主机名称和端口号,但无法连接上。

在网上搜了下,这里需要将各主机名与ip的映射加在本地机器的hosts里,例如我使用的时win10,就在C:\Windows\System32\drivers\etc下修改hosts。

改完后成功print出文本内容,试试copy到本地:

1
2
3
from pyhdfs import HdfsClient
client = HdfsClient(hosts='IP:50070')
res = client.copy_to_local('/data/1.txt', 'C:/Users/Aysamu/Desktop/1.txt')

在桌面看到1.txt,成功!

二、云端访问

这里尝试访问阿里上的hdfs时,我发现半年前我搭建的hadoop环境并不完整😥,理所当然的无法通过pyhdfs访问,如mapreduce之类的测试都跑不通,就顺便修缮了一下,下面我给出修改后的配置。

(注意,这里各主机的hosts内映射需按照“本机对应内网ip,他机对应公网ip”来填写,在本地机器中,直接填各主机的公网ip即可。)

core-site.xml:

1
2
3
4
5
6
7
8
9
10
11
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://aysamu:9000</value>
</property>
<!-- 指定 hadoop 运行时产生文件的存储路径 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/root/tmp</value>
</property>
</configuration>

yarn-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<property>
<name>yarn.resourcemanager.hostname</name>
<value>aysamu</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
<description>YARN 集群为 MapReduce 程序提供的 shuffle 服务</description>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>aysamu:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>aysamu:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>aysamu:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>aysamu:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>aysamu:8088</value>
</property>
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>

mapred-site.xml.template:

1
2
3
4
5
6
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>

记得cp mapred-site.xml.template mapred-site.xml,我在8088端口看不到进程就是忘记了它(>人<;)

还有十分重要的一点!!!

在各节点的hosts中,将这一行注释掉!

127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4

最后说一句,我爱python

欢迎投喂,但你的支持就是对我最佳的回馈。