《【携程】-Alluxio在携程大数据平台的探索与优化.pdf》由会员分享,可在线阅读,更多相关《【携程】-Alluxio在携程大数据平台的探索与优化.pdf(27页珍藏版)》请在三个皮匠报告上搜索。
1、Alluxio 在携程大数据平台的探索与优化钱勇携程数据基础架构组目录 1 个性化透明访问 2 实现自定义认证与多租户 3 个性化全链路 CallerContext 4 动态下发 Alluxio 客户端配置 5 未来规划携程大数据基础架构个性化透明访问底层存储系统PART 1透明命名机制Alluxio 提供了透明命名机制,保证了Alluxio 和底层存储系统命名空间身份一致性。但客户端使用需要将 locationUrl 的 schema 从 hdfs:/改为 alluxio:/才可以访问表,使用起来不够便捷。实现透明访问 重新实现一个自定义的文件系统客户端 TripCustomFileSyst
2、em 初始化 mExternalHadoopFileSystem 和 mInternalAlluxioFileSystem 配置 fs.hdfs.impl 为 TripCustomFileSystem,替换 DistributedFileSystem 增加 alluxio.use.alluxio.for.read 开关决定是否从 Alluxio 读 Cache 支持在 Alluxio 不可用时 fallback 到原生 HDFS,以满足携程的生态系统需求alluxio.use.alluxio.for.read=true spark.hadoop.fs.hdfs.impl=alluxio.had
3、oop.TripCustomFileSystem遇到的挑战挑战一:Spark Yarn client 模式下 DelegationToken 问题解决:重写 TripCustomFileSystem 的 getDelegationToken 方法,直接使用 HDFS 的 DelegationTokenpublic Token getDelegationToken(String renewer)throws IOException return mExternalHadoopFileSystem.getDelegationToken(renewer);挑战二:Alluxio 和 HDFS 的 M
4、odificationTime 不一致导致 NM 下载资源失败解决:“写”操作使用原生 HDFS,以避免 ModificationTime 不一致return mExternalHadoopFileSystem.create(f,permission,overwrite,bufferSize,replication,blockSize,progress);遇到的挑战挑战三:简单的 open 失败回切 HDFS 并不能在 Alluxio worker 全挂时 fallback解决方案:在 read 之前获取文件状态时,做 worker 数量检查,若 worker 全部挂掉 直接抛出异常,回切到
5、HDFS if(mFileSystemMaster.getWorkerInfoList().isEmpty()throw new UnavailableException(The workers list is empty,no available Alluxioworker);遇到的挑战SQL 测试效果总结:Alluxio 在某些重点是读取的 SQL 情况下效果更好,但对于重点是计算、数据量不大却计算复杂的场景效果一般。我们选取了多个不同类型的线上真实 SQL,分别使用和不使用 Alluxio 缓存两种情况进行对比,得出以下结果:实现自定义认证、支持多租户PART 2安全认证SIMPLE:最
6、基本的认证模式。客户端只需向 Alluxio 服务端提供用户名,服务端会接受这个用户名并用它来识别客户端的身份,安全性较低,因为任何人都伪装成任何用户。NOSASL:不进行任何安全认证。客户端可以以任何用户的身份连接到 Alluxio 服务,而服务端也不会对客户端的身份进行验证,存在明显的安全风险。CUSTOM:可以自定义自己的认证方式。通过指定自定义的安全认证实现类,验证客户端用户和密码是否匹配,用户可以根据自己的需求实现认证逻辑,提供了极大的灵活性。实现自定义认证 增加 alluxio.security.login.password 实现 Alluxio.security.authenti
7、cation.AuthenticationProvider 接口 使用 Cache 来缓存用户和密码 当需要进行用户认证时,调用 authenticate 方法进行验证alluxio.security.authentication.type=CUSTOMalluxio.security.authentication.custom.provider.class=alluxio.security.authentication.plain.TripCustomAuthenticationProvider支持多租户社区pr:https:/ 应该都是 Bob(auth:PROXY),这里却有的是 Ali
8、ce,有的是 Bob此处我们使用 Alice 去代理其他用户(eg:Bob)hdfs-audit.log 如下:解决代理不正常原因:解决:new readHandler 的时候记录 userName;在 onNext 方法判断当前线程是否能拿到 user,拿不到则使用上面记录的userName解决 Kerberos 认证失效问题问题:解决:增加配置通过 expireAfterWrite 过期策略和 cache 刷新配置使得 FileSystem 中的票据刷新HdfsUnderFileSystem 中对 FileSystem 做了缓存如下:但并设置过期时间和更新策略,导致出现 Kerberos
9、认证失效问题No valid credentials provided(Mechanism level:Failed to find any Kerberos tgt)原因:alluxio.underfs.hdfs.user.fs.cache.refresh.time个性化全链路 CallerContextPART 3Alluxio 审计keyvaluesucceeded如果命令成功运行,值为true。在命令成功运行前,该命令必须是被允许的。allowed如果命令是被允许的,值为true。即使一条命令是被允许的它也可能运行失败。ugi用户组信息,包括用户名,主要组,认证类型。ip客户端IP地址
10、。cmd用户运行的命令。src源文件或目录地址。dst目标文件或目录的地址。如果不适用,值为空。permuser:group:mask,如果不适用值为空。目前 Alluxio 支持 master_audit.log,并包括以下多个审计记录条目:却缺失了对 CallerContext 的记录,然而 CallerContext 包含了更详细的客户端信息实现全链路 CallerContext我们在社区 pr16368 的基础上,针对携程现有的数据生态,打通 Alluxio client 到 AlluxioMaster 再到 Hdfs 的 CallerContext 传递,实现个性化全链路 Calle
11、rContext。Alluxio Mater Audit log 落Hive表此外,我们将 Alluxio master-audit.log 与 hdfs-audit.log 基本对齐,使用定时调度落到 Hive 表,以便能够快速追踪用户对数据的访问操作,效果如下:Kyuubi 动态下发 Alluxio 客户端配置PART 4Alluxio 客户端配置官方方式一:fs.alluxio.implalluxio.hadoop.FileSystem alluxio.master.rpc.addresses master_hostname_1:19998,master_hostname_2:19998
12、,master_hostname_3:19998 spark.driver.extraJavaOptions-Dalluxio.master.rpc.addresses=master_hostname_1:19998,master_hostname_2:19998,master_hostname_3:19998spark.executor.extraJavaOptions-Dalluxio.master.rpc.addresses=master_hostname_1:19998,master_hostname_2:19998,master_hostname_3:19998官方方式二:将配置添加
13、到$SPARK_HOME/conf/spark-defaults.conf 中 将配置添加到Hadoop 配置文件$SPARK_HOME/conf/core-site.xml 中缺点:以上两种方式都属于全局配置,不能将用户的配置隔离,不易于管理不同用户的特有配置Kyuubi 动态下发 Alluxio 客户端配置 Spark 支持spark.hadoop.开头的配置,并且在复制时会去掉前缀 Alluxio AbstractFileSystem 初始化会 merge hadoopConfProperties Kyuubi 支持 _username_.config key 配置用户层面的特有配置de
14、f appendSparkHadoopConfigs(srcMap:MapString,String,destMap:HashMapString,String):Unit=for(key,value)-srcMap if key.startsWith(spark.hadoop.)destMap.put(key.substring(spark.hadoop.length),value)/Merge relevant Hadoop configuration into Alluxios configuration.alluxioProps.merge(hadoopConfProperties,So
15、urce.RUNTIME);#For a user named kent_kent_.spark.master=yarn_kent_.spark.sql.adaptive.enabled=false#For a user named bob_bob_.spark.sql.adaptive.enabled=true_bob_.spark.executor.memory=8gKyuubi 动态下发 Alluxio 客户端配置基于以上三点特性,我们提出使用Kyuubi 动态下发 Alluxio 客户端配置,允许用户设置不同的配置默认值,实现用户间配置隔离,并使用携程配置服务 Qconfig 管理 k
16、yuubi-ctrip.properties,效果如下:优点:此方式不仅提供了很大的灵活性,同时也更易于管理。未来规划PART 5未来规划未来,我们将进一步扩大集群规模,面向更多用户,为更多的用户提供更快速、更高效的大数据读取服务,以提高携程大数据生态的系统性能。目前,使用 Alluxio Cache 加速携程大数据读取速率,已经应用到 Adhoc 平台多个用户,部署了多个集群,效果可观,我们也正在积极探索更多的应用场景,以便更好地服务于更多用户。最近,我们对 Alluxio Fuse 进行了探索,作为 Alluxio 的特性之一,通过 Alluxio Fuse,AI 应用可以直接访问 Alluxio Cache 中的数据,而不需要通过特定的 API 或者协议,可以像操作本地文件一样操作 Alluxio Cache 中的数据,结果表明读取速率也有一定的提高。THANKS