数据对象数据对象是可以在多个 openYuanrong 函数间跨节点分布式共享访问的内存数据支持基于共享内存的高性能 put/get 访问和修改。openYuanrong 将远程对象缓存在分布式共享内存对象存储中对象存储在集群的每个节点上都会创建一个。对象引用本质上是一个指针或唯一的 ID用于引用远程对象而无需获取它实际的值它和 Future 在概念上有类似之处。openYuanrong 基于引用计数进行数据对象自动生命周期管理当引用计数为 0 时自动删除数据对象。使用限制数据对象不能被修改如果您需要修改请创建新的数据对象。单个数据对象的大小除 Java 语言外没有限制但是不能超出 openYuanrong 数据系统配置的共享内存大小。Java 语言的单个数据对象大小不能超过Integer.MAX_VALUE - 8。数据对象不保证数据可靠性当发生故障数据可能会丢失。使用get接口批量获取数据时一次获取的总数据大小不能超出 openYuanrong 数据系统的共享内存大小。创建数据对象数据对象可通过以下两种方式创建。创建完成后返回对象引用并自动增加引用计数当对象引用实例消亡时自动减小引用计数。函数调用返回对象引用。直接调用put接口返回对象引用。Python 样例importyr yr.init()object_refyr.put(123)yr.finalize()Java 样例importorg.yuanrong.Config;importorg.yuanrong.api.YR;importorg.yuanrong.runtime.client.ObjectRef;importorg.yuanrong.exception.YRException;publicclassMain{publicstaticvoidmain(String[]args)throwsYRException{YR.init(newConfig());ObjectRefobjectRefYR.put(123);YR.Finalize();}}C 样例#include yr/yr.h int main(int argc, char *argv[]) { YR::Init(YR::Config{}, argc, argv); YR::ObjectRefint objectRef YR::Putint(123); YR::Finalize(); return 0; }获取数据对象使用get接口从对象引用中获取远程对象的结果。如果当前节点的 openYuanrong 数据系统中没有该对象则自动从远端节点下载。get接口支持并行获取多个对象结果支持设置获取超时时间超时时间内如果数据对象没有产生则抛出异常。Python 样例importtimeimportyr yr.init()# Get the value of one object ref.object_refyr.put(123)assertyr.get(object_ref)123# Get the values of multiple object refs in parallel.assertyr.get([yr.put(i)foriinrange(3)])[0,1,2]# Get timeout example.yr.invokedeflong_running_function():time.sleep(10)object_reflong_running_function.invoke()try:yr.get(object_ref,3)exceptTimeoutErrorase:print(e)yr.finalize()Java样例importorg.yuanrong.Config;importorg.yuanrong.api.YR;importorg.yuanrong.runtime.client.ObjectRef;importorg.yuanrong.exception.YRException;importorg.yuanrong.storage.WaitResult;importjava.util.concurrent.TimeUnit;importjava.util.HashMap;importjava.util.ArrayList;importjava.util.List;publicclassMain{// Get timeout example.publicstaticclassMyApp{publicstaticintlongRunningFunction()throwsInterruptedException{TimeUnit.SECONDS.sleep(10);return1;}}publicstaticvoidmain(String[]args)throwsYRException{YR.init(newConfig());// Get the value of one object ref.ObjectRefobjectRefYR.put(123);System.out.println(YR.get(objectRef,30));// Get the values of multiple object refs in parallel.ListObjectRefobjectRefsnewArrayList();for(inti0;i3;i){objectRefs.add(YR.put(i));}WaitResultwaitResultYR.wait(objectRefs,objectRefs.size(),-1);for(ObjectRefref:waitResult.getReady()){System.out.println(YR.get(ref,30));}try{ObjectRefresultRefYR.function(MyApp::longRunningFunction).invoke();YR.get(resultRef,3);}catch(YRExceptione){System.out.println(e);}YR.Finalize();}}C 样例#include iostream #include yr/yr.h // Get timeout example. int LongRunningFunction() { std::this_thread::sleep_for(std::chrono::seconds(10)); return 1; } YR_INVOKE(LongRunningFunction); int main(int argc, char *argv[]) { YR::Init(YR::Config{}, argc, argv); // Get the value of one object ref. YR::ObjectRefint objectRef YR::Putint(123); std::cout *YR::Get(objectRef) std::endl; // Get the values of multiple object refs in parallel. std::vectorYR::ObjectRefint object_refs; for (int i 0; i 3; i) { object_refs.emplace_back(YR::Put(i)); } auto waitResults YR::Wait(object_refs, object_refs.size()); for (auto ref : waitResults.first) { std::cout *YR::Get(ref) std::endl; } YR::ObjectRefint object_ref YR::Function(LongRunningFunction).Invoke(); try { int result *YR::Get(object_ref, 3); } catch (YR::Exception e) { std::cout e.what() std::endl; } YR::Finalize(); return 0; }传递数据对象对象引用可以在应用程序之间自由传递对象通过分布式引用计数自动进行生命周期管理。将对象引用作为函数的顶层参数传递将对象引用作为顶层参数传递时openYuanrong 会自动调用get接口将数据对象的值获取出来传入被调函数这意味着当对象数据完全可用时才会执行任务。importyr yr.init()yr.invokedefget_nums():return[1,2,3]yr.invokedefdis_sum(args):# dis_sum 被调用时传入的是值为 [1, 2, 3]returnsum(args)refdis_sum.invoke(get_nums.invoke())# 传递给 dis_sum 的参数是一个对象引用在运行时 openYuanrong 将自动获取对象的值并传递numyr.get(ref,30)assertnum6将对象引用作为嵌套参数传递当数据对象嵌套在其他数据对象中传递时在任务中需要调用get接口来获取具体的值。数据对象嵌套传递时外层的对象引用会自动增加内层对象引用的引用计数从而保证当外层对象引用存在时内层对象引用一定不会被释放。importyr yr.init()yr.invokedefget_num(x):returnxyr.invokedefdis_sum(args):# dis_sum 被调用时传入的值为 [objref1 objref2 objref3]returnsum(yr.get(args))# 调用 get 时objref1/objref2/objref3 的值才会传输到当前机器。objref1get_num.invoke(1)# 此处返回 object ref发出调用请求后即可返回无需等待 get_num 执行完成objref2get_num.invoke(2)objref3get_num.invoke(3)objrefyr.put([objref1,objref2,objref3])# 嵌套传递 object refrefdis_sum.invoke(objref)numyr.get(ref,30)assertnum6数据对象溢出到磁盘数据对象数据存储在 openYuanrong 数据系统的共享内存中当内存不足时支持自动将数据溢出到磁盘并从内存中删除数据。当数据需要读取时自动从磁盘中加载到共享内存。需要注意当磁盘空间也不足时数据对象会写入失败。使用数据对象溢出功能需要在部署时指定相关参数默认为关闭。# 指定 object 溢出到磁盘的路径如果配置为空表示禁止使用 object 溢出功能。spillDirectory:数据对象溢出有以下参数可用于设置磁盘空间上限、溢出的并发线程、文件大小等参数用于性能调优。# 指定溢出到磁盘时占用的最大磁盘空间单位是字节。当配置为 0 时openYuanrong 会采用openYuanrong 集群拉起时的磁盘剩余空间的 95% 作为最大可占用空间。# 当 spillDirectory 配置目录是独占磁盘时建议将该值配置为 0由系统自动计算可用值。否则建议按实际的磁盘空间规划配置该值。spillSizeLimit:0# 指定向磁盘写数据时的最大并行度当磁盘性能非常高时可尝试将该值调高提升性能。spillThreadNum:8# 指定溢出到磁盘上的单个文件大小。单位为 MB取值范围200-10240。# 当对象较小时多个对象合并写入到一个文件中。当对象很大且超出该值时每个文件一个对象。spillFileMaxSizeMb:200# 用于指定对象溢出最大打开的文件句柄数。当该值被调小时可能会降低性能。spillFileOpenLimit:512# 是否允许文件系统的预读功能。当设置为 false 时关闭文件系统的预读功能可减少读放大但可能会影响性能。spillEnableReadahead:true更多信息openYuanrong 也提供了近计算 KV 缓存能力基于共享内存实现免拷贝的 KV 数据读写。查看KV 缓存开发指南。
openYuanrong开发指南——数据对象
数据对象数据对象是可以在多个 openYuanrong 函数间跨节点分布式共享访问的内存数据支持基于共享内存的高性能 put/get 访问和修改。openYuanrong 将远程对象缓存在分布式共享内存对象存储中对象存储在集群的每个节点上都会创建一个。对象引用本质上是一个指针或唯一的 ID用于引用远程对象而无需获取它实际的值它和 Future 在概念上有类似之处。openYuanrong 基于引用计数进行数据对象自动生命周期管理当引用计数为 0 时自动删除数据对象。使用限制数据对象不能被修改如果您需要修改请创建新的数据对象。单个数据对象的大小除 Java 语言外没有限制但是不能超出 openYuanrong 数据系统配置的共享内存大小。Java 语言的单个数据对象大小不能超过Integer.MAX_VALUE - 8。数据对象不保证数据可靠性当发生故障数据可能会丢失。使用get接口批量获取数据时一次获取的总数据大小不能超出 openYuanrong 数据系统的共享内存大小。创建数据对象数据对象可通过以下两种方式创建。创建完成后返回对象引用并自动增加引用计数当对象引用实例消亡时自动减小引用计数。函数调用返回对象引用。直接调用put接口返回对象引用。Python 样例importyr yr.init()object_refyr.put(123)yr.finalize()Java 样例importorg.yuanrong.Config;importorg.yuanrong.api.YR;importorg.yuanrong.runtime.client.ObjectRef;importorg.yuanrong.exception.YRException;publicclassMain{publicstaticvoidmain(String[]args)throwsYRException{YR.init(newConfig());ObjectRefobjectRefYR.put(123);YR.Finalize();}}C 样例#include yr/yr.h int main(int argc, char *argv[]) { YR::Init(YR::Config{}, argc, argv); YR::ObjectRefint objectRef YR::Putint(123); YR::Finalize(); return 0; }获取数据对象使用get接口从对象引用中获取远程对象的结果。如果当前节点的 openYuanrong 数据系统中没有该对象则自动从远端节点下载。get接口支持并行获取多个对象结果支持设置获取超时时间超时时间内如果数据对象没有产生则抛出异常。Python 样例importtimeimportyr yr.init()# Get the value of one object ref.object_refyr.put(123)assertyr.get(object_ref)123# Get the values of multiple object refs in parallel.assertyr.get([yr.put(i)foriinrange(3)])[0,1,2]# Get timeout example.yr.invokedeflong_running_function():time.sleep(10)object_reflong_running_function.invoke()try:yr.get(object_ref,3)exceptTimeoutErrorase:print(e)yr.finalize()Java样例importorg.yuanrong.Config;importorg.yuanrong.api.YR;importorg.yuanrong.runtime.client.ObjectRef;importorg.yuanrong.exception.YRException;importorg.yuanrong.storage.WaitResult;importjava.util.concurrent.TimeUnit;importjava.util.HashMap;importjava.util.ArrayList;importjava.util.List;publicclassMain{// Get timeout example.publicstaticclassMyApp{publicstaticintlongRunningFunction()throwsInterruptedException{TimeUnit.SECONDS.sleep(10);return1;}}publicstaticvoidmain(String[]args)throwsYRException{YR.init(newConfig());// Get the value of one object ref.ObjectRefobjectRefYR.put(123);System.out.println(YR.get(objectRef,30));// Get the values of multiple object refs in parallel.ListObjectRefobjectRefsnewArrayList();for(inti0;i3;i){objectRefs.add(YR.put(i));}WaitResultwaitResultYR.wait(objectRefs,objectRefs.size(),-1);for(ObjectRefref:waitResult.getReady()){System.out.println(YR.get(ref,30));}try{ObjectRefresultRefYR.function(MyApp::longRunningFunction).invoke();YR.get(resultRef,3);}catch(YRExceptione){System.out.println(e);}YR.Finalize();}}C 样例#include iostream #include yr/yr.h // Get timeout example. int LongRunningFunction() { std::this_thread::sleep_for(std::chrono::seconds(10)); return 1; } YR_INVOKE(LongRunningFunction); int main(int argc, char *argv[]) { YR::Init(YR::Config{}, argc, argv); // Get the value of one object ref. YR::ObjectRefint objectRef YR::Putint(123); std::cout *YR::Get(objectRef) std::endl; // Get the values of multiple object refs in parallel. std::vectorYR::ObjectRefint object_refs; for (int i 0; i 3; i) { object_refs.emplace_back(YR::Put(i)); } auto waitResults YR::Wait(object_refs, object_refs.size()); for (auto ref : waitResults.first) { std::cout *YR::Get(ref) std::endl; } YR::ObjectRefint object_ref YR::Function(LongRunningFunction).Invoke(); try { int result *YR::Get(object_ref, 3); } catch (YR::Exception e) { std::cout e.what() std::endl; } YR::Finalize(); return 0; }传递数据对象对象引用可以在应用程序之间自由传递对象通过分布式引用计数自动进行生命周期管理。将对象引用作为函数的顶层参数传递将对象引用作为顶层参数传递时openYuanrong 会自动调用get接口将数据对象的值获取出来传入被调函数这意味着当对象数据完全可用时才会执行任务。importyr yr.init()yr.invokedefget_nums():return[1,2,3]yr.invokedefdis_sum(args):# dis_sum 被调用时传入的是值为 [1, 2, 3]returnsum(args)refdis_sum.invoke(get_nums.invoke())# 传递给 dis_sum 的参数是一个对象引用在运行时 openYuanrong 将自动获取对象的值并传递numyr.get(ref,30)assertnum6将对象引用作为嵌套参数传递当数据对象嵌套在其他数据对象中传递时在任务中需要调用get接口来获取具体的值。数据对象嵌套传递时外层的对象引用会自动增加内层对象引用的引用计数从而保证当外层对象引用存在时内层对象引用一定不会被释放。importyr yr.init()yr.invokedefget_num(x):returnxyr.invokedefdis_sum(args):# dis_sum 被调用时传入的值为 [objref1 objref2 objref3]returnsum(yr.get(args))# 调用 get 时objref1/objref2/objref3 的值才会传输到当前机器。objref1get_num.invoke(1)# 此处返回 object ref发出调用请求后即可返回无需等待 get_num 执行完成objref2get_num.invoke(2)objref3get_num.invoke(3)objrefyr.put([objref1,objref2,objref3])# 嵌套传递 object refrefdis_sum.invoke(objref)numyr.get(ref,30)assertnum6数据对象溢出到磁盘数据对象数据存储在 openYuanrong 数据系统的共享内存中当内存不足时支持自动将数据溢出到磁盘并从内存中删除数据。当数据需要读取时自动从磁盘中加载到共享内存。需要注意当磁盘空间也不足时数据对象会写入失败。使用数据对象溢出功能需要在部署时指定相关参数默认为关闭。# 指定 object 溢出到磁盘的路径如果配置为空表示禁止使用 object 溢出功能。spillDirectory:数据对象溢出有以下参数可用于设置磁盘空间上限、溢出的并发线程、文件大小等参数用于性能调优。# 指定溢出到磁盘时占用的最大磁盘空间单位是字节。当配置为 0 时openYuanrong 会采用openYuanrong 集群拉起时的磁盘剩余空间的 95% 作为最大可占用空间。# 当 spillDirectory 配置目录是独占磁盘时建议将该值配置为 0由系统自动计算可用值。否则建议按实际的磁盘空间规划配置该值。spillSizeLimit:0# 指定向磁盘写数据时的最大并行度当磁盘性能非常高时可尝试将该值调高提升性能。spillThreadNum:8# 指定溢出到磁盘上的单个文件大小。单位为 MB取值范围200-10240。# 当对象较小时多个对象合并写入到一个文件中。当对象很大且超出该值时每个文件一个对象。spillFileMaxSizeMb:200# 用于指定对象溢出最大打开的文件句柄数。当该值被调小时可能会降低性能。spillFileOpenLimit:512# 是否允许文件系统的预读功能。当设置为 false 时关闭文件系统的预读功能可减少读放大但可能会影响性能。spillEnableReadahead:true更多信息openYuanrong 也提供了近计算 KV 缓存能力基于共享内存实现免拷贝的 KV 数据读写。查看KV 缓存开发指南。