如何编写一个YARN应用
在应用的提交流程中,是应用客户端将应用提交到YARNResourceManager。这可以通过设置YarnClient来完成。...
2023-02-18本文档在高层次上描述了为 YARN 实现新应用程序的方法。
(资料图片仅供参考)
在应用的提交流程中,是应用客户端将应用提交到 YARN ResourceManager。这可以通过设置YarnClient来完成。YarnClient启动后,客户端可以设置应用程序环境,准备好包含应用程序的第一个容器ApplicationMaster(AM),然后提交申请。您需要提供诸如应用程序运行所需的本地文件/jar 的详细信息、需要执行的实际命令(带有必要的命令行参数)、任何操作系统环境设置(可选)等信息等等。实际上,您需要描述需要为 ApplicationMaster 启动的 Unix 进程。
然后 YARN ResourceManager 将在分配的容器上启动 ApplicationMaster(如指定的那样)。ApplicationMaster 与 YARN 集群通信,并处理应用程序执行。它以异步方式执行操作。在应用程序启动期间,ApplicationMaster 的主要任务是:
a) 与 ResourceManager 通信,为未来的容器协商和分配资源b) 在容器分配之后,与 YARN NodeManager(NM)通信以启动其上的应用程序容器。任务 a) 可以通过AMRMClientAsync对象异步执行,在AMRMClientAsync.CallbackHandler 中指定事件处理方法事件处理程序的类型。事件处理程序需要显式设置给客户端。任务 b) 可以通过启动一个可运行对象来执行,该对象在分配了容器时启动容器。作为启动此容器的一部分,AM 必须指定具有启动信息(例如命令行规范、环境等)的ContainerLaunchContext。
在应用程序执行期间,ApplicationMaster 通过NMClientAsync对象与NodeManager 通信。所有的容器事件NMClientAsync.CallbackHandler处理并关联NMClientAsync。典型的回调处理程序处理客户端启动、停止、状态更新和错误。ApplicationMaster 还通过处理AMRMClientAsync.CallbackHandler的getProgress()方法向 ResourceManager 报告执行进度。
除了异步客户端之外,某些工作流(AMRMClient和NMClient)还有同步版本。推荐使用异步客户端,因为(主观上)使用更简单,本文将主要介绍异步客户端。有关同步客户端的更多信息,请参阅AMRMClient和NMClient。
以下部分是一些重要的接口:
Client<–>ResourceManager通过使用YarnClient对象 ApplicationMaster<–>ResourceManager通过使用AMRMClientAsync对象,通过AMRMClientAsync.CallbackHandler异步处理事件 ApplicationMaster<–>NodeManager启动容器。通过使用NodeManagers沟通NMClientAsync对象,通过NMClientAsync.CallbackHandler处理容器事件特别提醒:
YARN 应用程序的三个主要协议(ApplicationClientProtocol、ApplicationMasterProtocol 和 ContainerManagementProtocol)仍然保留。3 个客户端封装了这 3 个协议,为 YARN 应用程序提供更简单的编程模型。 在极少数情况下,程序员可能希望直接使用这 3 种协议来实现应用程序。但是,请注意,对于一般用例,不再鼓励此类行为。初始化和启动YarnClient
YarnClient yarnClient = YarnClient.createYarnClient(); yarnClient.init(conf); yarnClient.start();一旦client启动后,即可在yarn上创建应用,并获取应用id
YarnClientApplication app = yarnClient.createApplication();GetNewApplicationResponse appResponse = app.getNewApplicationResponse();YarnClientApplication 对新应用程序的响应还包含有关集群的信息,例如集群的最小/最大资源能力。 这是必需的,以确保您可以正确设置将在其中启动 ApplicationMaster 的容器的规范。 详情请参考 GetNewApplicationResponse。
客户端的主要关键是设置 ApplicationSubmissionContext,它定义了 RM 启动 AM 所需的所有信息。 客户需要将以下内容设置到上下文中:
应用信息:id, name
Queue, priority info:应用程序将被提交到的队列,为应用程序分配的优先级。
用户:提交申请的用户
ContainerLaunchContext:定义将在其中启动和运行 AM 的容器的信息。 如前所述,ContainerLaunchContext 定义了运行应用程序所需的所有必需信息,例如本地 Resources(二进制文件、jar、文件等)、环境设置(CLASSPATH 等)、要执行的命令和安全 Tokens (RECT)。
// set the application submission contextApplicationSubmissionContext appContext = app.getApplicationSubmissionContext();ApplicationId appId = appContext.getApplicationId();appContext.setKeepContainersAcrossApplicationAttempts(keepContainers);appContext.setApplicationName(appName);// set local resources for the application master// local files or archives as needed// In this scenario, the jar file for the application master is part of the local resourcesMap localResources = new HashMap();LOG.info("Copy App Master jar from local filesystem and add to local environment");// Copy the application master jar to the filesystem// Create a local resource to point to the destination jar pathFileSystem fs = FileSystem.get(conf);addToLocalResources(fs, appMasterJar, appMasterJarPath, appId.toString(), localResources, null);// Set the log4j properties if neededif (!log4jPropFile.isEmpty()) { addToLocalResources(fs, log4jPropFile, log4jPath, appId.toString(), localResources, null);}// The shell script has to be made available on the final container(s)// where it will be executed.// To do this, we need to first copy into the filesystem that is visible// to the yarn framework.// We do not need to set this as a local resource for the application// master as the application master does not need it.String hdfsShellScriptLocation = "";long hdfsShellScriptLen = 0;long hdfsShellScriptTimestamp = 0;if (!shellScriptPath.isEmpty()) { Path shellSrc = new Path(shellScriptPath); String shellPathSuffix = appName + "/" + appId.toString() + "/" + SCRIPT_PATH; Path shellDst = new Path(fs.getHomeDirectory(), shellPathSuffix); fs.copyFromLocalFile(false, true, shellSrc, shellDst); hdfsShellScriptLocation = shellDst.toUri().toString(); FileStatus shellFileStatus = fs.getFileStatus(shellDst); hdfsShellScriptLen = shellFileStatus.getLen(); hdfsShellScriptTimestamp = shellFileStatus.getModificationTime();}if (!shellCommand.isEmpty()) { addToLocalResources(fs, null, shellCommandPath, appId.toString(), localResources, shellCommand);}if (shellArgs.length > 0) { addToLocalResources(fs, null, shellArgsPath, appId.toString(), localResources, StringUtils.join(shellArgs, " "));}// Set the env variables to be setup in the env where the application master will be runLOG.info("Set the environment for the application master");Map env = new HashMap();// put location of shell script into env// using the env info, the application master will create the correct local resource for the// eventual containers that will be launched to execute the shell scriptsenv.put(DSConstants.DISTRIBUTEDSHELLSCRIPTLOCATION, hdfsShellScriptLocation);env.put(DSConstants.DISTRIBUTEDSHELLSCRIPTTIMESTAMP, Long.toString(hdfsShellScriptTimestamp));env.put(DSConstants.DISTRIBUTEDSHELLSCRIPTLEN, Long.toString(hdfsShellScriptLen));// Add AppMaster.jar location to classpath// At some point we should not be required to add// the hadoop specific classpaths to the env.// It should be provided out of the box.// For now setting all required classpaths including// the classpath to "." for the application jarStringBuilder classPathEnv = new StringBuilder(Environment.CLASSPATH.$$()) .append(ApplicationConstants.CLASS_PATH_SEPARATOR).append("./*");for (String c : conf.getStrings( YarnConfiguration.YARN_APPLICATION_CLASSPATH, YarnConfiguration.DEFAULT_YARN_CROSS_PLATFORM_APPLICATION_CLASSPATH)) { classPathEnv.append(ApplicationConstants.CLASS_PATH_SEPARATOR); classPathEnv.append(c.trim());}classPathEnv.append(ApplicationConstants.CLASS_PATH_SEPARATOR).append( "./log4j.properties");// Set the necessary command to execute the application masterVector vargs = new Vector(30);// Set java executable commandLOG.info("Setting up app master command");vargs.add(Environment.JAVA_HOME.$$() + "/bin/java");// Set Xmx based on am memory sizevargs.add("-Xmx" + amMemory + "m");// Set class namevargs.add(appMasterMainClass);// Set params for Application Mastervargs.add("--container_memory " + String.valueOf(containerMemory));vargs.add("--container_vcores " + String.valueOf(containerVirtualCores));vargs.add("--num_containers " + String.valueOf(numContainers));vargs.add("--priority " + String.valueOf(shellCmdPriority));for (Map.Entry entry : shellEnv.entrySet()) { vargs.add("--shell_env " + entry.getKey() + "=" + entry.getValue());}if (debugFlag) { vargs.add("--debug");}vargs.add("1>" + ApplicationConstants.LOG_DIR_EXPANSION_VAR + "/AppMaster.stdout");vargs.add("2>" + ApplicationConstants.LOG_DIR_EXPANSION_VAR + "/AppMaster.stderr");// Get final commandStringBuilder command = new StringBuilder();for (CharSequence str : vargs) { command.append(str).append(" ");}LOG.info("Completed setting up app master command " + command.toString());List commands = new ArrayList();commands.add(command.toString());// Set up the container launch context for the application masterContainerLaunchContext amContainer = ContainerLaunchContext.newInstance( localResources, env, commands, null, null, null);// Set up resource type requirements// For now, both memory and vcores are supported, so we set memory and// vcores requirementsResource capability = Resource.newInstance(amMemory, amVCores);appContext.setResource(capability);// Service data is a binary blob that can be passed to the application// Not needed in this scenario// amContainer.setServiceData(serviceData);// Setup security tokensif (UserGroupInformation.isSecurityEnabled()) { // Note: Credentials class is marked as LimitedPrivate for HDFS and MapReduce Credentials credentials = new Credentials(); String tokenRenewer = conf.get(YarnConfiguration.RM_PRINCIPAL); if (tokenRenewer == null | | tokenRenewer.length() == 0) { throw new IOException( "Can"t get Master Kerberos principal for the RM to use as renewer"); } // For now, only getting tokens for the default file-system. final Token> tokens[] = fs.addDelegationTokens(tokenRenewer, credentials); if (tokens != null) { for (Token> token : tokens) { LOG.info("Got dt for " + fs.getUri() + "; " + token); } } DataOutputBuffer dob = new DataOutputBuffer(); credentials.writeTokenStorageToStream(dob); ByteBuffer fsTokens = ByteBuffer.wrap(dob.getData(), 0, dob.getLength()); amContainer.setTokens(fsTokens);}appContext.setAMContainerSpec(amContainer); 设置过程完成后,客户端就可以提交具有指定优先级和队列的应用程序。
// Set the priority for the application masterPriority pri = Priority.newInstance(amPriority);appContext.setPriority(pri);// Set the queue to which this application is to be submitted in the RMappContext.setQueue(amQueue);// Submit the application to the applications manager// SubmitApplicationResponse submitResp = applicationsManager.submitApplication(appRequest);yarnClient.submitApplication(appContext);此时,RM 将接受申请,并在后台完成分配具有所需规格的容器的过程,然后最终在分配的容器上设置和启动 AM。
客户端可以通过多种方式跟踪实际任务的进度。
它可以通过 YarnClient 的 getApplicationReport() 方法与 RM 通信并请求应用程序的报告。
// Get application report for the appId we are interested inApplicationReport report = yarnClient.getApplicationReport(appId);从 RM 收到的 ApplicationReport 包括以下内容:
一般申请信息:申请id、提交申请的队列、提交申请的用户、申请开始时间。ApplicationMaster 详细信息:运行 AM 的主机,它正在侦听来自客户端的请求的 rpc 端口(如果有)以及客户端与 AM 通信所需的令牌。应用程序跟踪信息:如果应用程序支持某种形式的进度跟踪,它可以设置一个跟踪 url,该 url 可通过 ApplicationReport 的 getTrackingUrl() 方法获得,客户端可以查看该 url 以监控进度。应用程序状态:ResourceManager 看到的应用程序状态可通过 ApplicationReport#getYarnApplicationState 获得。 如果 YarnApplicationState 设置为 FINISHED,客户端应参考 ApplicationReport#getFinalApplicationStatus 来检查应用程序任务本身的实际成功/失败。 如果出现故障,ApplicationReport#getDiagnostics 可能有助于进一步了解故障。如果ApplicationMaster支持,client可以直接通过应用报告中的host:rpcport信息向AM自身查询进度更新。 如果可用,它还可以使用从报告中获取的跟踪 url。
在某些情况下,如果应用程序花费的时间太长或由于其他因素,客户端可能希望终止该应用程序。 YarnClient 支持 killApplication 调用,允许客户端通过 ResourceManager 向 AM 发送终止信号。 如果这样设计,ApplicationMaster 也可以通过客户端可以利用的 rpc 层支持中止调用。
yarnClient.killApplication(appId);AM 是作业的实际所有者。 它将由 RM 启动,并通过客户提供有关其负责监督和完成的工作的所有必要信息和资源。
由于 AM 是在一个容器内启动的,该容器可能(很可能会)与其他容器共享一个物理主机,考虑到多租户的性质,除其他问题外,它不能对它可以侦听的预配置端口等做出任何假设 .
当 AM 启动时,几个参数通过环境变量提供给它。 其中包括 AM 容器的 ContainerId、应用程序提交时间和有关运行 ApplicationMaster 的 NM(NodeManager)主机的详细信息。 Ref ApplicationConstants 参数名称。
与 RM 的所有交互都需要一个 ApplicationAttemptId(在失败的情况下每个应用程序可以有多次尝试)。 ApplicationAttemptId 可以从 AM 的容器 id 中获取。 有一些辅助 API 可以将从环境中获得的值转换为对象。
Map envs = System.getenv();String containerIdString = envs.get(ApplicationConstants.AM_CONTAINER_ID_ENV);if (containerIdString == null) { // container id should always be set in the env by the framework throw new IllegalArgumentException( "ContainerId not set in the environment");}ContainerId containerId = ConverterUtils.toContainerId(containerIdString);ApplicationAttemptId appAttemptID = containerId.getApplicationAttemptId(); 在 AM 完全初始化之后,我们可以启动两个客户端:一个到 ResourceManager,一个到 NodeManagers。 我们使用自定义事件处理程序设置它们,我们将在本文后面详细讨论这些事件处理程序。
AMRMClientAsync.CallbackHandler allocListener = new RMCallbackHandler(); amRMClient = AMRMClientAsync.createAMRMClientAsync(1000, allocListener); amRMClient.init(conf); amRMClient.start(); containerListener = createNMCallbackHandler(); nmClientAsync = new NMClientAsyncImpl(containerListener); nmClientAsync.init(conf); nmClientAsync.start();AM 必须向 RM 发出心跳,以通知它 AM 处于活动状态并且仍在运行。 RM 的超时到期间隔由可通过 YarnConfiguration.RM_AM_EXPIRY_INTERVAL_MS 访问的配置设置定义,默认值由 YarnConfiguration.DEFAULT_RM_AM_EXPIRY_INTERVAL_MS 定义。 ApplicationMaster 需要向 ResourceManager 注册自己才能开始心跳。
// Register self with ResourceManager// This will start heartbeating to the RMappMasterHostname = NetUtils.getHostname();RegisterApplicationMasterResponse response = amRMClient .registerApplicationMaster(appMasterHostname, appMasterRpcPort, appMasterTrackingUrl);在注册的响应中,如果包含最大资源能力。 您可能想使用它来检查应用程序的请求。
// Dump out information about cluster capability as seen by the// resource managerint maxMem = response.getMaximumResourceCapability().getMemory();LOG.info("Max mem capability of resources in this cluster " + maxMem);int maxVCores = response.getMaximumResourceCapability().getVirtualCores();LOG.info("Max vcores capability of resources in this cluster " + maxVCores);// A resource ask cannot exceed the max.if (containerMemory > maxMem) { LOG.info("Container memory specified above max threshold of cluster." + " Using max value." + ", specified=" + containerMemory + ", max=" + maxMem); containerMemory = maxMem;}if (containerVirtualCores > maxVCores) { LOG.info("Container virtual cores specified above max threshold of cluster." + " Using max value." + ", specified=" + containerVirtualCores + ", max=" + maxVCores); containerVirtualCores = maxVCores;}List previousAMRunningContainers = response.getContainersFromPreviousAttempts();LOG.info("Received " + previousAMRunningContainers.size() + " previous AM"s running containers on AM registration."); 根据任务要求,AM 可以请求一组容器来运行其任务。 我们现在可以计算我们需要多少个容器,并请求这些容器。
List previousAMRunningContainers = response.getContainersFromPreviousAttempts();LOG.info("Received " + previousAMRunningContainers.size() + " previous AM"s running containers on AM registration.");int numTotalContainersToRequest = numTotalContainers - previousAMRunningContainers.size();// Setup ask for containers from RM// Send request for containers to RM// Until we get our fully allocated quota, we keep on polling RM for// containers// Keep looping until all the containers are launched and shell script// executed on them ( regardless of success/failure).for (int i = 0; i < numTotalContainersToRequest; ++i) { ContainerRequest containerAsk = setupContainerAskForRM(); amRMClient.addContainerRequest(containerAsk);} 在 setupContainerAskForRM() 中,需要设置以下两件事:资源能力:目前,YARN 支持基于内存的资源需求,因此请求应定义需要多少内存。 该值以 MB 为单位定义,并且必须小于集群的最大容量和最小容量的精确倍数。 内存资源对应于对任务容器施加的物理内存限制。 它还将支持基于计算的资源 (vCore),如代码中所示。
优先级:当请求容器集时,AM 可以为每个集定义不同的优先级。 例如,Map-Reduce AM 可以为 Map 任务所需的容器分配更高的优先级,为 Reduce 任务的容器分配更低的优先级。
private ContainerRequest setupContainerAskForRM() { // setup requirements for hosts // using * as any host will do for the distributed shell app // set the priority for the request Priority pri = Priority.newInstance(requestPriority); // Set up resource type requirements // For now, memory and CPU are supported so we set memory and cpu requirements Resource capability = Resource.newInstance(containerMemory, containerVirtualCores); ContainerRequest request = new ContainerRequest(capability, null, null, pri); LOG.info("Requested container ask: " + request.toString()); return request;}在应用程序管理器发送容器分配请求后,容器将由 AMRMClientAsync 客户端的事件处理程序异步启动。 处理程序应实现 AMRMClientAsync.CallbackHandler 接口。
当分配了容器时,处理程序会设置一个线程来运行代码以启动容器。 这里我们使用名称 LaunchContainerRunnable 来进行演示。 我们将在本文的以下部分讨论 LaunchContainerRunnable 类。
@Overridepublic void onContainersAllocated(List allocatedContainers) { LOG.info("Got response from RM for container ask, allocatedCnt=" + allocatedContainers.size()); numAllocatedContainers.addAndGet(allocatedContainers.size()); for (Container allocatedContainer : allocatedContainers) { LaunchContainerRunnable runnableLaunchContainer = new LaunchContainerRunnable(allocatedContainer, containerListener); Thread launchThread = new Thread(runnableLaunchContainer); // launch and start the container on a separate thread to keep // the main thread unblocked // as all containers may not be allocated at one go. launchThreads.add(launchThread); launchThread.start(); }} 在心跳时,事件处理程序报告应用程序的进度。
@Overridepublic float getProgress() { // set progress to deliver to RM on next heartbeat float progress = (float) numCompletedContainers.get() / numTotalContainers; return progress;}容器启动线程实际上是在 NM 上启动容器。 将容器分配给 AM 后,它需要遵循与客户端为将要在分配的容器上运行的最终任务设置 ContainerLaunchContext 所遵循的类似过程。 一旦定义了 ContainerLaunchContext,AM 就可以通过 NMClientAsync 启动它。
// Set the necessary command to execute on the allocated containerVector vargs = new Vector(5);// Set executable commandvargs.add(shellCommand);// Set shell script pathif (!scriptPath.isEmpty()) { vargs.add(Shell.WINDOWS ? ExecBatScripStringtPath : ExecShellStringPath);}// Set args for the shell command if anyvargs.add(shellArgs);// Add log redirect paramsvargs.add("1>" + ApplicationConstants.LOG_DIR_EXPANSION_VAR + "/stdout");vargs.add("2>" + ApplicationConstants.LOG_DIR_EXPANSION_VAR + "/stderr");// Get final commandStringBuilder command = new StringBuilder();for (CharSequence str : vargs) { command.append(str).append(" ");}List commands = new ArrayList();commands.add(command.toString());// Set up ContainerLaunchContext, setting local resource, environment,// command and token for constructor.// Note for tokens: Set up tokens for the container too. Today, for normal// shell commands, the container in distribute-shell doesn"t need any// tokens. We are populating them mainly for NodeManagers to be able to// download anyfiles in the distributed file-system. The tokens are// otherwise also useful in cases, for e.g., when one is running a// "hadoop dfs" command inside the distributed shell.ContainerLaunchContext ctx = ContainerLaunchContext.newInstance( localResources, shellEnv, commands, null, allTokens.duplicate(), null);containerListener.addContainer(container.getId(), container);nmClientAsync.startContainerAsync(container, ctx); NMClientAsync 对象及其事件处理程序一起处理容器事件。 包括容器启动、停止、状态更新、发生错误。
ApplicationMaster确定工作完成后,需要通过AM-RM客户端注销自己,然后停止客户端。
try { amRMClient.unregisterApplicationMaster(appStatus, appMessage, null);} catch (YarnException ex) { LOG.error("Failed to unregister application", ex);} catch (IOException e) { LOG.error("Failed to unregister application", e);}amRMClient.stop();您可以使用 LocalResource 将资源添加到您的应用程序请求中。 这将导致 YARN 将资源分发到 ApplicationMaster 节点。 如果资源是 tgz、zip 或 jar – 您可以让 YARN 解压缩它。 然后,您需要做的就是将解压缩的文件夹添加到您的类路径中。 例如,在创建您的申请请求时:
File packageFile = new File(packagePath);URL packageUrl = ConverterUtils.getYarnUrlFromPath( FileContext.getFileContext().makeQualified(new Path(packagePath)));packageResource.setResource(packageUrl);packageResource.setSize(packageFile.length());packageResource.setTimestamp(packageFile.lastModified());packageResource.setType(LocalResourceType.ARCHIVE);packageResource.setVisibility(LocalResourceVisibility.APPLICATION);resource.setMemory(memory);containerCtx.setResource(resource);containerCtx.setCommands(ImmutableList.of( "java -cp "./package/*" some.class.to.Run " + "1>" + ApplicationConstants.LOG_DIR_EXPANSION_VAR + "/stdout " + "2>" + ApplicationConstants.LOG_DIR_EXPANSION_VAR + "/stderr"));containerCtx.setLocalResources( Collections.singletonMap("package", packageResource));appCtx.setApplicationId(appId);appCtx.setUser(user.getShortUserName);appCtx.setAMContainerSpec(containerCtx);yarnClient.submitApplication(appCtx);如您所见,setLocalResources 命令获取名称到资源的映射。 该名称成为您应用程序的 cwd 中的符号链接,因此您可以使用 ./package/* 引用其中的工件。
注意:Java 的类路径 (cp) 参数非常敏感。 确保语法完全正确。
一旦您的包被分发到您的 AM,每当您的 AM 启动一个新容器时,您都需要遵循相同的过程(假设您希望将资源发送到您的容器)。 代码是一样的。 您只需要确保为您的 AM 提供包路径(HDFS 或本地),以便它可以将资源 URL 与容器 ctx 一起发送。
ApplicationAttemptId 将通过环境变量传递给 AM,环境变量中的值可以通过 ConverterUtils 辅助函数转换为 ApplicationAttemptId 对象。
这可能是由于高内存使用量超过了您请求的容器内存大小。 造成这种情况的原因有很多。 首先,查看 NodeManager 在终止您的容器时转储的进程树。 您感兴趣的两件事是物理内存和虚拟内存。 如果您超出了物理内存限制,则您的应用程序使用了过多的物理内存。 如果您正在运行 Java 应用程序,则可以使用 -hprof 查看堆中占用空间的内容。 如果您已经超出了虚拟内存,您可能需要增加集群范围的配置变量 yarn.nodemanager.vmem-pmem-ratio 的值。
本文为从大数据到人工智能博主「xiaozhch5」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://lrting.top/backend/12468/
标签: Yarn
在应用的提交流程中,是应用客户端将应用提交到YARNResourceManager。这可以通过设置YarnClient来完成。...
2023-02-18
1、600800ST磁卡最近突破阻力价位是在2009-12-7,该日阻力价位304,建议观望。2、如果该股能在200
2023-02-17
一、俄乌冲突一瞥巨舰沉没与无人机作战【环球时报特约记者陈山】相比于激烈的地面战事,俄乌双方的海上...
2023-02-17
赤峰黄金:赤峰黄金关于为子公司提供担保的进展情况公告
2023-02-17
深溪派出所为群众挽回损失10万元本报讯(记者王秦龙)近日,红花岗公安分局深溪派出所成功侦破一起网络...
2023-02-17
项目建设,开工就是决战。2月14日上午,全省高质量发展重大项目建设现场推进会举行,1000余个重大项目集...
2023-02-17
莆田,坐刀轿打铁球闹元宵
2023-02-17
1、广州铁路局援外仓建筑群旧址(办公楼)位于广东省广州市天河区棠兴街18号院内办公楼,是广州市第二批...
2023-02-17
1、六道者:一、天道,二、人道,三、阿修罗道,四、畜生道,五、饿鬼道,六、地狱道。2、此中上三道,...
2023-02-17
1、看你是从事啥行业了,如果没有前置审批的话,带上你的身份证和租房合同到当地工商所办理就行了,哦,...
2023-02-16
美国俄亥俄州因列车脱轨而引发的氯乙烯泄漏事件持续引发关注。据美国福克斯新闻网15日报道,美国交通部...
2023-02-16
为加强对医疗保险定点医药机构的管理,促进定点医药机构不断提高医疗服务质量,切实保障参保人员权益,...
2023-02-16
1、嘉行传媒老板是曾嘉,不是杨幂,杨幂成立的是工作室。2、也就是嘉行的子公司。本文就为大家分享到这...
2023-02-16
同花顺(300033)金融研究中心2月16日讯,有投资者向世龙实业(002748)提问,董秘,您好!请问您2023年...
2023-02-16
相信这段时间,星际争霸的最大新闻肯定是中国的一位电竞选手李培楠拿到了星际争霸世界冠军的消息,这件...
2023-02-16
【华泰证券:供需双重好转燃气行业复苏可期】华泰证券研报指出,2022年全球燃气市场受俄乌冲突影响显著...
2023-02-16
为什么死神完结了是不是作者死了,久保没有去世,死神漫画和电视版本有许多不同,公司声明那些是编辑部...
2023-02-16
在生活中我们都很喜欢小孩子的天真可爱,但是有种说法是在梦中看见的小孩指的是现实中自己周围的小人,...
2023-02-16
毛利率=毛利 营业收入×100%=(主营业务收入-主营业务成本) 主营业务收入×100%。毛利率是毛利与销售...
2023-02-16
大男当婚小宋佳,小宋佳个人资料,小宋佳图片中文名:宋佳别名:小花出生地:哈尔滨出生日期:1980年11...
2023-02-16
2月13日晚间,周黑鸭在港交所发布公告称,预计2022年净利润不少于人民币2000万元,同比降逾90%;报告期...
2023-02-15
1、聚美优品2012广告词:你只闻到我的香水,却没看到我的汗水;你有你的规则,我有我的选择;你否定我的...
2023-02-15
1、可以找到一块布或毛巾,将其浸泡并擦拭脏污的区域,在难以清除污垢的区域添加一些洗衣粉,然后用湿布...
2023-02-15
1、《数学模型(第四版)》是由姜启源、谢金星、叶俊编写,高等教育出版社2011年1月出版的普通高等教育...
2023-02-15
1、你大爷永远是你大爷,2006年春晚流行语。2、出自2006年中央电视台春节联欢晚会小品《说事儿》,是赵...
2023-02-15
【各地房地产市场冷热不均】在各方多重政策的合力下,房地产市场在部分城市呈现难得回暖态势。一些城市...
2023-02-15
不是。信用卡三年不提额,与信用卡本身没有关系。主要原因是用户不符合信用卡提额要求,才造成信用卡无...
2023-02-15
1、TR面料即涤粘混纺织物。涤粘混纺是一种互补性强的混纺。2、涤粘不仅有棉型、毛型,还有中长型。毛型...
2023-02-15
2月14日,成都亿纬动力有限公司成立,注册资本3亿元,法定代表人刘金成。经营范围包含电池制造、电池销...
2023-02-15
最近,因为一个人工智能聊天工具的出现,各大自媒体都在渲染气氛,似乎人人都感到失业的危机,就业的危...
2023-02-15
?转眼半年就过去了,半年的工作是不是感觉收获很多,现在来总结一下自己的这半年的收获和不足了,也为下...
2023-02-15
不一样的新学期!山东多所高校把开学首周定为考试周
2023-02-15
南方财经2月15日电,新年以来,随着A股市场回暖,此前低迷许久的私募销售转好。记者获悉,大型渠道已开...
2023-02-15
高干文是最近这几年在都市言情兴起的一种小说,你喜欢看这类的小说吗?下面学习啦小编就来为大家推荐的男...
2023-02-15
杭州日报讯昨日,杭州市商务局公布2022年度社会消费品零售数据。杭州以7294亿元的社零总额,在全国GDP前...
2023-02-15
秋天,小河是优美的。在这层林尽染、叠翠流金的季节,小河还是一样在流淌,一样在歌唱。接下来小编为大...
2023-02-15
川观新闻记者陈婷今天早上,阳光几经挣扎,终于冲出云层,成都迎回了久违的太阳。不止成都。气象观测显...
2023-02-15
《松下幸之助自传》这本书是简单的介绍了松下幸之助的成长经历,他创办公司的一些事情,以及他的企业家...
2023-02-14
1、笋干泡后发白正常。2、竹笋里面本来就有竹白,晒干后会出现一层白色物质,这是一种正常现象,并非发生...
2023-02-14
1、“XD”是“eXtraDimension(异次元)”的缩写,具有“用NGC的3D画面来展现另外一个口袋妖怪世界”的
2023-02-14
2021年广西三本院校排名广西有不少很不错的三本院校供准备到广西读专科院校的学子选择。以下是小编要与...
2023-02-14
广铁集团怀化车务段每日开行公益性慢火车3 5对,分别是怀化至塘豹7269 7270次、怀化至梅江7271 2次、张家界至
2023-02-14
星华新材(301077)02月14日在投资者关系平台上答复了投资者关心的问题。
2023-02-14
excel中如何使用match函数方法在Excel中MATCH函数可以返回指定内容所在的位置,而INDEX又可以根据指定
2023-02-14
1、个人工作中存在的不足:存在懒惰思想,心浮气躁,不善开动脑筋。2、2、执行公司安排照抄照搬,不会举...
2023-02-14
1、深灰最佳搭配颜色是黑色。2、深灰色和黑色搭配很稳重,很适合成熟男士搭配。3、深灰色可以搭配白颜色...
2023-02-14
太阳能地暖系统是什么?小编来介绍一下吧!太阳能地暖系统是利用太阳能将水加热到30-40度来供居住场地取...
2023-02-14
1、花园行政村隶属彝良县海子乡,距乡政府所在地5公里,到乡道路为土路,交通方便,距县城28公里。2、东...
2023-02-14
1、姓名:梅尼格2、身高:厘米3、体重:公斤4、惯用脚:右脚5、出生地:未知(荷兰)6、国籍:荷
2023-02-14
1、如果用冷水洗头,头皮会突然收缩,如果神经受到冷水的猛烈刺激,就会产生应激反应而引起头痛,甚至感...
2023-02-14
解答:1、三国时期,人们尊称刘备为“左公”。因左公在当地扎营,故名公安。这里的公安的意思特指湖北省...
2023-02-14
中国教育报-中国教育新闻网讯(记者史望颖)近日,宁波市教育局出台了《关于全面加强新时代中小学劳动教...
2023-02-14
BIGBOSS,BIGBOSS是大老板、大头目的意思,常用于口语交际中对于上司的称呼。在16年热播韩剧《太阳的后...
2023-02-14
贵州:大力发展绿色建筑
2023-02-13
newyear是什么节日,Newyear中文翻译是新年伊始的几个星期、新年的意思。NewYear& 39;sDay是指元旦,也...
2023-02-13
1、疱疹很难治愈。所谓治愈,就是得了这个病之后,如果治疗后终身不发作,就叫治愈。但对于疱疹来说,不...
2023-02-13
2月13日,南都记者从中山市公安局获悉,近日,中山一女子收到一件快递礼物,进而落入骗子精心设计的连环...
2023-02-13
长期以来,我国完善的制造业产业链带动了庞大的金属矿产消费量。金属矿产资源对外依存度逐年攀升,特别...
2023-02-13
给女生送礼物,最重要的是你对她的了解,你可以观察她的喜好、习惯、喜好来选择礼物,另外你也可以根据...
2023-02-13
富格林:根绝被骗确保出金安全,交易,出金,富格林,价格走势
2023-02-13
我是学生,我一个好几岁的男生,我们还是学生,平常关系挺好的,学习好不得花钱,想送点礼物给他,送什...
2023-02-13
1、电脑键盘全角半角切换,不知道的请看过来,希望此经验对大家有所帮助,欢迎观看,步骤如下。2、首先...
2023-02-13
02月12日12时江苏南通疫情数据阳了以后为什么会腰疼?应该怎么办?以下为详情!一、02月12日12时南通疫...
2023-02-12
直径2英寸,手感轻如蝉翼;图案包含13种色彩,未用到一滴油墨;肉眼色彩饱满,也将持久闪耀……去年夏天...
2023-02-12
南锣子是南京的,南京的特产。南京的特产是南京特产,南京特色的,南京酥,鸭,鸭,南京鸭,茯苓夹,茯...
2023-02-12
1、电脑打王者荣耀并不怎么舒服可以下载腾讯手游模拟器或者雷电模拟器之类的电脑软件安装之后就是一个安...
2023-02-12
抖音礼物热气球蓝色,抖音就是抖音汉子的特殊节日,这时候大家都会选择给女友送一份礼物,表达对喜欢,...
2023-02-11
1、首先,你要有足够的爱心和耐心,其次是学习有关的幼教知识。2、并加以灵活运用。本文就为大家分享到...
2023-02-11
1、准备原料。布丁果冻粉、白糖、奶锅、模具(杯子也可以)2、将布丁粉和白糖按1:1的比例倒入锅中。3、加...
2023-02-11
从码头到诊室仅用10分钟!这是一场拯救眼球的接力赛
2023-02-11
中国地震台网正式测定:02月11日10时41分在广东河源市源城区(北纬23 76度,东经114 64度)发生4 3级...
2023-02-11
1、歌手名:棉花糖专辑名:小飞行匹配时间为:03分17秒的歌曲棉花糖-陪你到世界的终结作词:庄鹃瑛、沈圣哲
2023-02-11
医护人员到渣园乡杜庄村义诊150余名村民受益本报讯(记者张鸿雨)2月9日,郏县人民医院派驻渣园乡杜庄村...
2023-02-11
孔子弟子漆思弓海昏侯刘贺主墓室西侧出土过一块漆木板,上面画有孔子肖像,这是迄今为止发现的最早的孔...
2023-02-11
夏弥来为大家解答以下的问题,军医大学,说一说军医大学的简介,现在让我们一起来看看吧!1、军医大学是...
2023-02-11
1、几年前ibm把PC业务卖给了联想,所以ibm笔记本准确的说应该是ThinkPad笔记本。但是因为ibm一直以来的...
2023-02-10
2月10日晚间,通宇通讯(002792 SZ)公告,控股股东、实际控制人、董事、高级管理人员时桂清女士计划以...
2023-02-10
六安规划800公里大别山风景道贯穿四县三区80个乡镇
2023-02-10
软文推广真正地铺开,是从将软文投放到各种渠道、发布出来开始的。软文写作是前期准备,软文发布则是将...
2023-02-10
每经AI快讯,有投资者在投资者互动平台提问:请问贵公司是否有涉及AIGC,ChatGPT,数字经济 数据要素 ...
2023-02-10
房产方面的知识对于多数小伙伴们是一般都不太懂的,那么如今买房卖房这当中都会存在着很多的问题的,那...
2023-02-10
记者:鹈鹕不认为现在是押注阿努诺比或大桥的好时机,押注,约翰逊,布里奇斯,美国篮球,凯文杜兰特,新奥尔...
2023-02-10
小编为您整理了羊绒哪个牌子好,分别有鹿王 KingDeer、雪莲 Snowlotus、恒源祥、春竹、鄂尔多斯 ERDO...
2023-02-10
天津军校招生有国防科技大学、陆军工程大学、陆军军事交通学院等,军校在天津高考中非常重要,很多人关...
2023-02-10
1、打开设置并单击。2、点击3、密码锁与人脸识别相关联,4、进入后,点击5、点击6、点击7、,解锁应用程...
2023-02-10
微信好友如何测试,很多小伙伴都会使用微信,而且我们也会加很多的朋友,那么在微信中微信好友如何测试呢?
2023-02-10
9日,2022-2023全国冬季两项锦标赛在甘肃省白银市落幕。在最后一个比赛日的混合接力项目中,辽宁队以1小...
2023-02-10
中新网北京2月10日电(刘欢)继2023年度国考笔试之后,1月以来,全国已有20余省份密集启动了2023年度公务...
2023-02-10
1、现在很多家庭都会考虑买空调,这样可以更好的享受生活。市场上销售的空调品牌很多,中国品牌的空调越...
2023-02-10
02月10日00时海南屯昌疫情数据阳了以后为什么会腰疼?应该怎么办?以下为详情!一、02月10日00时屯昌疫...
2023-02-10
邢台宁晋县小南海历史悠久、文化深厚、佛家圣地,素有 "九龙宝地”之美誉。相传两千多年前,王母娘娘驾...
2023-02-10
1、碧根果能生吃。碧根果营养丰富,果仁中还含有丰富的蛋白质、氨基酸、维生素等,有很高的营养价值,具...
2023-02-09
中岛美嘉的雪之华的歌词翻译歌手:中岛美嘉歌曲:雪花(雪和花)作词:佐藤美作曲:松本杨熙然后把“人”...
2023-02-09
挖掘出的奔驰G原型车听起来很有趣——会是新的AMG吗?自去年以来,梅赛德斯-奔驰一直在测试当前旅行车的...
2023-02-09
报到时,学生与教师聊起新年趣事。近日,雁峰区各学校陆续开学,各学校精心设计了温馨喜庆的迎新活动,...
2023-02-09
龙船节也称为龙舟节、咋瓮或娄瓮,龙船节是苗族的传统节日之一,是黔东南苗族侗族自治州,松桃苗族自治...
2023-02-09
辽宁成大:辽宁成大股份有限公司关于召开2023年第一次临时股东大会的通知
2023-02-09
纪录片部落官网分享:[国家地理]猫谜Cats–CaressingTheTiger高清720P导演:NationalGeographic编剧:Barb...
2023-02-09
1、薛家强林峯饰演:爆Seed、薛Sir,卧底联络员,好意头沐足店老板,前洪英社团坐馆。2、卓凯苗侨伟饰演...
2023-02-09
说到道奇皇冠这个名字,发烧友很可能会想到第五代车型。不幸的是,与挑战者和冲锋枪不同,这种徽章至少...
2023-02-09Copyright © 2015-2022 亚太水产网版权所有 备案号:沪ICP备2020036824号-11 联系邮箱: 562 66 29@qq.com