SPL:访问 HDFS

Hadoop分布式文件系统(HDFS)提供了Java API读写其文件,集算器把实现读写HDFS文件的JAVA代码做了封装,形成更易用的SPL函数。通过这些函数,直接把HDFS文件数据加载到集算器中进行计算。本文详细介绍这些函数的用法。

Java API方式连接HDFS

创建/关闭HDFS连接

使用方式类似数据库连接,SPL也用成对的创建/关闭方式连接HDFS

创建HDFS连接

hdfs_open(url, user)urlHDFS服务器的地址,user指定操作用户,缺省时默认为 "root"

示例:


A

1

=hdfs_open("hdfs://192.168.0.8:9000",   "root")

 

关闭HDFS连接

hdfs_close(hdfsConn)hdfsConn是要被关闭的HDFS连接。

示例:A1创建连接,中间做一些读写、计算操作后,A3关闭A1创建的连接


A

1

=hdfs_open("hdfs://192.168.0.8:9000",   "root")

2

……

3

=hdfs_close(A1)

目录、文件操作

获取文件列表/创建目录/删除目录

hdfs_dir(hdfsConn,  parent)hdfsConnHDFS连接,parent是要操作的父目录。

示例:用不同的选项表示不同的操作。A2中用@d选项,获得/user/root下的目录列表;A3中用@p选项,获得/user/root下的目录、文件完整路径列表;A4中用@m选项,在/user/root目录下创建子目录imageFolderA5中用@r选项,删除imageFolder


A

1

=hdfs_open("hdfs://192.168.0.8:9000",   "root")

2

=hdfs_dir@d(A1,"/user/root")

3

=hdfs_dir@p(A1,"/user/root")

4

=hdfs_dir@m(A1,"imageFolder")

5

=hdfs_dir@r(A1,"imageFolder")

6

=hdfs_close(A1)

A2列出两个目录:

..

A3除了列出两个目录,还列出来一个orders.txt文件:

..

A4A5执行成功后返回true

..

上传到HDFS

hdfs_upload(hdfsConn, localFile, remoteFile)hdfsConnHDFS连接,localFile是本地文件,remoteFile是上传到HDFS的目标文件。

示例:A3中增加@d选项时,localFileremoteFile都是文件夹,会上传整个文件夹下的文件。


A

1

=hdfs_open("hdfs://192.168.0.8:9000",   "root")

2

=hdfs_upload(A1,"D:/employees.xlsx","/user/root/splFolder/employees.xlsx")

3

=hdfs_upload@d(A1,"D:/txtFolder/","/user/root/txtFolder/")

4

=hdfs_close(A1)

 

下载HDFS文件

hdfs_download(hdfsConn, remoteFile, localFile)hdfsConnHDFS连接,remoteFileHDFS中要下载的文件,localFile是下载到本地的目标文件。

示例:和上传类似,也有@d选项下载整个文件夹。


A

1

=hdfs_open("hdfs://192.168.0.8:9000",   "root")

2

=hdfs_download(A1,"/user/root/splFolder/employees.xlsx","D:/employees.xlsx")

3

=hdfs_download@d(A1,"/user/root/txtFolder/","D:/txtFolder/")

4

=hdfs_close(A1)

 

判断文件是否存在

hdfs_exists(hdfsConn, hdfsFile)hdfsConnHDFS连接,hdfsFile是要判断的HDFS文件或文件夹。

示例:


A

1

=hdfs_open("hdfs://192.168.0.8:9000",   "root")

2

=hdfs_exists(A1,"/user/")

3

=hdfs_exists(A1,"/user/root/city.xlsx")

4

=hdfs_close(A1)

 

读写文件数据

上传下载HDFS文件,是和本地文件的交互过程,但有些场景下,需要把数据直接读取到内存中进行计算,或把内存中持续不断产生的数据直接保存到HDFS中,而不用通过本地文件中转(可能因为文件太大不能存本地,或中转导致太慢)SPL提供了hdfs_file函数,支持用游标方式读取文件的一小段,一边读取一边计算,或一边计算一边把结果数据追加写入HDFS文件。

常见的数据文件格式有文本(txt/csv/json/xml)Excel,除此之外,SPL还提供了高性能的二进制格式的集文件(btx)

 

打开HDFS文件

hdfs_file(hdfsConn, hdfsFile:cs)hdfsConnHDFS连接,hdfsFile是文件,如果是文本格式,用cs指定文本字符集(UTF-8,GBK等等)

 

..

orders表的数据用orders.txtorders.xlsxorders.btx三种文件格式存储,下面测试对它们的读写。

 


A

1

=hdfs_open("hdfs://192.168.0.8:9000",   "root")

2

=hdfs_file(A1,"/user/root/orders.txt":"UTF-8")

3

=A2.read()

4

=A2.import@t()

5

=A2.cursor@t().fetch(2)

6

=A2.export@t(T)

7

=hdfs_file(A1,"/user/root/orders.xlsx")

8

=A7.xlsimport@t()

9

=A7.xlsexport@t(T)

10

=hdfs_file(A1,"/user/root/orders.btx")

11

=A10.import@b()

12

=A10.cursor@b().skip(10).fetch(5)

13

=A10.write@b(T)

14

=hdfs_close(A1)

A2打开HDSF文件orders.txt

A3把整体orders.txt读成一个大字符串:

..

A4orders.txt加载成序表(第一行是字段名,行内数据用TAB分割)

..

A5用游标方式加载orders.txt前两行数据,这适合处理超大量数据,边加载边计算:

..

A6把内存中的数据序表T写入orders.txt

A7打开Excel文件orders.xlsxA8把其数据读入序表,A9把序表T写回orders.xlsx

A10打开集文件orders.btxA11读入数据,A12用游标方式读入,跳过前10条记录,读取第11~15条。A13把序表T写回orders.btx

WEBHDFS方式连接HDFS

以上函数都是通过HDFSJAVA API实现,需要在SPL环境中引入相应版本的Hadoop jar及配置文件。为了避免部署麻烦,Hadoop还提供了HTTP REST API方式的WEBHDFSSPL基于这种方式也实现了两个函数:用webhdfs_file()实现文件数据的读写;剩余的所有操作(如上传下载任意文件、获取HDFS目录及文件列表、改变文件的访问权限、获取HDFS文件存储策略等等),都通过调用webhdfs()函数实现。

 

读写文件数据

webhdfs_file(fileUrl, params)fileUrl为目标文件的urlparamsurl中的参数。

下面还以orders的不同类型数据文件为例:


A

1

 

2

=webhdfs_file("http://localhost:50070/webhdfs/v1/user/root/orders.txt":"UTF-8","user.name=root")

3

=A2.read()

4

=A2.import@t()

5

=A2.cursor@t().fetch(2)

6

=A2.export@t(T)

7

=webhdfs_file("http://localhost:50070/webhdfs/v1/user/root/orders.xlsx","user.name=root")

8

=A7.xlsimport@t()

9

=A7.xlsexport@t(T)

10

=webhdfs_file("http://localhost:50070/webhdfs/v1/user/root/orders.btx","user.name=root")

11

=A10.import@b()

12

=A10.cursor@b().skip(10).fetch(5)

13

=A10.write@b(T)

14

 

webhdfs由于采用http请求,不需要长链接了,也就免去了A1A14中的open/close动作。

对各种数据文件支持的操作,和之前的hdfs_file是一致的,对文本支持整体读、整体写、游标读、追加写;但由于集文件追加数据时需要随机写,但HDFSJava API不支持随机写,那也就不支持集文件的追加写了。

这两个读取文件数据的函数功能一样,但各有优缺点,hdfs_file()需要部署特定版本的Hadoop环境,集成麻烦,但性能较好;webhdfs_file()使用简便,兼容不同的HDFS版本,但性能会稍慢。

通用功能函数

webhdfs(url, localFile)url是《HDFS WEBHDFS》中的任意操作;假如是上传文件的操作,localFile是待上传的本地文件;假如是下载文件的操作,localFile下载到本地的目标文件;其它操作时,不需要localFile参数,省略它即可。

示例


A

1

=webhdfs("http://localhost:50070/webhdfs/v1/user/root/f1.zip

?op=CREATE&user.name=root","d:/f1.zip")

2

=webhdfs("http://localhost:50070/webhdfs/v1/user/root/f2.png

?op=CREATE&user.name=root&overwrite=true","d:/f2.png")

3

=webhdfs("http://localhost:50070/webhdfs/v1/user/root/f3.txt

?op=APPEND&user.name=root","d:/f3_part5.txt")

4

=webhdfs("http://localhost:50070/webhdfs/v1/user/root/f4.xlsx

?op=OPEN&user.name=root","d:/f4.xlsx")

5

=webhdfs("http://localhost:50070/webhdfs/v1/user/root/?op=LISTSTATUS&user.name=root")

6

=json(A5)

7

=A6.FileStatuses.FileStatus

8

=webhdfs("http://localhost:50070/webhdfs/v1/user/root/orders.txt

?op=SETOWNER&owner=user1&group=grp2")

A1上传f1.zip

A2上传f2.png,参数中有overwrite=true,文件已经存在时,会强制替换;

A3上传f3_part5.txt,追加到f3.txt里;

A4下载f4.xlsx,这个通用函数可以上下载任意文件,包括txtxlsx这类数据文件;

A5获得/user/root/目录下的文件列表, WEBHDFS所有的操作,要么不返回内容,要么返回一个JSON格式的结果:

..

A6A5返回的JSON串转成嵌套的多层序表:

..

A7A6中取出需要的那一层序表,能看到文件列表的详细内容:

..

A8设置HDFS文件的拥有者,更多操作就不一一展示。