1.手把手带你学webpack(6)--source-map
2.Apache Ranger整合Hadoop、修改Hive、源e源Spark实现权限管理
3.0006-Zookeeper指标分析
4.Flink系列十九Flink 作业Hadoop 依赖冲突解决NoSuchMethodError
手把手带你学webpack(6)--source-map
本篇文章对应源码:JvcicpO1xuXG4gIHRocmIG5ldyBFcnJvcignctZXRoaW5nIHdybnLi4uJyk7XGXG5cbm1vZHVsZS5leHBvcnRzID0geyBlcnJvckZuIHXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSbIjoiIn0=\n//#sourceURL=webpack-internal:///./src/utils.js\n");这种方式适用于在开发模式下需要精确的码修码source-map时使用,相比直接的修改eval,会更加精确些
3.4inline-source-map顾名思义,源e源就是码修码闪传源码以内联方式存放source-map文件,它会将source-map文件的修改内容编码成base后直接放在打包结果的最后
constHtmlWebpackPlugin=require('html-webpack-plugin');const{ CleanPlugin}=require('webpack');/***@type{ import('webpack').Configuration}*/module.exports={ mode:'development',devtool:'inline-source-map',plugins:[newHtmlWebpackPlugin(),newCleanPlugin()],};//#sourceMappingURL=data:application/json;charset=utf-8;base,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsbUJBQW1COzs7Ozs7O1VDTm5CO1VBQ0E7O1VBRUE7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7O1VBRUE7VUFDQTs7VUFFQTtVQUNBO1VBQ0E7Ozs7Ozs7OztBQ3RCQSxRQUFRLFVBQVUsRUFBRSxtQkFBTyxDQUFDLCtCQUFTOztBQUVyQyIsInNvdXJjZXMiOlsid2VicGFjazovLzA2X3dlYnBhY2tfccmNlXhcC8uL3NyYydGlscy5qcyIsIndlYnBhY2s6Ly8wNlZWJwYWNrX3NvdXJjZV9tYXAvd2VicGFjay9ibc3RyYXAiLCJ3ZWJwYWNrOi8vMDZfd2VicGFjazb3VyY2VfbWFwLy4vc3JjL2luZGV4LmpzIl0sInNvdXJjZXNDbZWIjpbImZ1bmN0aW9uIGVycm9yRm4oKSB7XG4gIGNvbnNvbGUubG9nKCdoZWxsbyBlcnJvcicpO1xuXG4gIHRocmIG5ldyBFcnJvcignctZXRoaW5nIHdybnLi4uJyk7XGXG5cbm1vZHVsZS5leHBvcnRzID0geyBlcnJvckZuIHXG4iLCIvLyBUaGUgbW9kdWxlIGNhY2hlXGYXIgXZWJwYWNrXvZHVsZV9jYWNoZV9fID0geXG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gXZWJwYWNrXvZHVsZV9jYWNoZV9fWvZHVsZUlkXTtcblWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaWbyB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlXbbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdHXG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFjatb2R1bGVzXbbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFjayZXF1aXJlXpO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiYuc3QgeyBlcnJvckZuIH0gPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cbmVycm9yRm4oKTtcbiJdLCJuYW1lcyI6WsInNvdXJjZVJvb3QiOiIifQ==从官方文档可以看到,这种方式的源e源构建速度是最慢的,只适用于构建单个文件的码修码时候使用
3.5cheap-source-map这种方式相比source-map而言,没有建立列映射,修改也就是源e源说遇到报错的时候,只会告诉你哪一行代码出错了,码修码而不会告诉你哪一列出错了,修改如果开发时对列映射没有太高要求的源e源话可以使用这种方式,毕竟不用生成列映射,码修码比起source-map来说会快一些
constHtmlWebpackPlugin=require('html-webpack-plugin');const{ CleanPlugin}=require('webpack');/***@type{ import('webpack').Configuration}*/module.exports={ mode:'development',devtool:'cheap-source-map',plugins:[newHtmlWebpackPlugin(),newCleanPlugin()],};3.6cheap-module-source-map官方文档对这种方式的devtool并没有进行任何详细介绍,事实上这种方式适用于js代码被loader转换过的场景,比如被babel进行了转换,又比如源码是用typescript写的,后来经过loader转成了js代码,而我们又希望在运行的时候出现报错信息时能够对应回typescript代码像这种有loader对js进行转换的场景下,想要保证正确的source-map就需要使用到带有module的devtool了,因为除了cheap-module-source-map,还有很多别的方式也是有module的,只要是在官方文档中看到带有module的devtool都是具有这种特性
下面就以babel为例,我们通过babel-loader对js进行转换,然后看看能否正确对应到转换前的代码首先安装如下依赖
pnpmi@babel/core@babel-preset-envbabel-loader@babel/core是babel的核心,所有功能都要在这个包的基础上运行
@babel-preset-env让我们可以不需要考虑转换成什么版本的js,它会根据要适配的浏览器自动转换成能兼容相应浏览器的版本,这里我们使用它主要是能够将我们写的es6代码转成es5,从而让我们的源码和打包后的结果有差异,方便观察source-map是vb计算长方形源码否生效
babel-loader,用于和webpack搭配使用,转换js文件
接下来配置loader
constHtmlWebpackPlugin=require('html-webpack-plugin');const{ CleanPlugin}=require('webpack');/***@type{ import('webpack').Configuration}*/module.exports={ mode:'development',devtool:'eval',//默认就是eval,因此development模式下不写devtool配置项也可以plugins:[newHtmlWebpackPlugin(),newCleanPlugin()],};0然后我们写一个具有es6特性的语法的函数
constHtmlWebpackPlugin=require('html-webpack-plugin');const{ CleanPlugin}=require('webpack');/***@type{ import('webpack').Configuration}*/module.exports={ mode:'development',devtool:'eval',//默认就是eval,因此development模式下不写devtool配置项也可以plugins:[newHtmlWebpackPlugin(),newCleanPlugin()],};1使用到了const、箭头函数,经过babel转换成es5后,代码的位置会和源码中不一样,那么在浏览器中如果仍然能够找到转换前的源码,则说明cheap-module-source-map生效了可以看到,在浏览器中确实能够看到转换前的源码,这就是cheap-module-source-map中module的作用,事实上官方文档中这么多的配置项我们不需要害怕,只需要知道每个关键字是什么意思,那么它们组合起来无非就是各种特性的叠加而已
3.7hidden-source-map也是一个见名知意的配置项,相比于source-map,就是将最后的//#sourceMappingURL=main.js.map这句注释删除了,这也就意味着source-map不会生效了,但是仍然会生成source-map文件的官方文档中给我们的建议是在只需要知道有错误出现时给我们在控制台输出出来的话就可以使用这种方式
3.8nosources-source-map这种方式能够在出现错误的时候告诉我们是源码中哪个文件第几行出错了,但是不会在浏览器中给我们生成源码
总结了解完以上这几个devtool配置项,就足够了,官网的个配置项就是根据eval、hidden、inline、cheap、module、nosources这几个关键字组合出来的
但是组合也是有规则的,官方文档中给出的规则如下:
[inline-|hidden-|eval-][nosources-][cheap-[module-]]source-map
原文:/post/Apache Ranger整合Hadoop、Hive、Spark实现权限管理
在先前的文章《说说PB级生产上重要的Spark 3.x性能优化方向》中,提到了业务人员在处理数据时可能因误操作而造成数据损坏的问题。在许多场景中,数码宝贝源码测试服数仓需要直接开放给业务分析人员使用,他们经常执行SQL进行场景分析和验证。为此,可以提供一个WebUI供他们使用,如Hue。然而,由于数仓数据庞大,不可能全部开放给业务人员,因此对外供数时必须提供权限控制。
权限控制方面,CDH上提供的Sentry是一个不错的选择,它基于RBAC进行授权,可以针对库、表等设置不同用户权限。CM的加入使得Sentry的配置变得简单,但Sentry在用户管理方面较为繁琐,且项目已进入Apache Attic,因此选择Sentry并非明智之举。
实际上,许多公司的生产环境都是外网隔离的,特别是涉及敏感数据的小猴公司。开发、运维人员进入生产环境需要经过严格的校验,接入公司的生产专用网络,并通过堡垒机,任何人都无法导出数据,且每个操作都有审计跟踪。尽管如此,业务人员仍需开放访问,尽管他们通过专门的跳板机访问,但依然存在风险。通达信期货分时源码
Apache Ranger只要有大数据集群的地方就都需要。本文解决了Ranger不支持Spark SQL的问题,实现了库、表、行、列级别的细粒度权限控制。由于官方文档和百度文档有限,本文将分享相关信息,希望能帮助到大家。
Apache Ranger是一个用于Hadoop平台上的权限框架,旨在服务于整个大数据生态圈。随着Hadoop在数据湖领域方案的成熟,对数据权限控制的要求也日益提高。Ranger现在提供了更多对大数据生态组件的支持。
Hadoop中的数据访问多样化,如存储在HDFS的数据可以被Hive、Spark或Presto访问。这么多组件访问数据,若不进行集中权限控制,数据安全性将面临严重问题。因此,大数据平台通常需要一个集中管理权限的组件或框架,Ranger正是这样的组件。
当前Ranger版本为2.1,官方提供的版本为2.1。编译测试基于Ranger 2.1版本。官方未提供安装包,需要手动下载Ranger源码包进行编译。编译环境要求提前安装,具体可参考官方网站。
编译成功后,南京短视频商城平台源码将tar.gz包拷贝到本地。部署Ranger Admin的安装方式与Ranger类似:安装Ranger admin、创建ranger用户并设置密码、上传解压安装包、拷贝MySQL JDBC库、在MySQL中创建ranger库和用户、初始化配置、初始化Ranger admin。若显示成功,则表示初始化成功。在MySQL中可以看到ranger数据库中已创建大量表。
配置Ranger设置数据库密码、配置环境变量、启动Ranger admin访问web UI。登录后,主界面显示如下。点击右上角的“Swith to latest UI”可以切换到最新的UI展示。若安装过程中出现问题,请检查日志。
安装Ranger usersync配置admin认证模式。Ranger中admin的认证方式有三种:Unix、Active Directory、Kerberos。此处使用Unix方式进行认证,意味着后续Ranger admin登录会按照Linux中的认证同步。上传解压Ranger usersync组件、修改初始化配置、初始化配置、配置Linux系统用户组同步配置环境变量、启动usersync服务、修改Ranger admin的认证方式、重新启动Ranger admin。在ranger-admin中可以看到所有Linux中的所有用户。
安装Ranger HDFS插件。注意,HDFS插件需要安装在NameNode对应的节点中,YARN插件需要安装在ResourceManager对应的节点上。解压HDFS插件、初始化配置、启用hdfs插件。Ranger HDFS插件会将当前的配置文件保存备份。可以查看ranger对这些配置文件的更改。
在PM中添加HDFS服务、配置HDFS服务权限策略、默认策略、策略配置、测试用户访问权限、在ranger中添加组合用户、基于角色授权、测试。我们发现,只要Ranger中的权限已更新,hdfs客户端就可以实现更新。
按照之前的配置,审计日志信息保存在指定目录。找到一条审计日志,查看其中的内容。审计日志中包含操作时间、路径、资源类型、对应Ranger中的策略等信息。一旦出现安全类问题,通过审计日志可以检查到进行了哪些操作。
部署Ranger HDFS HA。在HDFS的HA集群上,NameNode可能会发生failover,因此非常有必要在每个HDFS的NameNode上部署一个HDFS插件,以确保在HA切换时能够正常控制权限。部署hdfs plugin到每个NameNode节点、初始化NameNode、测试NameNode节点权限。测试lisi用户在/tmp目录的写入权限,发现当前lisi没有写入权限。在Ranger中启用sales角色的用户具备/tmp目录可写权限。重新执行写入操作,NameNode接入Ranger权限控制成功。
部署Ranger框架整合Hive、上传解压Hive插件、初始化配置、启动Hive插件。Ranger会对Hive的配置文件进行处理,生成hiveserver2-site.xml、ranger-hive-audit.xml、ranger-hive-security.xml等文件。重新启动Hive、beeline登录到hive、在PM中添加Hive服务、添加Hive Service、查看权限策略、查看默认hive导入的权限、使用hive查看数据、给hadoop组用户授权、检查spark用户操作权限、授权hadoop组、对某个库、表、列设置细粒度权限、测试数据打码处理、测试Ranger Admin crash对Hive的影响、部署Ranger Spark SQL、编译Apache submarine spark-security模块、配置、配置Spark SQL、测试Thrift Server、测试Spark SQL SHELL、到此Ranger整合Spark SQL完成、查看spark sql审计日志、报错信息处理、找不到AllocationFileLoaderService$Listener、异常信息、解决办法、参考文献。
-Zookeeper指标分析
通过CDH管理平台访问Zookeeper管理界面,发现Zookeeper的平均请求延迟、最小请求延迟、最大请求延迟指标趋势图不变,指标数据异常。
在复现问题时,注意到平均请求延迟、最小请求延迟、最大请求延迟这三个指标未发生变化,且指标数据出现异常。
分析问题源码后发现,指标数据来源于Zookeeper自身的ServerStats模块。此模块通过updateLatency方法来更新maxLatency和minLatency指标。
在深入研究代码后,我们了解到maxLatency和minLatency指标记录了Zookeeper服务器启动后所有请求的最大延迟和最小延迟。在特定情况下,Zookeeper服务器1通过一次请求更新了maxLatency指标为ms后,后续所有请求均未超过此值,导致CDH平台获取的maxLatency指标始终为ms,造成最大请求延迟指标维持不变的异常。
同样,当Zookeeper服务器1在通过一次请求后更新了minLatency指标为0ms,且后续所有请求均未小于此值,使得CDH平台获取的minLatency指标始终为0ms,从而出现最小请求延迟指标为0ms并维持不变的异常。
对于avgLatency指标,其通过累计所有请求的延迟时间(totalLatency)和累计请求次数(count),再通过totalLatency/count计算得出。如果多次请求的延迟均为0ms,那么avgLatency指标将保持为0ms。
解决此问题的关键在于确保Zookeeper服务器在处理请求时,能正常更新并反馈请求延迟指标,避免出现数据异常的情况。同时,为确保数据的准确性和可靠性,建议定期检查和维护Zookeeper服务器,以确保其正常运行并准确提供指标数据。
关注微信公众号“Hadoop实操”,获取更多Hadoop技术干货。欢迎分享和转发。
本文原创,如需转载,请注明转载自微信公众号“Hadoop实操”。
Flink系列十九Flink 作业Hadoop 依赖冲突解决NoSuchMethodError
Flink提交作业时,可能会遇到NoSuchMethodError的异常,这通常与Hadoop依赖冲突有关。查看源码后发现,错误源于2.6.0-cdh5..1版本的FsTracer通过hadoop-common加载了TraceUtils,但实际加载的是2.7.x版本的TraceUtils。因此,问题出在版本兼容性上。有以下两种解决方案:
第一类解决方案是手动从jar包中排除冲突依赖。这需要识别冲突的库,并在Flink构建过程中排除它们,确保加载的库版本与期望一致。
第二类解决方案是通过打包工具精确排除字节码。这可以更细致地控制类加载过程,避免不兼容版本的类被加载。
深入理解这一问题,有助于我们意识到在使用Flink与外部系统集成时,版本兼容性是一个不容忽视的挑战。为避免此类问题,需要仔细管理依赖库的版本,确保它们之间无冲突。
解决此类问题的最新方法(适用于所有Flink版本)在上一篇文章中已有详细描述,参见Flink系列十八HDFS_DELEGATION_TOKEN过期的问题解决汇总。
2024-11-29 16:20
2024-11-29 15:58
2024-11-29 15:32
2024-11-29 14:31
2024-11-29 14:06
2024-11-29 13:51