1

を使用してファイルをアップロードするために、HDFS REST API を呼び出しますhttplib

私のプログラムはファイルを作成しましたが、コンテンツはありません。

================================================== ===

これが私のコードです:

import httplib

conn=httplib.HTTPConnection("localhost:50070")
conn.request("PUT","/webhdfs/v1/levi/4?op=CREATE")
res=conn.getresponse()
print res.status,res.reason
conn.close()

conn=httplib.HTTPConnection("localhost:50075")
conn.connect()
conn.putrequest("PUT","/webhdfs/v1/levi/4?op=CREATE&user.name=levi")
conn.endheaders()
a_file=open("/home/levi/4","rb")
a_file.seek(0)
data=a_file.read()
conn.send(data)
res=conn.getresponse()
print res.status,res.reason
conn.close()

==================================================

戻り値は次のとおりです。

307 TEMPORARY_REDIRECT 201 作成済み

================================================== =======

OK、ファイルは作成されましたが、コンテンツは送信されませんでした。

にコメントする#conn.send(data)と、結果は同じですが、まだコンテンツはありません。

ファイルの読み取りまたは送信が間違っている可能性がありますが、わかりません。

これがどのように起こったか知っていますか?

4

1 に答える 1

1

コードが 2 番目の PUT 要求で 307 の「場所」ヘッダーを使用していないようです。

私は、使用できる可能性のある Python WebHDFS ラッパーのフォークに取り組んできました。ここで完全なコードを確認できます: https://github.com/carlosmarin/webhdfs-py/blob/master/webhdfs/webhdfs.py

興味のある方法は次のとおりです。

def copyfromlocal(self, source_path, target_path, replication=1, overwrite=True):
    url_path = WEBHDFS_CONTEXT_ROOT + target_path + '?op=CREATE&overwrite=' + 'true' if overwrite else 'false'

    with _NameNodeHTTPClient('PUT', url_path, self.namenode_host, self.namenode_port, self.username) as response:
        logger.debug("HTTP Response: %d, %s" % (response.status, response.reason))
        redirect_location = response.msg["location"]
        logger.debug("HTTP Location: %s" % redirect_location)
        (redirect_host, redirect_port, redirect_path, query) = self.parse_url(redirect_location)

        # Bug in WebHDFS 0.20.205 => requires param otherwise a NullPointerException is thrown
        redirect_path = redirect_path + "?" + query + "&replication=" + str(replication)

        logger.debug("Redirect: host: %s, port: %s, path: %s " % (redirect_host, redirect_port, redirect_path))
        fileUploadClient = HTTPConnection(redirect_host, redirect_port, timeout=600)

        # This requires currently Python 2.6 or higher
        fileUploadClient.request('PUT', redirect_path, open(source_path, "r").read(), headers={})
        response = fileUploadClient.getresponse()
        logger.debug("HTTP Response: %d, %s" % (response.status, response.reason))
        fileUploadClient.close()

        return json.loads(response.read())
于 2013-06-04T00:45:46.450 に答える