UDF需要加载资源的问题

phili joe
2010-07-08
2012-10-08
  • phili joe
    phili joe
    2010-07-08

    如果一个任务需要加载一些额外的资源才能执行,比如中文分词需要加载中文词表,用spere实现这个功能,定义一个UDF函数来实现分词功能,如果加载词表的操作放在
    UDF中,那么每次执行分词操作都要重新加载一次分词词表,加载分词词表又是一个开销相对较大的操作,这个任务有没有其他解决方法?谢谢!

     
  • Yunhong Gu
    Yunhong Gu
    2010-07-08

    在./slave/sphere里,你可以把分词列表放进去,这样每次slave启动时,会把它放进SLAVE_DATA_DIR/.sphere/perm里,你可
    以用UDF访问,不用每次都上传。以后的版本也会支持loadOperator直接upload到permanent directory。

     
  • phili joe
    phili joe
    2010-07-10

    谢谢lilyco!
    你的意思是不是按你这样词表文件可以被自动复制到permanent directory中然后在slave在执行UDF时就可以访问到这个文件了。但还有一个问题:
    UDF在分词时是需要把整个词表文件加载到内存中然后才能对一篇文章分词,假设每一篇文章的分词都需要调用一次UDF,那么也就是说每一篇文章的分词都需要重新把词表
    文件载入到内存中一次,这是个很大的浪费。在map reduce 中对这个问题的处理叫“次要数据的分布”,处理方法是使用hadoop提供的分布式缓存。在Sec
    tor/Sphere中有没有类似的分布式缓存机制可以让一个资源常驻内存,然后在slave执行UDF时可以访问到。谢谢!

     
  • Yunhong Gu
    Yunhong Gu
    2010-07-10

    有的,但是还没有文档里还没有提到。在UDF里,最后一个参数,SFile,有一个成员是m_pInMemoryObjects,关于它的定义你可以在./inclu
    de/sphere.h里找到。你可以用它把你想留在内存里的数据注册,这样以后的UDF可以用m_pInMemoryObjects找到你注册的数据结构。这个常住
    内存的结构在Sphere里叫In-memory Object。最后不用的时候,你可以释放掉,并且在m_pInMemoryObjects取消注册。

     
  • phili joe
    phili joe
    2010-07-11

    ok, 多谢了