使用Python访问HDFS

最近接触到大数据,对于Skpark和Hadoop的料及都停留在第一次听到这个名词时去搜一把看看大概介绍免得跟不上时代的层次。

在实际读了点别人的代码,又自己写了一些之后,虽然谈不上理解加深,至少对于大数据技术的整体布局有了更清晰的认识。

HDFS主要用来存储文件系统,虽然Spark有自己的RDD,但是似乎并未被启用。我需要的数据,是通过Spark服务启动的计算程序,写入HDFS中的。

#这结构怎么看都感觉有点怪。

Spark支持Java、Scala和Python开发,对我来说是个好事。唯一的问题就是如何从HDFS中读取我需要的数据。

Python的HDFS相关包有很多,我使用的是hdfs,根据官方文档的说法,同时支持hdfs和WebHDFS,默认创建client的方式好像是WebHDFS,

需要通过datanode进行文件操作,而HDFS则是通过namenode进行文件操作,在这里卡了很久,也换过snakebite等包,直到把端口换成datanode,才正常连接。

※参照文档:http://fatkun.com/2014/11/httpfs-and-webhdfs.html

hdfs包的安装命令:

sudo pip install hdfs

启动hdfs:

>>> from hdfs.client import Client
>>> client = Client("http://localhost:50070")  # 50070: Hadoop默认namenode
>>> dir(client)
[‘__class__‘, ‘__delattr__‘, ‘__dict__‘, ‘__doc__‘, ‘__format__‘, ‘__getattribute__‘, ‘__hash__‘, ‘__init__‘, ‘__module__‘, ‘__new__‘, ‘__reduce__‘, ‘__reduce_ex__‘, ‘__registry__‘, ‘__repr__‘, ‘__setattr__‘, ‘__sizeof__‘, ‘__str__‘, ‘__subclasshook__‘, ‘__weakref__‘, ‘_append‘, ‘_append_1‘, ‘_create‘, ‘_create_1‘, ‘_delete‘, ‘_get_content_summary‘, ‘_get_file_checksum‘, ‘_get_file_status‘, ‘_get_home_directory‘, ‘_list_status‘, ‘_mkdirs‘, ‘_open‘, ‘_rename‘, ‘_request‘, ‘_session‘, ‘_set_owner‘, ‘_set_permission‘, ‘_set_replication‘, ‘_set_times‘, ‘_timeout‘, ‘checksum‘, ‘content‘, ‘delete‘, ‘download‘, ‘from_options‘, ‘list‘, ‘makedirs‘, ‘parts‘, ‘read‘, ‘rename‘, ‘resolve‘, ‘root‘, ‘set_owner‘, ‘set_permission‘, ‘set_replication‘, ‘set_times‘, ‘status‘, ‘upload‘, ‘url‘, ‘walk‘, ‘write‘]
>>>

其中用到的方法有:

walk() 类似os.walk,返回值也是包含(路径,目录名,文件名)元素的数组,每层迭代。

read() 类似file.read,官方文档的说法是client.read必须在with块里使用:

with client.read(filepath) as fs:

content = fs.read()

write() 写文件,同样需要在with块中使用:

client.write(filepath, data=data_str, encoding=‘utf-8‘)

还有一种写法:

from hdfs.hfile import Hfile

hfile = Hfile(hostname, port, path, mode=‘w‘)
hfile.write(data)
hfile.close()

hfile = Hfile(hostname, port, path)
data = hfile.read()
hfile.close()

在filepath中,如果有不存在的路径,会被直接创建出来。

目前用到的只有这些,后面如果涉及新的方法或者模块,会继续增加。

※ 关于Spark部署任务

Spark部署任务的命令,是spark-submit,语法是

./bin/spark-submit \
--class <main-class>
--master <master-url> \
--deploy-mode <deploy-mode> \
--conf <key>=<value> \
... # other options
<application-jar> \
[application-arguments]

默认可以直接使用Java程序的jar包,Scala是基于Java的,同样可以打包成jar,对于python文件,需要在<application-jar>处使用--py-files定义,单个文件可以直接写出,多个文件的话可以打包成.zip或.egg。

参考:http://spark.apache.org/docs/latest/submitting-applications.html

时间: 2024-07-30 14:41:43

使用Python访问HDFS的相关文章

fedora python访问mysql

1 下载驱动库 http://sourceforge.net/projects/mysql-python/ 2, yum install mysql-dev* yum install python-dev* 3, python setup.py install fedora python访问mysql,布布扣,bubuko.com

Hadoop HDFS (3) JAVA访问HDFS

现在我们来深入了解一下Hadoop的FileSystem类.这个类是用来跟Hadoop的文件系统进行交互的.虽然我们这里主要是针对HDFS,但是我们还是应该让我们的代码只使用抽象类FileSystem,这样我们的代码就可以跟任何一个Hadoop的文件系统交互了.在写测试代码时,我们可以用本地文件系统测试,部署时使用HDFS,只需配置一下,不需要修改代码了. 在Hadoop 1.x以后的版本中引入了一个新的文件系统接口叫FileContext,一个FileContext实例可以处理多种文件系统,而

Debian下无root权限使用Python访问Oracle

这篇文章的起因是,在公司的服务器上没有root权限,但是需要使用 Python 访问 Oracle,而不管是使用 pip 安装组件还是安装 Oracle 的 client,都需要相应权限.本文即解决该问题. 使用 virtualenv 使用系统自带 Python 和 pip 安装组件时,默认会安装到系统目录下,需要 root 权限才能执行写操作. 不管是从资源隔离的角度,还是从绕过 root 的角度,你都需要一套顺手的 Python 虚拟环境工具:virtualenv. 去求运维哥哥帮忙安装 v

Spark访问HDFS

来自 Gitbook上的"Spark访问HDFS" http://chenzhongpu.gitbooks.io/bigdatanotes/content/SparkAccessHDFS/README.html 该书是关于大数据读书笔记的,目前在Gitbook上持续更新 .  Github地址:https://github.com/ChenZhongPu/BigDataGitBook 完成的部分有 : 本地模式下运行Hadoop 和 Spark访问HDFS

python 访问限制

在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑. 但是,从前面Student类的定义来看,外部代码还是可以自由地修改一个实例的name.score属性: >>> bart = Student('Bart Simpson', 98) >>> bart.score 98 >>> bart.score = 59 >>> bart.score 59 如果要让内部属性不被外部

Python 访问 LinkedIn (API)

CODE: #!/usr/bin/python # -*- coding: utf-8 -*- ''' Created on 2014-8-16 @author: guaguastd @name: login.py ''' # twitter login def linkedin_login(): from linkedin import linkedin CONSUMER_KEY = '' CONSUMER_SECRET = '' USER_TOKEN = '' USER_SECRET = '

Python访问PostGIS(建表、空间索引、分区表)

#encoding: utf-8 __author__ = 'Administrator' import psycopg2 import ppygis import datetime import string import sys import logging import GeowayLogger reload(sys) #中文错误 sys.setdefaultencoding( "utf-8" ) vLog = GeowayLogger.GeowayLogger("c:

Python访问MySQL数据库

#encoding: utf-8 import mysql.connector __author__ = 'Administrator' config={'host':'127.0.0.1',#默认127.0.0.1 'user':'root', 'password':'root', 'port':3306 ,#默认即为3306 'database':'test', 'charset':'utf8'#默认即为utf8 } if __name__=="__main__": print(c

Hadoop通过c语言API访问hdfs

Hadoop给我们提供了使用c语言访问hdfs的API,下面进行简要介绍: 环境:ubuntu14.04  hadoop1.0.1  jdk1.7.0_51 访问hdfs的函数主要定义在hdfs.h文件中,该文件位于hadoop-1.0.1/src/c++/libhdfs/文件夹下,而相应的库文件是位于hadoop-1.0.1/c++/Linux-amd64-64/lib/目录下的libhdfs.so,另外要访问hdfs还需要依赖jdk的相关API,头文件目录包括jdk1.7.0_51/incl