我對lua和aerospike很新。我想開發一個在aerospike上運行的UDF,但是我找不到可以通過選項進行調試的方法。調試aerospike lua UDF
我試圖安裝eclipse LDT,但似乎無法找到aerospike的要求。
我該怎麼做?
我嘗試了一件簡單的事情:加載一張表的所有記錄並打印。
function test(rec)
print(rec['bin1'])
end
當然我創建了表格並插入了記錄。
感謝
我對lua和aerospike很新。我想開發一個在aerospike上運行的UDF,但是我找不到可以通過選項進行調試的方法。調試aerospike lua UDF
我試圖安裝eclipse LDT,但似乎無法找到aerospike的要求。
我該怎麼做?
我嘗試了一件簡單的事情:加載一張表的所有記錄並打印。
function test(rec)
print(rec['bin1'])
end
當然我創建了表格並插入了記錄。
感謝
如果塞支持luasocket或提供一種方式來加載luasocket庫(我不能在文件中找到,如果它),你可以嘗試通過以下的instructions for remote debugging調試使用ZeroBrane Studio中的腳本。
在aerospike.com網站上有一個UDF Developer Guide,專門針對這種情況請看「Developing Record UDFs」這篇文章。要記錄集合中的所有記錄(表),您可以將記錄UDF應用於掃描。有關使用Python客戶端執行此操作的示例,請參閱aerospike.Client.scan_apply()方法。
您將需要爲UDF操作設置日誌文件進行調試,並在您的示例中記錄集合中的記錄。在您的/etc/aerospike/aerospike.conf添加logging
段,重新啓動服務:
logging {
file /var/log/aerospike/udf.log {
context any warning
context ldt info
context udf debug
context query debug
}
}
現在,您可以創建與使用info()
方法,如Lua UDF - Best Practices文章中描述的功能的Lua模塊。
我創建了一個名爲sample.lua
模塊具有記錄UDF名爲show_set
:
function show_set(rec, ns, set)
out = ''
bins = record.bin_names(rec)
for i, bin_name in ipairs(bins) do
out = out .. "'" .. tostring(bin_name) .. "'"
out = out .. '=>' .. tostring(rec[bin_name]) .. ","
end
info("show_set(%s.%s, %s): %s", ns, set, tostring(record.key(rec)), out)
end
我裝成一個簡單的Python腳本,也適用記錄UDF到掃描服務器:
import aerospike
from aerospike.exception import *
import time
config = { 'hosts': [ ('192.168.119.3', 3000)]}
client = aerospike.client(config).connect()
try:
client.udf_put('sample.lua')
time.sleep(2)
except AerospikeError as e:
print("Error: {0} [{1}]".format(e.msg, e.code))
client.put(('test','demo','key1'), {'id':1,'a':1},
policy={'key':aerospike.POLICY_KEY_SEND})
client.put(('test','demo','key2'), {'id':2,'b':2},
policy={'key':aerospike.POLICY_KEY_SEND})
client.put(('test','demo','key3'), {'id':3,'c':3},
policy={'key':aerospike.POLICY_KEY_SEND})
try:
scan_id = client.scan_apply('test', 'demo', 'sample', 'show_set', ['test',
'demo'])
while True:
response = client.scan_info(scan_id)
if (response['status'] == aerospike.SCAN_STATUS_COMPLETED) or \
response['status'] == aerospike.SCAN_STATUS_ABORTED:
break
if response['status'] == aerospike.SCAN_STATUS_COMPLETED:
print("Background scan successful")
print("Progess percentage : ", response['progress_pct'])
print("Number of scanned records : ", response['records_scanned'])
print("Background scan status : ", "SCAN_STATUS_COMPLETED")
else:
print("Scan_apply failed")
except AerospikeError as e:
print("Error: {0} [{1}]".format(e.msg, e.code))
client.close()
我跑了劇本和tail -f /var/log/aerospike/udf.log | grep show_set
:
中號ay 14 2015 21:01:47 GMT:INFO(udf):([C] :: - 1)show_set(test.demo, key1):'a'=> 1,'id'=> 1,5月14日2015 21:01:47 GMT:INFO(udf):([C] :: - 1) show_set(test.demo,key3):'c'=> 3,'id'=> 3,2015年5月14日21 :01:47 GMT: INFO(udf):([C] :: - 1)show_set(test.demo,key2):'b'=> 2,'id'=> 2,
爲你工作? –