是否可以将文件保存在Hadoop中而不将其保存在本地文件系统中?

时间:2018-07-26 19:17:44

标签: python django hadoop hdfs

是否可以将文件保存在Hadoop中而不将其保存在本地文件系统中?我想做如下所示的操作,但是我想直接将文件保存在HDFS中。目前,我将文件保存在文档目录中,然后才可以使用hadoop fs -put将它们保存在HDFS中。

class DataUploadView(GenericAPIView):

    def post(self, request):

            myfile = request.FILES['photo']
            fs = FileSystemStorage(location='documents/')
            filename = fs.save(myfile.name, myfile)
            local_path = 'my/path/documents/' + str(myfile.name)            
            hdfs_path = '/user/user1/' + str(myfile.name)
            run(['hadoop', 'fs', '-put', local_path, hdfs_path], shell=True)            

3 个答案:

答案 0 :(得分:1)

Hadoop具有REST API,可让您通过WebHDFS创建文件。

因此,您可以使用create之类的python库基于REST API编写自己的requests来进行HTTP。但是,也有几个支持Hadoop / HDFS并已使用REST API或通过libhdfs使用RPC机制的python库。

  • pydoop
  • hadoopy
  • 蛇咬
  • pywebhdfs
  • hdfscli
  • 金字塔

只需确保您寻找的是如何创建文件,而不要让python库调用hdfs dfs -puthadoop fs -put

有关更多信息,请参见以下内容:

答案 1 :(得分:0)

以下是使用Pydoop将文件直接下载到HDFS的方法:

import os
import requests
import pydoop.hdfs as hdfs


def dl_to_hdfs(url, hdfs_path):
    r = requests.get(url, stream=True)
    with hdfs.open(hdfs_path, 'w') as f:
        for chunk in r.iter_content(chunk_size=1024):
            f.write(chunk)


URL = "https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tar.xz"
dl_to_hdfs(URL, os.path.basename(URL))

以上代码段适用于通用网址。如果您已经将文件作为Django UploadedFile,则可以使用其.chunks方法来遍历数据。

答案 2 :(得分:-2)

Python已安装在Linux中。它只能访问本地文件。它不能直接访问HDFS中的文件。

为了将文件直接保存/放入HDFS,您需要使用以下任何一种方法:

  • 火花:使用Dstream传输文件

  • Kafka:设置配置文件的问题。最适合流式传输数据。

  • Flume:设置配置文件。最适合静态文件。