首页 文章 精选 留言 我的

精选列表

搜索[common],共4317篇文章
优秀的个人博客,低调大师

Hadoop Common源码分析之服务Service

Service是定义Hadoop中服务生命周期的一个接口。Service内部定义了服务的状态及生命周期,在服务被构造后,其一个生命周期内的状态为NOTINITED未初始化--INITED已初始化--已启动STARTED--已停止STOPPED,而这一生命周期内服务状态的变化,是随着如下方法链的调用而变化的:init()--start()--stop(),服务构造后整体方法调用及状态转移如下图所示: 下面,我们来看下Service的源码分析,先看下其内部定义的服务状态,如下: /** * Service states * 服务状态 */ public enum STATE { /** Constructed but not initialized */ // 服务实例已经构造但是还没有初始化 NOTINITED(0, "NOTINITED"), /** Initialized but not started or stopped */ // 服务实例已经初始化但还没有启动或停止 INITED(1, "INITED"), /** started and not stopped */ // 服务实例已经启动但没有停止 STARTED(2, "STARTED"), /** stopped. No further state transitions are permitted */ // 服务实例已经停止,不允许进一步的状态转换 STOPPED(3, "STOPPED"); /** * An integer value for use in array lookup and JMX interfaces. * Although {@link Enum#ordinal()} could do this, explicitly * identify the numbers gives more stability guarantees over time. */ private final int value; /** * A name of the state that can be used in messages */ private final String statename; private STATE(int value, String name) { this.value = value; this.statename = name; } /** * Get the integer value of a state * @return the numeric value of the state */ public int getValue() { return value; } /** * Get the name of a state * @return the state's name */ @Override public String toString() { return statename; } } STATE是一个枚举类,代表了服务生命周期内各阶段的状态,分别为: 1、NOTINITED--0:服务实例已经构造但是还没有初始化; 2、INITED--1:服务实例已经初始化但还没有启动或停止; 3、STARTED--2:服务实例已经启动但没有停止; 4、STOPPED--3:服务实例已经停止,不允许进一步的状态转换。 接下来,我们再看下导致服务状态变更的各个方法,如下: 1、初始化服务init(): NOTINITED-->INITED/STOPPED /** * Initialize the service. * 初始化服务 * * The transition MUST be from {@link STATE#NOTINITED} to {@link STATE#INITED} * unless the operation failed and an exception was raised, in which case * {@link #stop()} MUST be invoked and the service enter the state * {@link STATE#STOPPED}. * * 初始化后,服务状态由NOTINITED转换到INITED,除非异常发生导致服务初始化操作失败, * 在这种情况下,stop()方法应该被调用,并且服务状态进入STOPPED。 * * @param config the configuration of the service * @throws RuntimeException on any failure during the operation 初始化后,服务状态由NOTINITED转换到INITED,除非异常发生导致服务初始化操作失败,在这种情况下,stop()方法应该被调用,并且服务状态进入STOPPED。 2、启动服务start():INITED-->STARTED/STOPPED /** * Start the service. * 启动服务 * * The transition MUST be from {@link STATE#INITED} to {@link STATE#STARTED} * unless the operation failed and an exception was raised, in which case * {@link #stop()} MUST be invoked and the service enter the state * {@link STATE#STOPPED}. * * 服务启动后,服务状态由INITED转换到STARTED,除非异常发生导致服务启动操作失败, * 在这种情况下,stop()方法应该被调用,并且服务状态进入STOPPED。 * * @throws RuntimeException on any failure during the operation */ 服务启动后,服务状态由INITED转换到STARTED,除非异常发生导致服务启动操作失败,在这种情况下,stop()方法应该被调用,并且服务状态进入STOPPED。 3、停止服务stop():NOTINITED/INITED/STARTED-->STOPPED /** * Stop the service. This MUST be a no-op if the service is already * in the {@link STATE#STOPPED} state. It SHOULD be a best-effort attempt * to stop all parts of the service. * 停止服务。如果服务已经处于STOPPED状态,这必须是一个空操作。它应该尽力试图停止服务的所有部分。 * * The implementation must be designed to complete regardless of the service * state, including the initialized/uninitialized state of all its internal * fields. * 实现者必须被设计为完成这个操作,而不管服务的状态,包括其内部所有字段初始化/未初始化的状态。 * * @throws RuntimeException on any failure during the stop operation */ void stop(); 停止服务。如果服务已经处于STOPPED状态,这必须是一个空操作。它应该尽力试图停止服务的所有部分。实现者必须被设计为完成这个操作,而不管服务的状态,包括其内部所有字段初始化/未初始化的状态。 为了兼顾Java7闭包条款,Service接口还提供了close()方法,实际上就是调用stop()方法,代码如下: /** * A version of stop() that is designed to be usable in Java7 closure * clauses. * 适用于Java7闭包条款的stop()版本,实际上就是调用stop()方法。 * * Implementation classes MUST relay this directly to {@link #stop()} * 实现类必须直接传递给stop()方法。 * * @throws IOException never * @throws RuntimeException on any failure during the stop operation */ void close() throws IOException; Service的另外一大块内容,就是对于服务状态变更时间的监听,并提供了注册监听器与注销监听器的方法,如下: 1、注册监听器registerServiceListener() /** * Register a listener to the service state change events. * If the supplied listener is already listening to this service, * this method is a no-op. * 注册一个监听器到服务状态变更事件。 * 如果提供的监听器已经监听此服务,这种方法是一个空操作。 * @param listener a new listener */ void registerServiceListener(ServiceStateChangeListener listener); 2、注销监听器unregisterServiceListener() /** * Unregister a previously registered listener of the service state * change events. No-op if the listener is already unregistered. * 注销之前的一个注册到服务状态变更事件的监听器。 * 如果监听器已经注销,这种方法是一个空操作。 * @param listener the listener to unregister. */ void unregisterServiceListener(ServiceStateChangeListener listener); 还有,Service还提供了获取服务失败时发生的第一个异常和当时状态的方法,如下: /** * Get the first exception raised during the service failure. If null, * no exception was logged * 获取服务失败时发生的第一个异常 * @return the failure logged during a transition to the stopped state */ Throwable getFailureCause(); /** * Get the state in which the failure in {@link #getFailureCause()} occurred. * 获取服务失败发生的第一个异常时的服务状态 * @return the state or null if there was no failure */ STATE getFailureState(); 既然是一个服务,Service还提供了阻塞等待服务停止的waitForServiceToStop()方法,如下: /** * Block waiting for the service to stop; uses the termination notification * object to do so. * 阻塞,等待服务停止;通过终止通知对象实现。 * * This method will only return after all the service stop actions * have been executed (to success or failure), or the timeout elapsed * This method can be called before the service is inited or started; this is * to eliminate any race condition with the service stopping before * this event occurs. * @param timeout timeout in milliseconds. A value of zero means "forever" * @return true iff the service stopped in the time period */ boolean waitForServiceToStop(long timeout); 其它诸如获取服务名、获取当前服务状态、获取服务启动时间、查询是否服务是在一个特定的状态、获取生命周期历史的一个快照、获取远程依赖服务的正在停止服务的阻塞者等方法不再一一介绍,读者可自行查询,下面只把代码贴出: /** * Get the name of this service. * 获取服务名 * @return the service name */ String getName(); /** * Get the configuration of this service. * 获取服务的配置信息 * This is normally not a clone and may be manipulated, though there are no * guarantees as to what the consequences of such actions may be * @return the current configuration, unless a specific implentation chooses * otherwise. */ Configuration getConfig(); /** * Get the current service state * 获取当前服务状态 * @return the state of the service */ STATE getServiceState(); /** * Get the service start time * 获取服务启动时间 * @return the start time of the service. This will be zero if the service * has not yet been started. */ long getStartTime(); /** * Query to see if the service is in a specific state. * 查询是否服务是在一个特定的状态 * In a multi-threaded system, the state may not hold for very long. * 在多线程系统中,服务状态可能不会保持很长时间。 * @param state the expected state * @return true if, at the time of invocation, the service was in that state. */ boolean isInState(STATE state); /** * Get a snapshot of the lifecycle history; it is a static list * 获取生命周期历史的一个快照,它是一个静态列表 * @return a possibly empty but never null list of lifecycle events. */ public List<LifecycleEvent> getLifecycleHistory(); /** * Get the blockers on a service -remote dependencies * that are stopping the service from being <i>live</i>. * * 获取远程依赖服务的正在停止服务的阻塞者 * * @return a (snapshotted) map of blocker name->description values */ public Map<String, String> getBlockers();

优秀的个人博客,低调大师

Hadoop Common源码分析之SerializationFactory、Serialization

SerializationFactory是Hadoop中的一个序列化器工厂,它除了用来存储序列化器种类、更新序列化器相关配置信息,还提供了根据指定待序列化类获取相匹配的序列化器和反序列化器的功能。 SerializationFactory中的关键成员变量只有一个,如下: private List<Serialization<?>> serializations = new ArrayList<Serialization<?>>(); serializations是一个存储实现Serialization接口对象的列表,而Serialization代表了序列化器或反序列化器的公共行为,它实际上是对序列化器/反序列化器对的压缩,列表中的对象其实是(序列化器/反序列化器对)的结合体,提供了以下三个方法: /** * <p> * Encapsulates a {@link Serializer}/{@link Deserializer} pair. * </p> * @param <T> */ @InterfaceAudience.LimitedPrivate({"HDFS", "MapReduce"}) @InterfaceStability.Evolving public interface Serialization<T> { /** * Allows clients to test whether this {@link Serialization} * supports the given class. * 允许客户端去检测这个Serialization是否支持给定Class */ boolean accept(Class<?> c); /** * 为给定Class获取一个序列化器Serializer * @return a {@link Serializer} for the given class. */ Serializer<T> getSerializer(Class<T> c); /** * 为给定Class获取一个反序列化器Deserializer * @return a {@link Deserializer} for the given class. */ Deserializer<T> getDeserializer(Class<T> c); } 很明显,accept(Class<?> c)方法允许客户端去检测这个Serialization是否支持给定Class,getSerializer(Class<T> c)方法为给定Class获取一个序列化器Serializer,而getDeserializer(Class<T> c)方法为给定Class获取一个反序列化器Deserializer。 我们再看SerializationFactory的构造函数,它通过读取配置信息conf中的io.serializations参数来确定Serializations,这个参数是一个逗号隔开的类名列表,代码如下: /** * <p> * Serializations are found by reading the <code>io.serializations</code> * property from <code>conf</code>, which is a comma-delimited list of * classnames. * 通过读取配置信息conf中的io.serializations参数来确定Serializations,这个参数是一个逗号隔开的类名列表 * </p> */ public SerializationFactory(Configuration conf) { // 调用父类构造函数 super(conf); // 遍历参数io.serializations配置的序列器名称serializerName, // 参数未配置默认为WritableSerialization、AvroSpecificSerialization、AvroReflectSerialization三个 for (String serializerName : conf.getStrings( CommonConfigurationKeys.IO_SERIALIZATIONS_KEY, new String[]{WritableSerialization.class.getName(), AvroSpecificSerialization.class.getName(), AvroReflectSerialization.class.getName()})) { // 调用add(conf, serializerName)方法添加序列化器 add(conf, serializerName); } } 构造函数先调用父类构造函数,然后遍历参数io.serializations配置的序列器名称serializerName,参数未配置默认为WritableSerialization、AvroSpecificSerialization、AvroReflectSerialization三个,然后调用add(conf, serializerName)方法添加每个序列化器名称。继续追踪add()方法,代码如下: @SuppressWarnings("unchecked") private void add(Configuration conf, String serializationName) { try { // 通过类名serializationName获取Class,即serializionClass Class<? extends Serialization> serializionClass = (Class<? extends Serialization>) conf.getClassByName(serializationName); // 通过反射生成类serializionClass的对象,并将其加入到serializations列表 serializations.add((Serialization) ReflectionUtils.newInstance(serializionClass, getConf())); } catch (ClassNotFoundException e) { LOG.warn("Serialization class not found: ", e); } } add()方法很简单,就做了两件事: 1、通过类名serializationName获取Class,即serializionClass; 2、通过反射生成类serializionClass的对象,这个对象其实是(序列化器/反序列化器对)的结合体,并将其加入到serializations列表。 SerializationFactory还提供了为指定类获取序列化器、反序列化器的getSerializer(Class<T> c)和getDeserializer(Class<T> c)方法,代码如下: // 为指定类c获取序列化器Serializer public <T> Serializer<T> getSerializer(Class<T> c) { // 根据指定类c,调用getSerialization()方法,获取对应序列化器serializer,实际上是确定(序列化器/反序列化器对)对象serializer Serialization<T> serializer = getSerialization(c); if (serializer != null) { // 通过serializer的getSerializer()方法为指定类c获取序列化器的实例 return serializer.getSerializer(c); } // 找不到则返回null return null; } // 为指定类c获取反序列化器Deserializer public <T> Deserializer<T> getDeserializer(Class<T> c) { // 根据指定类c,调用getSerialization()方法,获取对应序列化器serializer,实际上是确定(序列化器/反序列化器对)对象serializer Serialization<T> serializer = getSerialization(c); if (serializer != null) { // 通过serializer的getSerializer()方法为指定类c获取反序列化器的实例 return serializer.getDeserializer(c); } // 找不到则返回null return null; } // 为指定类c获取(序列化器/反序列化器对)对象 @SuppressWarnings("unchecked") public <T> Serialization<T> getSerialization(Class<T> c) { // 遍历serializations列表,获取其中每个Serialization对象serialization for (Serialization serialization : serializations) { // 调用serialization的accept()方法,如果其与c相匹配,则返回该serialization if (serialization.accept(c)) { return (Serialization<T>) serialization; } } // 找不到则返回null return null; } 两个方法的处理逻辑一致,大体如下: 1、根据指定类c,调用getSerialization()方法,获取对应序列化器serializer,实际上是确定(序列化器/反序列化器对)对象serializer; 2、通过serializer的getSerializer()方法或getDeserializer()方法为指定类c获取序列化器或发序列化器的实例,并返回; 3、找不到则返回null。 而两者共用的getSerialization()方法则是为指定类c获取(序列化器/反序列化器对)对象,处理逻辑大致为:遍历serializations列表,获取其中每个Serialization对象serialization,调用serialization的accept()方法,如果其与c相匹配,则返回该serialization,找不到则返回null。

优秀的个人博客,低调大师

Hadoop-2.2.0中文文档—— Common - CLI MiniCluster

目的 使用 CLI MiniCluster, 用户能够简单地仅仅用一个命令就启动或关闭一个单一节点的Hadoop集群,不须要设置不论什么环境变量或管理配置文件。 CLI MiniCluster 同一时候启动一个YARN/MapReduce和HDFS集群。 这对那些想要高速体验一个真实的Hadoop集群或是測试依赖明显的Hadoop函数的非Java程序 的用户非常实用。 Hadoop Tarball 你须要从公布页获取tar包。或者。你能够从源代码中自己编译。 $ mvn clean install -DskipTests $ mvn package -Pdist -Dtar -DskipTests -Dmaven.javadoc.skip 注意:你须要事先安装有 protoc 2.5.0 。 tar包应该在hadoop-dist/target/文件夹. 执行 MiniCluster 从解压出的tar包的根文件夹。你能够用以下的命令启动 CLI MiniCluster : $ bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-2.2.0-tests.jar minicluster -rmport RM_PORT -jhsport JHS_PORT 在上面的命令演示样例中,RM_PORT和JHS_PORT应该由用户的port号替换。假设不指定。会随机使用空暇的port。 命令行參数中有一个数字,用户能够用来控制启动哪个服务。或者传递别的属性。可用的命令行參数例如以下: $ -D <property=value> Options to pass into configuration object $ -datanodes <arg> 启动多少个 datanodes (默认是 1) $ -format 格式化 DFS (默认是 false) $ -help 打印帮助选项 $ -jhsport <arg> JobHistoryServer 端口 (默认是 0--我们选的) $ -namenode <arg> namenode 的 URL (默认 要么是 DFS 集群,要么是暂时文件夹) $ -nnport <arg> NameNode 端口 (默认是 0--我们选的) $ -nodemanagers <arg> 要启动多少个 nodemanagers(默认是 1) $ -nodfs 不启动一个 mini DFS 集群 $ -nomr Don't start a mini MR cluster $ -rmport <arg> ResourceManager 端口 (默认是 0--我们选的) $ -writeConfig <path> 保存配置文件到这个XML文件中。 $ -writeDetails <path> 写出基本信息到这个JSON文件中。 要显示可用的參数的全列表。用户能够传-help參数给上面的命令。 本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5389794.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

System.Drawing.Common在docker报错 The type initializer for 'Gdip' threw a...

今天在asp.net core站点上做一个发送邮件附带二维码的功能,为了方便邮件接受者直接手机扫描打开特定h5页面。采用QRCoder,代码很简单几行 QRCodeGenerator qrGenerator = new QRCodeGenerator(); QRCodeData qrCodeData = qrGenerator.CreateQrCode(content, QRCodeGenerator.ECCLevel.Q); Base64QRCode qrCode = new Base64QRCode(qrCodeData); return qrCode.GetGraphic(5); 返回二维码的base64格式,嵌入img中显示,运行->测试,一切顺利。 提交代码,生成镜像更新到站点,同样的路径走一遍,发现收到的邮件中没有图片。检查日志发现 An unhandled exception has occurred while executing the request.System.TypeInitializationException: The type initializer for 'Gdip' threw an exception. ---> System.DllNotFoundException: Unable to load shared library 'libdl' or one of its dependencies. In order to help diagnose loading problems, consider setting the LD_DEBUG environment variable: liblibdl: cannot open shared object file: No such file or directory at Interop.Libdl.dlopen(String fileName, Int32 flag)at System.Drawing.SafeNativeMethods.Gdip.LoadNativeLibrary() 在github早有前人提交过同样的问题,解决方法是在生成镜像时安装缺失的包 FROM microsoft/aspnetcore:2.0 AS base RUN apt-get update && apt-get install -y apt-utils libgdiplus libc6-dev 重新生成测试通过。因为安装包的缘故,整个镜像生成时间将近20分钟,我就顺便做了一个包含安装包的基础镜像,这样方便后续更新 docker push wyxnj/aspnetcore:latest 用这个作为asp.net core runtime的基础镜像,可以和以前一样快速生成镜像并更新站点。

优秀的个人博客,低调大师

🎉 低代码平台 JECloud v2.0.8 版发布,common 子项目更新

项目简介 JECloud 平台后端采用微服务架构,前端采用微应用架构,可做到不同服务使用不同数据库独立运行。全平台采用基于模型驱动的设计模式,并在前后端留有大量的代码植入入口,方便开发者对平台进行改造扩充。JECloud 适合软件开发公司、企业信息中心、个人开发者使用,适用于开发 ERP、OA、CRM、EAM、WMS、MES、PM 等企业级信息化系统,是企业数字化转型的必备工具 更新日志 v2.0.7 (2023-09-17) Features 【基础平台】:功能列表删除数据时刷新列表数据 【基础平台】:树形功能更多按钮如果配置了权限依赖按钮需要按照对应的按钮权限进行过滤 【基础平台】:子功能集合根据配置改变高度 【基础平台】:showFuncConfig支持$func参数为功能编码字符串 【基础平台】:功能表单组件支持内容颜色配置 【子系统引擎】: app列表配置代码优化 Bug Fixes 【基础平台】:列表拖拽时兼容自定义属性 【基础平台】:优化redis连接池配置,修复590问题 数据升级包 此版本无数据升级包,仅升级各子项目代码即可 系统演示 演示系统(每日 12 点、24 点系统自动回复默认数据库状态) 用 户 名:admin 密 码:123456 快速部署 1、安装版(仅支持 Linux) 安装包下载 安装手册下载 2、Docker-Compose 版(支持 Linux、Windows) 安装包下载 安装手册下载 了解 JECloud 一体机 --》

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册