- Published on
Python WebHDFS คืออะไร?
- Authors
- Name
- Wuttichai Kaewlomsap
- @wuttichaihung
บทความนี้พูดถึงอะไรบ้าง
- What is WebHDFS: ทำไมต้องใช้ webhdfs ปัญหาเดิมคืออะไร
- What about PyWebHDFS: PyWebHDFS คืออะไร Code ทำไมเราถึงใช้
- Installation: การติดตั้ง
- กรณีใช้งานร่วมกับ Kerberose
- Basic Commands: คำสั่งพื้นฐานสำหรับ HDFS
What is WebHDFS ?
WebHDFS เป็นวิธีการส่งคำสั่ง HDFS Commands ไปยัง Hadoop Cluster เพื่อสั่งคำสั่งต่างๆ ผ่าน Rest API ซึ่งโดยปกติแล้วหากเราจะส่งคำสั่ง HDFS Commands จะต้อง Remote ไปยังเครื่อง VM ที่อยู่ใน Hadoop Cluster และส่งคำสั่งจากเครื่อง Local ไปยัง Hadoop ซึ่งในจุดนี้จะมีข้อสังเกตุที่น่าสนใจอยู่ 2 ประเด็นคือ
- คนที่ Remote เข้าเครื่อง VM ดังกล่าวจะสามารถเข้าถึงระบบของเครื่อง Local ได้ ซึ่งอาจจะส่งผลกระทบต่อระบบอื่นๆ กรณีแย่สุดอาจจะพลาดไปลบไฟล์สำคัญได้ ซึ่งหลายครั้งเราต้องการจำกัดสิทธิ์ให้เข้าถึงเฉพาะ Hadoop เท่านั้น
- กรณีที่เราต้องการส่งคำสั่งไปยัง Hadoop จากเครื่องอื่นๆ ที่ไม่ได้อยู่ในวงของ Hadoop Cluster ดังกล่าว
จุดนี้เองจะเป็น Concept คล้ายกับ Web API ที่เปิดให้มีการใช้งานผ่าน Rest API แทนที่จะเข้าถึงฐานข้อมูลโดยตรง แต่เป็นในมุมมองของการเข้าถึง HDFS สิ่งนี้เลยถูกเรียนกว่า WebHDFS
What about PyWebHDFS ?
จริงๆแล้วเราสามารถใช้งาน WebHDFS ผ่าน requests ใน Python ได้เลย เช่น หากเราต้องการส่งคำสั่ง hadoop fs -ls
Code จะหน้าตาประมาณนี้
import requests
res = requests.get("http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=LISTSTATUS").json()
pywebhdfs จะเป็นตัวมาครอบ requests ดังกล่าวอีกที ให้อยู่ในรูปของ OOP ที่ชาว Python คุ้นเคยกันมากกว่า หน้าตา Code จะเปลี่ยนไปเป็นแบบนี้
from pywebhdfs.webhdfs import PyWebHdfsClient
hdfs = PyWebHdfsClient(host='<HOST>',port='50070', user_name='hdfs')
hdfs.list_dir(PATH)
Installation
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
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