22
22
23
23
import logging
24
24
import json
25
+
25
26
import happybase
26
27
from Hbase_thrift import AlreadyExists
27
28
28
29
from package_parser import PackageParser
30
+ from deployer_utils import HDFS
29
31
30
32
31
33
class HbasePackageRegistrar (object ):
32
34
COLUMN_DEPLOY_STATUS = "cf:deploy_status"
33
35
34
- def __init__ (self , hbase_host ):
36
+ def __init__ (self , hbase_host , hdfs_host , hdfs_user , hdfs_port , package_local_dir_path ):
35
37
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 )
36
42
self ._parser = PackageParser ()
37
43
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
38
46
if self ._hbase_host is not None :
39
47
connection = happybase .Connection (self ._hbase_host )
40
48
try :
@@ -45,10 +53,11 @@ def __init__(self, hbase_host):
45
53
finally :
46
54
connection .close ()
47
55
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' ])
52
61
self ._write_to_db (key , data )
53
62
54
63
def set_package_deploy_status (self , package_name , deploy_status ):
@@ -62,6 +71,8 @@ def set_package_deploy_status(self, package_name, deploy_status):
62
71
63
72
def delete_package (self , package_name ):
64
73
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 )
65
76
connection = happybase .Connection (self ._hbase_host )
66
77
try :
67
78
table = connection .table (self ._table_name )
@@ -71,10 +82,12 @@ def delete_package(self, package_name):
71
82
72
83
def get_package_data (self , package_name ):
73
84
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 :
76
87
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
78
91
79
92
def get_package_metadata (self , package_name ):
80
93
logging .debug ("Reading %s" , package_name )
@@ -114,12 +127,12 @@ def list_packages(self):
114
127
connection .close ()
115
128
return result
116
129
117
- def generate_record (self , metadata , package_data ):
130
+ def generate_record (self , metadata ):
118
131
return metadata ["package_name" ], {
119
132
'cf:name' : '-' .join (metadata ["package_name" ].split ("-" )[:- 1 ]),
120
133
'cf:version' : metadata ["package_name" ].split ("-" )[- 1 ],
121
134
'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" ])
123
136
}
124
137
125
138
def _read_from_db (self , key , columns ):
@@ -131,10 +144,26 @@ def _read_from_db(self, key, columns):
131
144
connection .close ()
132
145
return data
133
146
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
+
134
150
def _write_to_db (self , key , data ):
135
151
connection = happybase .Connection (self ._hbase_host )
136
152
try :
137
153
table = connection .table (self ._table_name )
138
154
table .put (key , data )
139
155
finally :
140
156
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