Published on

Python WebHDFS คืออะไร?

Authors
WebHDFS

บทความนี้พูดถึงอะไรบ้าง

  1. What is WebHDFS: ทำไมต้องใช้ webhdfs ปัญหาเดิมคืออะไร
  2. What about PyWebHDFS: PyWebHDFS คืออะไร Code ทำไมเราถึงใช้
  3. Installation: การติดตั้ง
  4. กรณีใช้งานร่วมกับ Kerberose
  5. Basic Commands: คำสั่งพื้นฐานสำหรับ HDFS

What is WebHDFS ?

WebHDFS เป็นวิธีการส่งคำสั่ง HDFS Commands ไปยัง Hadoop Cluster เพื่อสั่งคำสั่งต่างๆ ผ่าน Rest API ซึ่งโดยปกติแล้วหากเราจะส่งคำสั่ง HDFS Commands จะต้อง Remote ไปยังเครื่อง VM ที่อยู่ใน Hadoop Cluster และส่งคำสั่งจากเครื่อง Local ไปยัง Hadoop ซึ่งในจุดนี้จะมีข้อสังเกตุที่น่าสนใจอยู่ 2 ประเด็นคือ

  1. คนที่ Remote เข้าเครื่อง VM ดังกล่าวจะสามารถเข้าถึงระบบของเครื่อง Local ได้ ซึ่งอาจจะส่งผลกระทบต่อระบบอื่นๆ กรณีแย่สุดอาจจะพลาดไปลบไฟล์สำคัญได้ ซึ่งหลายครั้งเราต้องการจำกัดสิทธิ์ให้เข้าถึงเฉพาะ Hadoop เท่านั้น
  2. กรณีที่เราต้องการส่งคำสั่งไปยัง Hadoop จากเครื่องอื่นๆ ที่ไม่ได้อยู่ในวงของ Hadoop Cluster ดังกล่าว

จุดนี้เองจะเป็น Concept คล้ายกับ Web API ที่เปิดให้มีการใช้งานผ่าน Rest API แทนที่จะเข้าถึงฐานข้อมูลโดยตรง แต่เป็นในมุมมองของการเข้าถึง HDFS สิ่งนี้เลยถูกเรียนกว่า WebHDFS

What about PyWebHDFS ?

จริงๆแล้วเราสามารถใช้งาน WebHDFS ผ่าน requests ใน Python ได้เลย เช่น หากเราต้องการส่งคำสั่ง hadoop fs -ls Code จะหน้าตาประมาณนี้

requests_webhdfs.py
import requests
res = requests.get("http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=LISTSTATUS").json()

อ่านเพิ่มเติม webhdfs

pywebhdfs จะเป็นตัวมาครอบ requests ดังกล่าวอีกที ให้อยู่ในรูปของ OOP ที่ชาว Python คุ้นเคยกันมากกว่า หน้าตา Code จะเปลี่ยนไปเป็นแบบนี้

example_pywebhdfs.py
from pywebhdfs.webhdfs import PyWebHdfsClient
hdfs = PyWebHdfsClient(host='<HOST>',port='50070', user_name='hdfs')
hdfs.list_dir(PATH)

อ่านเพิ่มเติม pywebhdfs

Installation

requirements.txt
pip install pywebhdfs
pip install requests_negotiate # for kerberos

กรณีใช้งานร่วมกับ Kerberose

kerberose เป็นวิธีการยืนยันตัวตนตัว เริ่มต้นเราจะทำการ generate kerberos ticket มาก่อนด้วย kinit

kinit

จะเพิ่มในส่วนของ request_extra_opts={'auth': auth_token} เพื่อส่ง kerberos ticket ไปพร้อมกับ requests

example_pywebhdfs_kerberose.py
from pywebhdfs.webhdfs import PyWebHdfsClient
from requests_negotiate import HTTPNegotiateAuth
auth_token = HTTPNegotiateAuth()
hdfs = PyWebHdfsClient(host='<HOST>',port='50070', request_extra_opts={'auth': auth_token})
hdfs.list_dir(PATH)

Basic Commands

List dir

hdfs_path = '<source_hdfs_folder>'
hdfs.list_dir(hdfs_path)

Read file

hdfs_path = '<source_hdfs_path>'
file_data = hdfs.read_file(hdfs_path)

Make dir

hdfs.make_dir(PATH)

Create file

file_path = '<source_local_path>'
hdfs_path = '<destination_hdfs_path>'
with open(file_path, 'rb') as f:
    file_data = f.read()
hdfs.create_file(hdfs_path, file_data=file_data)

Delete file

hdfs_path = '<source_local_path>'
hdfs.delete_file_dir(hdfs_path, recursive=False)

ติดตามความรู้ Python ได้ที่ DataHungry