2222
2323import logging
2424import json
25+
2526import happybase
2627from Hbase_thrift import AlreadyExists
2728
2829from package_parser import PackageParser
30+ from deployer_utils import HDFS
2931
3032
3133class HbasePackageRegistrar (object ):
3234 COLUMN_DEPLOY_STATUS = "cf:deploy_status"
3335
34- def __init__ (self , hbase_host ):
36+ def __init__ (self , hbase_host , hdfs_host , hdfs_user , hdfs_port , package_local_dir_path ):
3537 self ._hbase_host = hbase_host
38+ self ._hdfs_user = hdfs_user
39+ self ._hdfs_host = hdfs_host
40+ self ._hdfs_port = hdfs_port
41+ self ._hdfs_client = HDFS (hdfs_host , hdfs_port , hdfs_user )
3642 self ._parser = PackageParser ()
3743 self ._table_name = 'platform_packages'
44+ self ._package_hdfs_dir_path = "/user/pnda/application_packages"
45+ self ._package_local_dir_path = package_local_dir_path
3846 if self ._hbase_host is not None :
3947 connection = happybase .Connection (self ._hbase_host )
4048 try :
@@ -45,10 +53,11 @@ def __init__(self, hbase_host):
4553 finally :
4654 connection .close ()
4755
48- def set_package (self , package_name , package_data ):
49- logging .debug ("Storing %s, %s bytes" , package_name , len (package_data ))
50- metadata = self ._parser .get_package_metadata (package_data )
51- key , data = self .generate_record (metadata , package_data )
56+ def set_package (self , package_name , package_data_path ):
57+ logging .debug ("Storing %s" , package_name )
58+ metadata = self ._parser .get_package_metadata (package_data_path )
59+ key , data = self .generate_record (metadata )
60+ self ._write_to_hdfs (package_data_path , data ['cf:package_data' ])
5261 self ._write_to_db (key , data )
5362
5463 def set_package_deploy_status (self , package_name , deploy_status ):
@@ -62,6 +71,8 @@ def set_package_deploy_status(self, package_name, deploy_status):
6271
6372 def delete_package (self , package_name ):
6473 logging .debug ("Deleting %s" , package_name )
74+ package_data_hdfs_path = self ._read_from_db (package_name , ['cf:package_data' ])['cf:package_data' ]
75+ self ._hdfs_client .remove (package_data_hdfs_path )
6576 connection = happybase .Connection (self ._hbase_host )
6677 try :
6778 table = connection .table (self ._table_name )
@@ -71,10 +82,12 @@ def delete_package(self, package_name):
7182
7283 def get_package_data (self , package_name ):
7384 logging .debug ("Reading %s" , package_name )
74- package_data = self ._read_from_db (package_name , ['cf:package_data' ])
75- if len (package_data ) == 0 :
85+ record = self ._read_from_db (package_name , ['cf:package_data' ])
86+ if len (record ) == 0 :
7687 return None
77- return package_data ['cf:package_data' ]
88+ local_package_path = "%s/%s" % (self ._package_local_dir_path , package_name )
89+ self ._read_from_hdfs (record ['cf:package_data' ], local_package_path )
90+ return local_package_path
7891
7992 def get_package_metadata (self , package_name ):
8093 logging .debug ("Reading %s" , package_name )
@@ -114,12 +127,12 @@ def list_packages(self):
114127 connection .close ()
115128 return result
116129
117- def generate_record (self , metadata , package_data ):
130+ def generate_record (self , metadata ):
118131 return metadata ["package_name" ], {
119132 'cf:name' : '-' .join (metadata ["package_name" ].split ("-" )[:- 1 ]),
120133 'cf:version' : metadata ["package_name" ].split ("-" )[- 1 ],
121134 'cf:metadata' : json .dumps (metadata ),
122- 'cf:package_data' : package_data
135+ 'cf:package_data' : "%s/%s" % ( self . _package_hdfs_dir_path , metadata [ "package_name" ])
123136 }
124137
125138 def _read_from_db (self , key , columns ):
@@ -131,10 +144,26 @@ def _read_from_db(self, key, columns):
131144 connection .close ()
132145 return data
133146
147+ def _read_from_hdfs (self , source_hdfs_path , dest_local_path ):
148+ self ._hdfs_client .stream_file_to_disk (source_hdfs_path , dest_local_path )
149+
134150 def _write_to_db (self , key , data ):
135151 connection = happybase .Connection (self ._hbase_host )
136152 try :
137153 table = connection .table (self ._table_name )
138154 table .put (key , data )
139155 finally :
140156 connection .close ()
157+
158+ def _write_to_hdfs (self , source_local_path , dest_hdfs_path ):
159+ with open (source_local_path , 'rb' ) as source_file :
160+ first = True
161+ chunk_size = 10 * 1024 * 1024
162+ data_chunk = source_file .read (chunk_size )
163+ while data_chunk :
164+ if first :
165+ self ._hdfs_client .create_file (data_chunk , dest_hdfs_path )
166+ first = False
167+ else :
168+ self ._hdfs_client .append_file (data_chunk , dest_hdfs_path )
169+ data_chunk = source_file .read (chunk_size )
0 commit comments