精华内容
下载资源
问答
  • 点击科技的竞开(Geneking)协同办公系统投入应用后,有效地解决了大庆采油二厂各职能部门实际工作中的沟通、协作问题,满足了部门人员 之间工作、沟通的需求,为采油二厂提供了一个高度互动、个性化的工作环境,同时...
  • 基于 Apache Mahout 实现高效协同过滤推荐 Apache Mahout 是 Apache Software Foundation (ASF) 旗下的一个开源项目,提供一些可扩展的机器学习领域经典算法的实现,旨在帮助开发人员更加方便快捷地创建智能...

    基于 Apache Mahout 实现高效的协同过滤推荐

    Apache Mahout 是 Apache Software Foundation (ASF) 旗下的一个开源项目,提供一些可扩展的机器学习领域经典算法的实现,旨在帮助开发人员更加方便快捷地创建智能应用程序,并且,在 Mahout 的最近版本中还加入了对 Apache Hadoop 的支持,使这些算法可以更高效的运行在云计算环境中。

    关于 Apache Mahout 的安装和配置请参考《基于 Apache Mahout 构建社会化推荐引擎》,它是笔者 09 年发表的一篇关于基于 Mahout 实现推荐引擎的 developerWorks 文章,其中详细介绍了 Mahout 的安装步骤,并给出一个简单的电影推荐引擎的例子。

    Apache Mahout 中提供的一个协同过滤算法的高效实现,它是一个基于 Java 实现的可扩展的,高效的推荐引擎。图 4 给出了 Apache Mahout 中协同过滤推荐实现的组件图,下面我们逐步深入介绍各个部分。

    图 4.组件图
    图 4 组件图

    数据表示:Data Model

    Preference

    基于协同过滤的推荐引擎的输入是用户的历史偏好信息,在 Mahout 里它被建模为 Preference(接口),一个 Preference 就是一个简单的三元组 < 用户 ID, 物品 ID, 用户偏好 >,它的实现类是 GenericPreference,可以通过以下语句创建一个 GenericPreference。

    GenericPreference preference = new GenericPreference(123, 456, 3.0f);

    这其中, 123 是用户 ID,long 型;456 是物品 ID,long 型;3.0f 是用户偏好,float 型。从这个例子我们可以看出,单单一个 GenericPreference 的数据就占用 20 bytes,所以你会发现如果只简单实用数组 Array 加载用户偏好数据,必然占用大量的内存,Mahout 在这方面做了一些优化,它创建了 PreferenceArray(接口)保存一组用户偏好数据,为了优化性能,Mahout 给出了两个实现类,GenericUserPreferenceArray 和 GenericItemPreferenceArray,分别按照用户和物品本身对用户偏好进行组装,这样就可以压缩用户 ID 或者物品 ID 的空间。下面清单 1 的代码以 GenericUserPreferenceArray 为例,展示了如何创建和使用一个 PreferenceArray。

    清单 1. 创建和使用 PreferenceArray
     PreferenceArray userPref = new GenericUserPreferenceArray(2); //size = 2 
    
     userPref.setUserID(0, 1L); 
    
     userPref.setItemID(0, 101L);  //<1L, 101L, 2.0f> 
     userPref.setValue(0, 2.0f); 
     userPref.setItemID(1, 102L);  //<1L, 102L, 4.0f> 
     userPref.setValue(1, 4.0f); 
    
     Preference pref = userPref.get(1);   //<1L, 102L, 4.0f>

    为了提高性能 Mahout 还构建了自己的 HashMap 和 Set:FastByIDMap 和 FastIDSet,有兴趣的朋友可以参考 Mahout 官方说明。

    DataModel

    Mahout 的推荐引擎实际接受的输入是 DataModel,它是对用户偏好数据的压缩表示,通过创建内存版 DataModel 的语句我们可以看出:

    DataModel model = new GenericDataModel(FastByIDMap<PreferenceArray> map);

    他保存在一个按照用户 ID 或者物品 ID 进行散列的 PreferenceArray,而 PreferenceArray 中对应保存着这个用户 ID 或者物品 ID 的所有用户偏好信息。

    DataModel 是用户喜好信息的抽象接口,它的具体实现支持从任意类型的数据源抽取用户喜好信息,具体实现包括内存版的 GenericDataModel,支持文件读取的 FileDataModel 和支持数据库读取的 JDBCDataModel,下面我们看看如何创建各种 DataModel。

    清单 2. 创建各种 DataModel
     //In-memory DataModel - GenericDataModel 
     FastByIDMap<PreferenceArray> preferences = new FastByIDMap<PreferenceArray>(); 
    
     PreferenceArray prefsForUser1 = new GenericUserPreferenceArray(10);  
     prefsForUser1.setUserID(0, 1L); 
     prefsForUser1.setItemID(0, 101L); 
     prefsForUser1.setValue(0, 3.0f);  
     prefsForUser1.setItemID(1, 102L); 
     prefsForUser1.setValue(1, 4.5f); 
    … (8 more) 
     preferences.put(1L, prefsForUser1);   //use userID as the key 
    … (more users) 
    
     DataModel model = new GenericDataModel(preferences); 
    
     //File-based DataModel - FileDataModel 
     DataModel dataModel = new FileDataModel(new File("preferences.csv"); 
    
     //Database-based DataModel - MySQLJDBCDataModel 
     MysqlDataSource dataSource = new MysqlDataSource(); 
     dataSource.setServerName("my_user"); 
     dataSource.setUser("my_password"); 
     dataSource.setPassword("my_database_host"); 
     JDBCDataModel dataModel = new MySQLJDBCDataModel(dataSource, "my_prefs_table", 
     "my_user_column", "my_item_column", "my_pref_value_column");

    支持文件读取的 FileDataModel,Mahout 没有对文件的格式做过多的要求,只要文件的内容满足以下格式:

    • 每一行包括用户 ID, 物品 ID, 用户偏好
    • 逗号隔开或者 Tab 隔开
    • *.zip 和 *.gz 文件会自动解压缩(Mahout 建议在数据量过大时采用压缩的数据存储)

    支持数据库读取的 JDBCDataModel,Mahout 提供一个默认的 MySQL 的支持,它对用户偏好数据的存放有以下简单的要求:

    • 用户 ID 列需要是 BIGINT 而且非空
    • 物品 ID 列需要是 BIGINT 而且非空
    • 用户偏好列需要是 FLOAT

    建议在用户 ID 和物品 ID 上建索引。

    实现推荐:Recommender

    介绍完数据表示模型,下面介绍 Mahout 提供的协同过滤的推荐策略,这里我们选择其中最经典的三种,User CF, Item CF 和 Slope One。

    User CF

    前面已经详细介绍了 User CF 的原理,这里我们着重看怎么基于 Mahout 实现 User CF 的推荐策略,我们还是从一个例子入手:

    清单 3. 基于 Mahout 实现 User CF
     DataModel model = new FileDataModel(new File("preferences.dat")); 
     UserSimilarity similarity = new PearsonCorrelationSimilarity(model); 
     UserNeighborhood neighborhood = new NearestNUserNeighborhood(100, similarity, model); 
     Recommender recommender = new GenericUserBasedRecommender(model, 
     neighborhood, similarity);
    1. 从文件建立 DataModel,我们采用前面介绍的 FileDataModel,这里假设用户的喜好信息存放在 preferences.dat 文件中。
    2. 基于用户偏好数据计算用户的相似度,清单中采用的是 PearsonCorrelationSimilarity,前面章节曾详细介绍了各种计算相似度的方法,Mahout 中提供了基本的相似度的计算,它们都 UserSimilarity 这个接口,实现用户相似度的计算,包括下面这些常用的:
    • PearsonCorrelationSimilarity:基于皮尔逊相关系数计算相似度
    • EuclideanDistanceSimilarity:基于欧几里德距离计算相似度
    • TanimotoCoefficientSimilarity:基于 Tanimoto 系数计算相似度
    • UncerteredCosineSimilarity:计算 Cosine 相似度

    ItemSimilarity 也是类似的:

    1. 根据建立的相似度计算方法,找到邻居用户。这里找邻居用户的方法根据前面我们介绍的,也包括两种:“固定数量的邻居”和“相似度门槛邻居”计算方法,Mahout 提供对应的实现:
      • NearestNUserNeighborhood:对每个用户取固定数量 N 的最近邻居
      • ThresholdUserNeighborhood:对每个用户基于一定的限制,取落在相似度门限内的所有用户为邻居。
    2. 基于 DataModel,UserNeighborhood 和 UserSimilarity 构建 GenericUserBasedRecommender,实现 User CF 推荐策略。

    Item CF

    了解了 User CF,Mahout Item CF 的实现与 User CF 类似,是基于 ItemSimilarity,下面我们看实现的代码例子,它比 User CF 更简单,因为 Item CF 中并不需要引入邻居的概念:

    清单 4. 基于 Mahout 实现 Item CF
     DataModel model = new FileDataModel(new File("preferences.dat")); 
     ItemSimilarity similarity = new PearsonCorrelationSimilarity(model); 
     Recommender recommender = new GenericItemBasedRecommender(model, similarity);

    Slope One

    如前面介绍的,User CF 和 Item CF 是最常用最容易理解的两种 CF 的推荐策略,但在大数据量时,它们的计算量会很大,从而导致推荐效率较差。因此 Mahout 还提供了一种更加轻量级的 CF 推荐策略:Slope One。

    Slope One 是有 Daniel Lemire 和 Anna Maclachlan 在 2005 年提出的一种对基于评分的协同过滤推荐引擎的改进方法,下面简单介绍一下它的基本思想。

    图 5 给出了例子,假设系统对于物品 A,物品 B 和物品 C 的平均评分分别是 3,4 和 4。基于 Slope One 的方法会得到以下规律:

    • 用户对物品 B 的评分 = 用户对物品 A 的评分 + 1
    • 用户对物品 B 的评分 = 用户对物品 C 的评分

    基于以上的规律,我们可以对用户 A 和用户 B 的打分进行预测:

    • 对用户 A,他给物品 A 打分 4,那么我们可以推测他对物品 B 的评分是 5,对物品 C 的打分也是 5。
    • 对用户 B,他给物品 A 打分 2,给物品 C 打分 4,根据第一条规律,我们可以推断他对物品 B 的评分是 3;而根据第二条规律,推断出评分是 4。当出现冲突时,我们可以对各种规则得到的推断进行就平均,所以给出的推断是 3.5。

    这就是 Slope One 推荐的基本原理,它将用户的评分之间的关系看作简单的线性关系:

    Y = mX + b;

    当 m = 1 时就是 Slope One,也就是我们刚刚展示的例子。

    图 5.Slope One 推荐策略示例
    图 5 Slope One 推荐策略示例

    Slope One 的核心优势是在大规模的数据上,它依然能保证良好的计算速度和推荐效果。Mahout 提供了 Slope One 推荐方法的基本实现,实现代码很简单,参考清单 5.

    清单 5. 基于 Mahout 实现 Slope One
     //In-Memory Recommender 
     DiffStorage diffStorage = new MemoryDiffStorage(model, Weighting.UNWEIGHTED, false, 
     Long.MAX_VALUE)); 
     Recommender recommender = new SlopeOneRecommender(model, Weighting.UNWEIGHTED, 
     Weighting.UNWEIGHTED, diffStorage);  
    
     //Database-based Recommender 
     AbstractJDBCDataModel model = new MySQLJDBCDataModel(); 
     DiffStorage diffStorage = new MySQLJDBCDiffStorage(model); 
     Recommender recommender = new SlopeOneRecommender(model, Weighting.WEIGHTED, 
     Weighting.WEIGHTED, diffStorage);

    1. 根据 Data Model 创建数据之间线性关系的模型 DiffStorage。

    2. 基于 Data Model 和 DiffStorage 创建 SlopeOneRecommender,实现 Slope One 推荐策略。

    总结

    Web2.0 的一个核心思想就是“集体智慧”,基于协同过滤的推荐策略的基本思想就是基于大众行为,为每个用户提供个性化的推荐,从而使用户能更快速更准确的发现所需要的信息。从应用角度分析,现今比较成功的推荐引擎,比如 Amazon,豆瓣,当当等都采用了协同过滤的方式,它不需要对物品或者用户进行严格的建模,而且不要求物品的描述是机器可理解的,是中领域无关的推荐方法,同时这个方法计算出来的推荐是开放的,可以共用他人的经验,很好的支持用户发现潜在的兴趣偏好。基于协同过滤的推荐策略也有不同的分支,它们有不同的实用场景和推荐效果,用户可以根据自己应用的实际情况选择合适的方法,异或组合不同的方法得到更好的推荐效果。

    除此之外,本文还介绍了如何基于 Apache Mahout 高效实现协同过滤推荐算法,Apache Mahout 关注海量数据上的机器学习经典算法的高效实现,其中对基于协同过滤的推荐方法也提供了很好的支持,基于 Mahout 你可以轻松的体验高效推荐的神奇。

    作为深入推荐引擎相关算法的第一篇文章,本文深入介绍了协同过滤算法,并举例介绍了如何基于 Apache Mahout 高效实现协同过滤推荐算法,Apache Mahout 作为海量数据上的机器学习经典算法的高效实现,其中对基于协同过滤的推荐方法也提供了很好的支持,基于 Mahout 你可以轻松的体验高效推荐的神奇。但我们也发现了在海量数据上高效的运行协同过滤算法以及其他推荐策略这样高复杂的算法还是有很大的挑战的。在面对这个问题的过程中,大家提出了很多减少计算量的方法,而聚类无疑是其中最优的选择。所以本系列的下一篇文章将详细介绍各类聚类算法,它们的原理,优缺点和实用场景,并给出基于 Apache Mahout 的聚类算法的高效实现,并分析在推荐引擎的实现中,如何通过引入聚类来解决大数据量造成的海量计算,从而提供高效的推荐。

    最后,感谢大家对本系列的关注和支持。

    展开全文
  • 公路上的突发情况增多,如何用视频监控各收费站的实时状况,确保工作质量的提升,提高服务水平,烟台公路局建设网络平台之初重点考虑的是降低通信费用的同时,能够提供优质、高效的服务,并一个平台上实现多种...
  • 5G边缘计算工业网关,边缘计算就近处理海量数据,实现工厂大量设备高效协同工作,智能化自动化管理。 使用边缘技术,可以更靠近边缘的地方运行人工智能和机器学习工作负载,而不必向云端发送大量数据。智能工厂...

    5G边缘计算工业网关,边缘计算就近处理海量数据,实现工厂大量设备高效协同工作,智能化自动化管理。

    使用边缘技术,可以在更靠近边缘的地方运行人工智能和机器学习工作负载,而不必向云端发送大量数据。在智能工厂制造领域,工厂利用边缘计算智能网关进行本地数据采集,并进行数据过滤、清洗等实时处理。同时边缘计算还可以提供跨层协议转换的能力,实现碎片化工业网络的统一接入。
    在这里插入图片描述

    5G边缘计算网关智能工厂应用
    工业物联网边缘是5G工业物联网设备、其数据和应用于该数据的边缘智能的组合。工业物联网的优势可以应用于智能工厂,包括最流行的用例之一:制造工厂。当边缘计算与私有5G相结合时,智能工厂可以将其所有工业物联网传感器连接到边缘计算设备上。5G边缘计算网关可以使用专用5G无线传输工业物联网数据到其他分支机构或总部。

    5G边缘计算工业网关功能配置
    在这里插入图片描述

    1、边缘计算,实现终端数据处理优化,为数据安全提供条件,有效减轻平台服务端压力。
    2、通信方式、支持WAN/LAN、ADSL、GPRS、 4G、5G、WIFI(可选)、GPS(可选)、可选NB-IOT。
    3、行业接口丰富,满足感知层传感设备等接入,RS232接口 、RS485接口、I2C接口、TTL电平串口、开关量输入接口、 模拟量输入接口、继电器输出、电源输出(外设供电)。
    4、协议丰富,支持ModbusRTU、ModbusTCP、MQTT、OPC、HTTP、环保212规约、住建部能耗规约,支持定制第三方的上位机通信协议。
    5、采用ARM架构高能效处理器作为主控、采用Linux作为操作系统。
    6、本地数据存储、定时采集上报、远程查询实时数据、支持视频传输、支持视频数据叠加、支持图片抓拍功能(定制)、支持外接LED屏。
    7、支持远程管理、支持远程程序升级。

    展开全文
  • 天地一体化网络资源协同调度技术的研究与实现,章润,徐鹏,天地一体化网络,网络拓扑复杂,节点状态难以获取,资源协同调度受到资源、时间窗口、通信等约束。因此,实现高效的资源协同
  • 那如何借助移动互联,让我们的工作和生活变得更加轻松和智能,成为众多企业越来越关注的问题,爱思华宝邮件服务器及其协同工作服务,帮助您利用碎片化的时间,让日程管理更轻松,让沟通更高效,让员工实现更多的互动...


            伴随移动互联网浪潮的到来,移动办公已经成为当前企业办公环境不可或缺的重要组成部分,时时在线、随时随地办公的需求会越来越迫切。那如何借助移动互联,让我们的工作和生活变得更加轻松和智能,成为众多企业越来越关注的问题,爱思华宝邮件服务器及其协同工作服务,帮助您利用碎片化的时间,让日程管理更轻松,让沟通更高效,让员工实现更多的互动,从而增加企业凝聚力。

          企业在交流与业务协作的同时,如何把沟通和协作做到一体化,如何突破PC端和移动端的无缝连接,如何实现办公电脑与移动设备手机、平板功能的统一,这就是爱思华宝邮件服务器的核心功能----协同工作服务带给大家的。
           爱思华宝协同工作服务在企业邮件收发的基本功能上,提供管理个人及公司日程安排、企业内全局地址簿、任务、资源、以及会议邀请。群组 & 公共文件夹依据权限划分实现文件共享、网盘服务。邮件、日历、以及联系人数据与移动设备的同步等功能。
           企业用户,除了可以在手机端同步用户个人数据,亦可以为部门建立部门账号,部门成员添加部门账号到手机中,方便了解本部门共享信息,比如共享的办公文档、通讯录、日历日程、提醒事项和备忘录信息等。当其中一个用户更新信息,全体用户都可以第一时间在电脑及手机、平板客户端了解到最新更新内容,从而有效提高全体用户的协同办公能力,提高工作效率!

           下面,我们来看看爱思华宝协同工作服务在各客户端的实现方法:

    一、桌面电脑 WebMail 的使用


    (1)、登录 WebMail 




    (2)、新建日历项目


    单击左侧 日历 选项卡,右侧区域显示日历界面,在对应日期双击,添加新日历项目,出现新建日历对话框,在标题中输入日历名称,日期中指定日程开始和结束日期,内容文本框中输入具体日历内容。指定是否需要到期提醒。点击确定,保存退出。






    二、IPhone 手机客户端设置方法
    1、在 IPhone 中添加邮箱帐户,同步日程安排。


    (1)、前往 设置,选择 邮件,通讯录,日历 – 添加账户 - Exchange 选项。
    选择Exchange 选项,除了可以实现基本邮件收发同步,更加可以实现个人及企业日历日程安排、联系人数据与移动设备的同步。
      
            

    (2)、在下一个画面, 填写 电子邮件, 密码, 描述 字段,点击下一步。

       


    在下一个画面, 可以通过滑动控制器选择性地关闭你不需要使用的功能,默认是全部打开,手机同步服务器的邮件、通讯录、日历、提醒事项和备忘录。点击存储,保存设置。
     


       
    同步之后,立即可以手机上查看电脑端的用户数据,包括邮箱中邮件、通讯录、日历日程、提醒事项和备忘录信息。同样道理,在手机、平板等移动设备上创建的日历日程等内容,同样可以在电脑设备的WebMail & Outlook 等邮件客户端上同步查看、编辑。



    如上图所示,在电脑端 WebMail 日历中添加的复活节放假通知,被同步到手机的日历中,可以查看或编辑修改。有了爱思华宝邮件服务器,即可拥有企业协同办公服务,有效提高工作效率。

    后面,我们会陆续连载,提供爱思华宝产品在企业邮件服务、协同办公等方面的更多应用。


    联系方式

    爱思华宝信息系统(深圳)有限公司
    IceWarp China Ltd. 


    Alan Zhang

    Tel:13682308096


    Email:alan.zhang@icewarp.cn 

    QQ: 337600239

      

    展开全文
  • 高效快速掘进系统的协同控制需要以工作面采掘、支护、运输工艺为基础,实现采掘、破碎、支护等多个移动设备之间协同行走和运输系统联动控制。针对上述需求,将高效快速掘进系统各设备的电控系统通过无线通信装置进行...
  • 简介:OpenYurt 是阿里巴巴开源的云边协同一体化架构,与同类开源方案相比,OpenYurt 拥有可实现边缘计算全场景覆盖的能力。...之前的一篇文章,我们介绍了 OpenYurt 是如何弱网和断网场景下实现边缘自
    简介:OpenYurt 是阿里巴巴开源的云边协同一体化架构,与同类开源方案相比,OpenYurt 拥有可实现边缘计算全场景覆盖的能力。本文作为 OpenYurt 系列文章的第四篇,我们将着重介绍 OpenYurt 的另一个核心能力——云边通信,以及相关组件 Yurttunnel。

    头图.png

    作者 | 郑超

    导读:OpenYurt 是阿里巴巴开源的云边协同一体化架构,与同类开源方案相比,OpenYurt 拥有可实现边缘计算全场景覆盖的能力。在之前的一篇文章中,我们介绍了 OpenYurt 是如何在弱网和断网场景下实现边缘自治的。本文作为 OpenYurt 系列文章的第四篇,我们将着重介绍 OpenYurt 的另一个核心能力——云边通信,以及相关组件 Yurttunnel。

    使用场景

    在应用的部署和运维过程中,用户常常需要获取应用的日志,或直接登录到应用的运行环境中进行调试。在 Kubernetes 环境中,我们通常使用 kubectl log,kubectl exec 等指令来实现这些需求。如下图所示,在 kubectl 请求链路上, kubelet 将扮演服务器端,负责处理由 kube-apiserver(KAS) 转发来的请求,这就要求 KAS 和 kubelet 之间需要存在一条网络通路,允许 KAS 主动访问 kubelet

    1.png
    图一:kubectl 执行流程

    然而,在边缘计算场景中,边缘节点常位于本地专有网络中,这虽然保证了边缘节点的安全,但也造成位于云端管控节点的 KAS 无法直接访问位于边缘节点的 kubelet。因此,为了支持通过云端节点对边缘端应用进行运维操作,我们必须在云、边之间建立反向运维通道。

    反向通道

    Yurttunnel 是 OpenYurt 近期开源的一个重要组件,用来解决云边通信问题。反向通道是解决跨网络通信的一种常见方式,而 Yurttunnel 的本质就是一个反向通道。一个边缘集群下属的节点常位于不同的 network region 中,而位于同一个 region 内的节点之间是可以相互通信的,因此在设置反向通道时,我们只需保证在每个 region 内设置一个与 proxy server 相连的 agent 即可(如下图所示)。具体包括以下几个步骤:

    • 在管控组件所在网络内,部署 proxy server。
    • proxy server 对外开放一个公网可以访问的 IP。
    • 在每个 region 部署个 agent,并通过 server 的公网 IP 与 server 建立长连接。
    • 管控组件对边缘节点的访问请求都将转发致 proxy server。
    • proxy server 再将请求通过对应的长连接发往目标节点。

    2.png
    图二

    在 Yurttunnel 中,我们选择使用上游项目 apiserver-network-proxy(ANP) 来实现 server 和 agent 间的通信。ANP 是基于 kubernetes 1.16 Alpha 新功能 EgressSelector 开发,意在实现 Kubernetes 集群组件的跨 intranet 通信(例如,master 位于管控 VPC,而 kubelet 等其他组件位于用户 VPC)。

    读者可能会好奇,既然 OpenYurt 是基于 ACK@Edge 开源的,而在生产环境中, ACK@Edge 的云边运维通道使用的是自研组件 tunnellib,那为什么在开源版本里我们要选用一个新的组件呢? 这里不得不再次提到 OpenYurt 的核心设计理念 “Extend upstream Kubernetes to Edge”

    诚然,tunnellib 经过了复杂线上环境的考验,组件性能稳定,但我们更希望能与上游保持最大的技术公约数,让 OpenYurt 的用户体验更接近原生 Kubernetes ;同时,在 ACK@Edge 的开发和运维过程中,我们发现,边缘集群的许多需求也同样存在于其他场景中(例如,大多数云厂商也需要实现节点跨网络通信),并且运维通道的传输效率也能进一步优化(4.5章将详述优化过程)。因此,秉承开放分享、平等普惠的开源精神,我们希望能将开发和运维过程中积累的的宝贵经验在上游社区与更多的开发者分享。

    ANP 并非开箱即用

    然而 ANP 项目仍处于起步阶段,功能尚未完善,许多问题仍有待解决。我们从实践中发现的主要问题包括:

    • 如何转发云端节点的请求 -- 反向通道正常工作的一个前提是,管控节点发往边缘节点的请求必须先经过 proxy server。对于 Kubernetes 1.16 + 版本,KAS 能借由 EgressSelector 将发往节点的请求先发往指定的 proxy server。但对于 1.16 以前的版本,KAS 及其他管控组件(Prometheus 和 metrics server)只能直接访问节点,而不能绕道 proxy server。可以预见的是,部分用户在短期内,仍将使用 1.16 以前的版本,并且 Prometheus 和 metrics server 等管控组件在短期内也没有支持 EgressSelector 的计划。因此,我们要解决的第一个问题是,如何将管控组件发往节点的请求转发致 proxy server
    • 如何确保 server 副本覆盖所有的 region -- 在生产环境中,一个边缘集群常常包含上万个节点,并同时服务上百名用户,如果一个集群只有一个 proxy server, 那么,一旦 proxy server 出现故障,所有用户都将无法对位于边缘节点上的 pod 进行操作。因此,我们必须同时部署多个 proxy server 副本以保证集群高可用。同时,proxy server 的工作负荷将随着访问流量的增大而增大,用户的访问延时也势必增加。因此在部署 proxy server 时,我们还需考虑如何对 proxy server 进行水平拓展,以应对高并发场景。一个应对单点故障和高并发场景的经典解决方案是,部署多个 proxy server 副本,并使用负载均衡进行流量分发。然而在 OpenYurt 场景下,对于 KAS 发来的任意请求,LoadBalancer (LB) 会转发给哪个 server 副本是不可控的,因此,需要解决的第二个问题是,如何保证每个 server 副本都能与所有的 agent 建立连接
    • 如何将请求转发给正确的 agent -- 在运行过程中,proxy server 在收到请求后,需根据请求的 destination IP,将请求转发至位于对应 network region 内的 agent。然而,ANP目前的实现,假设所有的节点都位于一个网络空间内, server 会随机挑选一个 agent 转发请求。因此,我们需要解决的第三个问题是,如何将请求正确地转发给指定的 agent
    • 如何解除组件对节点证书的依赖 -- 在运行时,我们需要为 server 提供一套 TLS 证书,以实现 server 与 KAS,server 与 agent 间的安全通信。同时,我们也需要为 agent 准备一套 TLS client 证书,用以建立 agent 和 server 间的 gRPC 信道。ANP 目前的实现,要求 server 必须和 KAS 部署在同一个节点上,并且在启动时挂载节点 volume 共享 KAS tls 证书。同样,agent 也需要在启动时挂载 volume 共享 kubelet tls 证书。这无形中降低了部署的灵活性,造成了组建对节点证书的强依赖,在有些情况下,用户可能希望将 server 部署在非 KAS 所在节点上。因此,另一个需要关注的问题是,如何解除组件对节点证书的依赖
    • 如何缩小 Tunnel 带宽 -- ANP 的一个核心设计思想,是使用 gRPC 封装 KAS 所有对外 HTTP 请求。这里选择 gRPC,主要是看重其对流(stream)的支持和清晰的接口规范,此外,强类型的客户端和服务器端可以有效减少运行时错误,提高系统稳定性。然而,我们也发现,相较于直接使用 TCP 协议,采用 ANP 也会带来额外的开销增加带宽。从产品层面考虑,Tunnel 流量走的是公网,带宽的增加也意味着用户成本的增加。因此,一个非常重要的问题是,在提高系统稳定性的同时,我们是否也能缩小带宽

    Yurttunnel 设计解析

    1. 制定 DNAT 规则转发云端节点的请求

    如前文所述,ANP 是基于上游新功能 EgressSelector 开发的,该功能允许用户在启动 KAS 时通过传入 egress configuration 来要求 KAS 将 egress 请求转发到指定的 proxy server。但由于我们需要兼顾新老版本的 Kubernetes 集群,并且考虑到,其他管控组件(Prometheus 和 metric server)并不支持 EgressSelector 特性,我们需要保证在无法使用 EgressSelector 的情况下也能将 KAS egress 请求转发致 proxy server。为此,我们在每一个云端管控节点上都部署一个 Yurttunnel Server 副本,并在 Server 中内嵌一个新组件 Iptabel Manager。Iptable Manager 会通过在宿主机的 Iptable 中的 OUTPUT 链中添加 DNAT 规则,将管控组件对节点的请求转发致 Yurttunnel Server。

    同时,当启用 EgressSelector 后,KAS 对外请求都遵循一个统一的格式,因此我们新增一个组件, ANP interceptor。ANP interceptor 会负责截取从 master 发来的 http 请求,并将其封装成 EgressSelector 格式。Yurttunnel 请求转发的具体流程见图三。

    3.png
    图三:Yurttunnel 请求转发流程

    2. 动态获取 Server 副本数

    在上一节中,我们提到,我们将采用负载均衡的方式来管理 yurttunnel server,所有的 ingress 请求都会通过 LB 分发给一个 server 副本。由于我们无法预测 LB 会挑选哪个 server 副本,我们必须保证每个 server 副本都要与所有的 agent 建立连接。这里,我们将使用 ANP 自带的功能实现这一需求,具体流程如下:

    • 在启动 yurttunnel server 时,我们会将副本数(serverCount)传入每个 server 副本中,并且为每个副本指定一个 server ID;
    • agent 连接 LB 后,LB会随机选择一个 server 副本并让其与 agent 建立长连接;
    • 与此同时,server 会通过该通道向 agent 返回一个 ACK package,这个 package 中将包含 serverCount 和 serverID;
    • agent 通过解析 ACK package,可以获悉 server 副本的个数,并在本地记录已连接的 serverID;
    • 如果 agent 发现,本地连接的 server 副本数小于 serverCount,则会再次向 LB 发送连接请求,直至本地记录的 serverID 数与 server Count 数一致为止。

    该机制虽然帮助我们实现了 server 副本的全网段覆盖。但同时,也存在不可忽视的缺点,由于 agent 无法选择与哪个 server 副本建立连接,因此,为了连接所有的 server 副本,agent 必须反复访问 LB。在这个过程中,server 由于还没有与所有的 agent 建立连接,KAS 发来的请求可能无法转发至对应的节点。一个潜在的解决方案是,为每个 server 副本创建一个独立的 LB,负责与 agent 之间的连接,同时在 agent 端记录所有 server 副本对应 LB 的信息,这一方案能帮助 agent 快速地与所有的 server 副本建立连接。该方案的具体实现细节,目前仍在与上游社区的开发者讨论中。

    3. 为 ANP 添加代理策略

    在 OpenYurt 的网络模型下,边缘节点分布在不同的 network region 中,随机选择的 agent 可能无法将请求转发至位于其他 region 内的节点上。因此我们不得不修改 ANP server 底层代理转发的逻辑。然而,根据长期的经验,我们相信,proxy server 支持不同的代理策略,例如,将请求转发至指定数据中心,region,或者指定主机,是一个较为通用的需求。经过和 ANP 社区开发者讨论,我们决定重构 ANP 管理 agent 连接的接口,允许用户根据需求实现新的代理策略,并计划将该 feature 最终合入上游代码库。目前重构工作仍在进行中,在 Yurttunnel 第一个开源版本中,我们暂时采用以下配置:

    • 在每个边缘节点上部署一个 agent。
    • agent 在 server 处登记时,使用 agent 所在节点的 IP 作为 agentID。
    • server 在转发请求时,通过匹配请求目标 IP 和 agentID,将请求转发至对应的 agent。

    我们计划在 OpenYurt 后续发布 Yurt Unit(边缘节点分区管控)之后,配合新增的 ANP 代理转发策略,实现 agent 的分区部署,和请求的分区转发。

    4. 动态申请安全证书

    为了解除 yurttunnel 组件对节点证书的依赖,我们在 yurttunnel 中新增 cert manager 组建,cert manager 会在 server 和 agent 运行后,向 KAS 提交 certificate signning request(CSR)。server 将使用申请到的证书来确保其与 KAS 和 agent 间的安全通信,agent 会使用申请到的证书确保其与 server 间 gRPC 信道的安全。由于 agent 和 kubelet 间是通过 tcp 协议连接,因此,我们无需为 agent 和 kubelet 间的连接准备证书。

    5. 压缩 Tunnel 带宽,节约成本

    在 3.5 中,我们提到,使用 gRPC 封装 Tunnel 虽然可以提高传输稳定性,但同时也会增加公网流量。这是否意味着稳定性和性能,我们只能二选一?通过对不同用户场景的分析,我们发现,在大多数情况下,用户使用运维通道是为了获取容器日志(即 kubectl log),而传统日志文件,存在许多相同的文本信息,因此我们推断使用 gzip 等压缩算法能有效缩小带宽。为了验证这一假设,我们在 ANP 底层的 gRPC 库中添加了 gzip compressor,并且对比了与使用原生 TCP 连接场景下的数据传输量。

    我们考虑的第一个实验场景是,分别通过 TCP 连接和 ANP 获取同一 kubeproxy 容器的日志,我们截取了这一过程中 Tunnel 上双向 package 和 bytes 总量。

    4.png
    表 1: 原生 TCP V.S. ANP (kubectl logs kube-proxy)

    如表 1 所示,通过使用 ANP, 总传输数据量下降了 29.93%

    经过长时间运行,容器的日志文本常常可以达到十几兆,为了模拟获取大文本日志的场景。我们创建了一包含 10.5M systemd log(即 journalctl)的 ubuntu 容器,同样我们分别使用原生 TCP 连接和 ANP 传输该日志文件,并测量了 Tunnel 上的数据总量。

    5.png
    表 2: 原生 TCP V.S. ANP (large log file)

    如表 2 所示,在日志文本较大的情况下,通过使用 ANP, 总传输数据量下降了 40.85%

    由此可见,相较于原生 TCP 连接,ANP 不仅能提供更高的传输稳定性,还可以大幅降低公网流量。考虑到边缘集群动辄上万的节点规模,新的解决方案将帮助用户在公网流量方面节约大量开销。

    Yurttunnel 系统架构

    6.png
    图四:Yurttunnel 系统架构

    综上,Yurttunnel 主要包含以下组件:

    • Yurttunnel Server - 负责将 apiserver,prometheus,metrics server 等管控组件发往节点的请求,转发至对应的 agent。具体包括以下子组件:

      • ANP Proxy Server - 对 ANP gRPC server 的封装,负责管理与 Yurttunnel Agent 之间的长连接,并转发请求。
      • Iptable Manager - 修改管控节点的 DNAT 规则,以确保管控组件的请求能被转发至 Yurttunnel Server。
      • Cert Manager - 为 Yurttunnel Server 生成 TLS 证书。
      • Request Interceptor - 将 KAS 对节点的 HTTP 请求封装到符合 ANP 规则的 gRPC 包里。
    • Yurttunnel Agent - 与 Yurttunnel Server 主动建立连接,并将 Yurttunnel Server 发来的请求转发给 Kubelet。具体包括两个子组件:

      • ANP Proxy Agent - 对 ANP gRPC agent 的封装,相较于上游,我们额外加入了 gzip compressor 以压缩数据。
      • Cert Manager - 为 Yurttunnel Agent 生成 TLS 证书。
    • Yurttunnel Server Service - 通常是一个 SLB,负责将管控组件发来的请求分发给合适的 Yurttunnel Server 副本,保证 Yurttunnel 的高可用和负载均衡。

    总结与展望

    Yurttunnel 作为 OpenYurt 近期开源的重要组件,打通了 OpenYurt 集群的云边通道,为边缘集群上的容器运维提供了一个统一的入口。通过对上游解决方案进行改造,Yurttunnel 不仅提供了更高的传输稳定性,也大幅降低了数据传输量。

    OpenYurt 于 2020 年 5 月 29 日正式对外开源,借助社区和广大开发者的力量快速成长,开源仅 3 个月后就正式成为 CNCF 沙箱级别边缘计算云原生项目。未来,OpenYurt 将延续 “Extending your upstream Kubernetes to edge” 的核心设计理念,在选择与上游保持最大技术公约数的同时,发扬开源分享的精神,与广大开发者一起推进 Kubernetes 社区的进步。

    OpenYurt 已入围 “2020 年度 10 大新锐开源项目”,欢迎大家点击链接:https://www.infoq.cn/talk/sQ7eKfv1KW1A0kUafBgv,选择“25 号”,为 OpenYurt 加油助力!

    阿里巴巴云原生关注微服务、Serverless、容器、Service Mesh 等技术领域、聚焦云原生流行技术趋势、云原生大规模的落地实践,做最懂云原生开发者的公众号。”

    原文链接:https://developer.aliyun.com/article/778036?

    版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
    展开全文
  • 针对目前综采工作面及两巷设备自动化程度低、协同控制性差等问题,提出了一种以综采工作面两巷支护、运输及...该方案能够实现综采工作面及两巷设备协同推进控制,有效减少作业人员数量,满足工作面快速、高效推进需求。
  • 快速实现ARM和DSP的通信和协同工作

    千次阅读 2015-01-13 13:10:03
    快速实现ARM和DSP的通信和协同工作 德州仪器(TI)的第一颗达芬奇(DaVinci)芯片(处理器)DM6446已经问世快三年了。继DM644x之后,TI又陆续推出了DM643x,DM35x,DM6467,OMAP353x等一系列ARM+DSP或ARM+视频协...
  • 基于VLAN的项目小组协同工作的研究,张璐,,传统企业等级森严、复杂的部门结构使得工作的协调很难实现,并且严重的束缚了员工的自主性和创造性。为了实现高效工作,提高企业
  • 为缓解高产高效矿井突出防治与生产之间的矛盾,抓住突出防治的首要环节(突出预测),围绕突出危险性的时空演化关系,构建了煤与瓦斯突出远近场协同预测技术体系。技术思路如下:首先,从远场预测角度建立瓦斯场、...
  • 使用Mahout实现协同过滤 spark

    千次阅读 2016-03-10 16:05:00
    Mahout使用了Taste来提高协同过滤算法的实现,它是一个基于Java实现的可扩展的,高效的推荐引擎。Taste既实现了最基本的基 于用户的和基于内容的推荐算法,同时也提供了扩展接口,使用户可以方便的定义和实现自己的...
  • 解决问题的许多并行算法已图形上实现处理单元(GPU)。 但是,这些GPU实现可能无法充分利用所有CPU内核和GPU资源。 GPU执行计算任务时,仅使用一个CPU内核来控制GPU,其余所有CPU内核均处于空闲状态,这导致大量...
  • 为了实现安全,高效协同工作,利用网格资源共享、互操作性、可靠性、安全性等方面的特点,并结合了多Agent处理任务、进程间的协同性和并行性的优势,把政府各职能部门组织成一个协同工作电子政务系统。
  • 基于Mahout实现协同过滤推荐算法的电影推荐系统

    万次阅读 多人点赞 2019-02-24 16:32:05
    1 Mahout介绍 Apache Mahout 是 Apache Software ...经典算法包括聚类、分类、协同过滤、进化编程等等,并且, Mahout 还加入了对Apache Hadoop的支持,使这些算法可以更高效的运行云计算环境。 ...
  • 基于物品的协同过滤算法实现图书推荐系统

    万次阅读 多人点赞 2019-09-14 21:20:24
    摘 要 当下这个信息爆炸的时代,各种各样的书籍条目繁多,浩如烟海;相应地,为满足用户需求,电商平台需要推荐系统来帮助用户找到自己可能需要的书籍。...该系统,主要功能分为用户功能和图书推荐功能...
  • 将网络管理技术与对等网技术结合...着重阐述应用对等网技术,各对等组协同监控网络的工作机制,并以远程监控CISCO3640端口利用率为例给出了系统的实现方法。系统具有高效、分散、健壮、可扩展性与可操作性强等特点。
  • CIG以OGSA为基础,应用分布式人工智能和分布协调控制的理论和方法来研究和解决网格如何高效准确地协同现有的网格服务以完成所面临的任务。文中描述了CIG的概念和体系结构,从社区/联邦式政策导向型的系统结构、...
  • 泛微协同OA工作微博重磅发布

    千次阅读 2012-02-03 10:20:48
    高效、便捷、易用的工作微博将作为传统协同OA管理模式的有益补充,加速国内企业“微协同”办公的进程。那么,工作微博真的可以将企业管理变得更加简单吗?  “与人们熟悉的微博功能类似,协同OA的工作微博应用非常...
  • 1:协同过滤算法简介2:协同过滤算法的核心3:协同过滤算法的应用方式4:基于用户的协同过滤算法实现5:UserCF相似度计算部分优化一:协同过滤算法简介 基于用户的协同过滤算法是推荐系统最古老的的算法,可以...
  • 够紧密协调起来,大型企业或集团型企业尤为突出。产生这些问题的根源主 要在于企业不断发展和规模扩张,企业的管理控制形态的运作模式不断发展, 管理的变革使这些系统已经不适应新要求。因此,建立一个高效的...
  • CPU与GPU协同工作

    千次阅读 2017-10-10 17:10:04
    地形渲染算法绘图使用了 OpenGL 去实现,OpenGL 是一个 开放的三维图形软件包,它独立于窗口系统和操作系统,以它为基础开发的应用 程序可以十分方便地各种平台间移植。 X server 是 Linux 系统下图形接口...
  • 协同过滤itembase计算Spark实现(二)

    千次阅读 2016-09-04 15:55:36
    博主前期有写过协同过滤协同过滤itembase增量计算Spark实现(一),其中已经较为基础的演示了基于欧拉距离求解相似度的过程,由于都是一个JOB里,随着数据量的增长会出现计算耗时过长、OOM等现象,后期博主推荐...
  • 跨地域开发的需求其实由来已久,IT/互联网发展的早期就已存在,只不过限于当时网络环境的因素,无法在线上有效的完成协同工作,所以没法实际开展。而随着近十年网络的快速发展,跨地域协同开发线变得可能而且...
  • 前端和后端如何实现高效协作

    千次阅读 2018-11-05 09:30:09
    一、前后端分离 二、尽量避免后端模板渲染 web渲染方式分为服务器端渲染和客户端渲染,推荐使用客户端渲染,数据通过ajax方式交互 三、尽量避免大量线上调试 做好本地接口模拟开发 四、规范的接口文档 ...
  • 剖析BPM在协同软件的作用

    千次阅读 2007-12-13 15:00:00
    业务流程管理(Business Process Management,BPM)以前常常被称之为工作流管理(Workflow Management, WFM),是业务流程重组(Business Process ...BPM是人与计算机共同工作的自动化协调、控制和通讯,计算
  • 用C语言实现高效嵌入式系统编程

    千次阅读 2016-08-11 14:05:50
    1引言  随着市场竞争的日趋激烈,要求电子工程师能够短时间内编写出执行效率高而又可靠的...而C语言以其结构化和能产生高效代码满足了这样的需要,成为电子工程师进行嵌入式系统编程时的首选开发工具而得到了

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 66,255
精华内容 26,502
关键字:

如何在工作中实现高效协同