如何编写一个YARN应用
腾讯云 2023-02-18 02:08:37

本文档在高层次上描述了为 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 种协议来实现应用程序。但是,请注意,对于一般用例,不再鼓励此类行为

编写一个简单的YARN应用

初始化和启动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);

编写ApplicationMaster(AM)

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();

疑难解答

我如何将应用程序的 jar 分发到 YARN 集群中需要它的所有节点?

您可以使用 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 一起发送。

如何获取ApplicationMaster的ApplicationAttemptId?

ApplicationAttemptId 将通过环境变量传递给 AM,环境变量中的值可以通过 ConverterUtils 辅助函数转换为 ApplicationAttemptId 对象。

为什么我的container被NodeManager kill?

这可能是由于高内存使用量超过了您请求的容器内存大小。 造成这种情况的原因有很多。 首先,查看 NodeManager 在终止您的容器时转储的进程树。 您感兴趣的两件事是物理内存和虚拟内存。 如果您超出了物理内存限制,则您的应用程序使用了过多的物理内存。 如果您正在运行 Java 应用程序,则可以使用 -hprof 查看堆中占用空间的内容。 如果您已经超出了虚拟内存,您可能需要增加集群范围的配置变量 yarn.nodemanager.vmem-pmem-ratio 的值。

本文为从大数据到人工智能博主「xiaozhch5」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://lrting.top/backend/12468/

如何编写一个YARN应用

2023-02-18 02:08:37

警方通报特斯拉瑞安交通事故 特斯拉称将全力配合警方调查|世界今日报

2023-02-17 22:28:52

中国美院官网_中国美院教务网

2023-02-17 20:04:08

每日钢市:11家钢厂涨价,黑色系期货飘红,钢价偏强运行

2023-02-17 18:09:02

四川省绵阳市安州区市场监管局雎水所查处在抖音短视频非法销售N95口罩案

2023-02-17 16:36:19

每日消息!送董宇辉户口、车牌与房子?北京平谷辟谣:假消息

2023-02-17 14:54:39

呷哺呷哺遭消协点名,贺光启须知食安比扩张更重要

2023-02-17 12:44:45

热点在线丨ins是什么意思软件_ins是什么意思

2023-02-17 10:41:06

宁夏跑出教育数字化转型“加速度”-速递

2023-02-17 09:03:54

蜈蚣咬伤人会中毒吗_人被小蜈蚣咬了会中毒吗 全球动态

2023-02-17 05:47:49

项羽乌江自刎文言文翻译_项羽乌江自刎

2023-02-17 00:58:41

纯牛奶保质期_纯牛奶的保质期是多久 世界报资讯

2023-02-16 21:50:01

【环球热闻】70岁刘文正病逝,一生无儿无女,留下22栋房产,遗产问题引发热议

2023-02-16 19:11:45

三部门:要发挥结构性货币政策工具引导作用和债券市场融资支持作用 每日快播

2023-02-16 17:03:02

环球微资讯!湖人361组合合体首秀均20+!NBA&ABA合并以来第二个首发三人组

2023-02-16 15:19:25

【世界聚看点】渣打集团(02888)发布2022年度业绩 普通股股东应占溢利29.99亿美元 同比增加12% 将进行10亿美元的股份回购

2023-02-16 12:57:28

世界最资讯丨四川建设更高水平“天府粮仓”

2023-02-16 10:55:29

胸片、胸部CT到底如何选择?

2023-02-16 09:04:25

nice的比较级和最高级_few的比较级和最高级

2023-02-16 08:15:13

极道交易_极道嚣张

2023-02-16 06:57:25

周公解梦梦见自己哭 环球速讯

2023-02-16 05:01:27

天天快资讯丨搓的拼音和组词语_搓的拼音和组词语组词和拼音

2023-02-16 02:07:58

前沿资讯!2月15日基金净值:天弘永利优佳混合A最新净值0.9966,跌0.12%

2023-02-16 01:38:38

2022搬家的黄道吉日,2022搬家吉日吉时查询表|焦点消息

2023-02-15 22:54:25

商铺能抵押贷款吗

2023-02-15 22:40:53

迪马济奥预测多特切尔西首发:贝林厄姆vs恩佐,穆德里克首发

2023-02-15 20:18:39

电信公共wifi怎么使用|短讯

2023-02-15 19:25:24

每人交费120元 最高保障100万元丨云南省职工医疗互助活动(第十九期)开始啦|每日速看

2023-02-15 18:03:21

全球聚焦:2023中山购车补贴活动攻略(时间+领取方式+车商)

2023-02-15 17:16:00

狐假虎威的假是什么意思 狐假虎威的假释义

2023-02-15 16:17:21

金融界人士在法媒撰文 乐观预期2023年中国经济

2023-02-15 15:50:02

什么是微粒贷-观热点

2023-02-15 14:30:45

什么原因导致了用工荒_招工难和用工荒原因_每日快看

2023-02-15 12:53:00

风机盘管价格是多少钱?_世界即时

2023-02-15 12:30:06

欢乐颂2剧情简介大结局_欢乐颂2剧情

2023-02-15 10:49:18

基金分红:平安0-3年期政策性金融债债券基金2月17日分红

2023-02-15 09:25:24

社会主义核心价值观作文10篇_今日聚焦

2023-02-15 08:32:24

上海国企:融资净偿还1.82万元,融资余额112.62万元(02-14)_热门

2023-02-15 07:13:44

2022年《暑假安全第一课》的观后感与反思15篇

2023-02-15 04:32:51

每日资讯:利兹联官方:两战曼联拿出积极表现,斯库巴拉将继续带队

2023-02-15 03:14:10

2023七夕情人节酒吧派对策划方案总结

2023-02-15 00:30:08

世界观天下!iphone已停用连接itunes怎么办_已停用连接itunes解决方法

2023-02-14 23:13:22

勇士队最该培养的年轻人是库明加,勇士培养人的方式让人看不懂_每日快报

2023-02-14 20:38:44

采购员的职责具体内容【10篇】

2023-02-14 20:34:45

过生日送男人什么礼物好 焦点观察

2023-02-14 18:31:19

环球新动态:深圳银保监局:进一步探索优化“跨境理财通”等创新业务

2023-02-14 16:46:10

新疆弹拨乐器有哪些 焦点热闻

2023-02-14 16:34:33

曹蓉 | 画兔子的人|今日热闻

2023-02-14 14:51:21

乔帅执教的中国男篮108-67大胜南京同曦 24岁张镇麟全场最佳 每日热闻

2023-02-14 12:55:18

二十年后回故乡400字作文 快看点

2023-02-14 12:39:28

天天时讯:利空日元?植田和男出任日银新行长,立场多变目前力挺继续宽松

2023-02-14 11:15:18

今日热门!贵州剑河:开学第一天

2023-02-14 09:40:07

市场暖、招工忙,求职更方便 瓶窑这场招聘会把4500个岗位送到家门口

2023-02-14 07:46:46

骷髅精灵全集_骷髅精灵作品集

2023-02-14 05:34:55

男朋友礼物送什么好

2023-02-14 03:26:46

希尔顿是哪个集团-今日热搜

2023-02-14 01:46:49

今亮点!安徽农金网上银行对账系统_安徽农金网上银行对账

2023-02-13 22:57:52

影子老师是什么意思

2023-02-13 22:03:26

海南发布东坡文化古迹研学游线路 邀您一起与东坡“相遇”

2023-02-13 20:18:03

南岳区住建局:多措并举化风险 全力以赴保交楼_每日快播

2023-02-13 18:01:42

文化站工作总结与计划_文化站工作总结-当前焦点

2023-02-13 16:36:33

当前速递!发文用词被指性别歧视,衢州交警致歉

2023-02-13 14:48:00

全球最资讯丨红米抗不住了?Redmi K60官宣降价

2023-02-13 12:43:46

2023北京西城消防安全开学第一课直播回放入口 天天消息

2023-02-13 11:02:25

天天快看点丨送老人什么礼物最好

2023-02-13 09:35:57

盈余公积是什么_什么是盈余公积_今日讯

2023-02-13 08:46:29

每日快讯!汽车报道:长城汽车11月销超13万辆环比增长20.35%

2023-02-12 12:03:47

世界即时看!土叙强震逾2.8万人丧生,87万人急需热食,恐2600万人受灾

2023-02-12 08:52:25

玄爆txt_玄爆 今日播报

2023-02-12 05:10:10

刘复国:共和党不乐见美中缓和 拜登头疼_全球头条

2023-02-12 00:48:51

三阴乳腺癌属于晚期吗_三阴乳癌早中晚期划分

2023-02-11 21:07:38

全球要闻:氧化钙俗称_氧化钙

2023-02-11 17:55:36

中国山水画基础教程图片_中国山水画基础教程 环球热文

2023-02-11 14:48:36

【新要闻】富裕县气象台发布暴雪蓝色预警【IV级/一般】【2023-02-11】

2023-02-11 11:05:25

满满的正能量伴着春风而来——2022:我国国际收支基本平衡

2023-02-11 08:55:10

送老妈礼物过年了

2023-02-11 05:18:35

当前简讯:牙签牛肉怎么做好吃?牙签牛肉的做法大全

2023-02-11 02:30:52

快资讯丨招行金葵花卡生日礼物领取

2023-02-11 01:12:53

游戏王最热门卡组_游戏王卡组世界排名_独家

2023-02-10 23:11:53

长图|我已出舱,感觉良好!-前沿热点

2023-02-10 21:59:15

世界今日报丨眉山癫痫医院

2023-02-10 20:05:20

品牌软文营销的分析介绍

2023-02-10 19:40:04

当前速递!广州聚诚香精香料有限公司

2023-02-10 17:57:42

今头条!莱斯特城中卫瑟云聚呼吁球迷向土耳其灾区捐赠物资

2023-02-10 16:19:54

情人节是什么国家的节日 男子情人节送女友一冰箱冰墩墩 环球关注

2023-02-10 16:04:55

天天微头条丨救援队影像日志·2月9日 | 中国多支救援队奔赴灾区

2023-02-10 15:00:43

湖南草原_关于湖南草原介绍

2023-02-10 12:48:19

通用汽车开发新的卷帘式信息娱乐屏幕可扩展到您需要的尺寸-焦点速看

2023-02-10 11:07:16

出生医学证明怎么查询|全球快看点

2023-02-10 10:32:48

每日焦点!东旭蓝天2月10日快速上涨

2023-02-10 09:36:41

世界今头条!红尘路上我等你简谱教唱视频_红尘路上我等你

2023-02-10 07:59:35

WinXP电脑无缘无故关机的解决方法-系统之家

2023-02-10 06:15:14

深海生物_关于深海生物的基本详情介绍 环球通讯

2023-02-10 04:06:53

光影魔术手使用教程_光影魔术手使用小技巧

2023-02-10 02:23:49

【天天播资讯】表格筛选相同数据公式_表格筛选相同数据

2023-02-10 00:53:38

全球通讯!blackberry_os及10_blackberryos系统

2023-02-09 22:43:16

给暗恋的男生送礼物,送什么都要最火哦 全球播报

2023-02-09 21:14:53

李宗伟近照:骨瘦如柴41岁像60多岁的大爷,仍然生了第三个儿子

2023-02-09 19:07:47

生辰八字起名取名

2023-02-09 18:44:18

大宗交易:丰林集团成交523.24万元,折价8.96%(02-09)

2023-02-09 17:13:43

恒大高新:目前公司尚未涉及新能源汽车业务领域 新资讯

2023-02-09 15:38:20

如何查看cpu温度 查看cpu温度的方法

2023-02-09 14:30:42

当前观察:2月9日屏下摄像板块涨幅达2%

2023-02-09 13:20:17

当前快看:禁毒宣传进车站 联手共筑平安路

2023-02-09 11:03:27

浓白色的羊肉汤里白色的是什么|全球热文

2023-02-09 10:52:27

全球信息:外贸fcs是什么意思_外贸fca是什么意思

2023-02-09 10:26:36

漯河市二院:要以高于常规的标准,推进全国文明典范城市创建!

2023-02-09 08:14:57

男孩跌落枯井 消防成功救援|天天新动态

2023-02-09 06:36:26

创业板上市涨跌幅限制多少?创业板交易规则_环球新资讯

2023-02-09 06:30:48

房屋知识科普:邯郸万浩吉祥回迁房能办房产证吗有没有什么影响吗 世界讯息

2023-02-09 03:44:19

天天观天下!君颐尚渡国际酒店服务指南手册

2023-02-09 02:53:29

高铁车厢座位分布图二等座_高铁车厢座位分布图|新动态

2023-02-09 01:03:47

顶岗实习情况个人总结报告10篇

2023-02-08 22:51:10

学而不思则罔思而不学则殆的意思的短视频 世界看热讯

2023-02-08 22:35:44

日企增产电磁钢板抢占EV时代先机 世界看点

2023-02-08 20:04:22

花雕鸡煲的好吃做法

2023-02-08 19:12:09

闻泰科技: 关于公司股东进行约定购回式证券交易暨股东权益变动的提示性公告 全球聚看点

2023-02-08 18:16:34

23唐山银行CD047今日发布发行公告

2023-02-08 16:49:46

初中物理电学实验知识点 今日精选

2023-02-08 15:33:57

快报:NBA战报丨约基奇半场三双!掘金34分大胜复仇森林狼,拉塞尔遭驱逐

2023-02-08 15:41:24

世界热点!异动快报:欧晶科技(001269)2月8日13点37分触及涨停板

2023-02-08 13:29:42

最贵门票9.2万美元!詹姆斯再次引爆NBA 距离创造历史只差36分

2023-02-08 12:07:07

语文基础知识有哪些

2023-02-08 11:42:37

curtain rod什么意思_curtain什么意思 今亮点

2023-02-08 09:50:51

詹姆斯:我认为我是有史以来最好的篮球运动员_天天播资讯

2023-02-08 08:54:20

淮安执业药师合格证书领取5月25日至6月23日

2023-02-08 07:56:51

员工食堂菜谱大全8元标准2019是多少_员工食堂菜谱大全8元标准2019

2023-02-08 07:32:00

环球实时:mRNA帽状结构

2023-02-08 04:24:34

英国脱欧是什么意思啊?英国脱欧的原因在哪?

2023-02-08 03:55:30

当前视点!Paradizers

2023-02-08 01:22:45

樱桃为什么会有消毒水的味道-世界热讯

2023-02-08 00:10:50

ig什么意思?_女生说IG是什么意思 全球热闻

2023-02-07 23:04:56

【时快讯】十二烷基醚硫酸钠是什么

2023-02-07 20:05:21

淘宝发布宝贝没有多个sku_淘宝新开店铺怎么设置sku超出24个甚至更多呢

2023-02-07 20:03:29

凤凰传媒(601928.SH):控股股东拟将所持10%股份协议转让予中移投资_天天日报

2023-02-07 18:55:03

世界最资讯丨出名太快怎么办_出名太快怎么办书籍介绍

2023-02-07 17:01:15

烟雨江湖2023元宵节灯谜通关技巧-烟雨江湖2023元宵节活动灯谜问题有哪些

2023-02-07 15:41:11

什么是双轨制教育

2023-02-07 14:28:55

江苏全国计算机等级考试报名费用多少2023

2023-02-07 13:01:30

新华全媒+丨多彩非遗扎根青海乡土 传统年俗展现“新气象” 视焦点讯

2023-02-07 12:07:41

有一种爱,不打扰,也会每天想念

2023-02-07 09:46:57

环球短讯!长安欧尚x5胎压显示在哪里看 _奔驰a保养包含哪些

2023-02-07 08:41:33

红绳项链可伸缩活结断了_红绳项链可伸缩活结

2023-02-07 07:19:28

天天百事通!退烧的偏方哪种效果好_治疗退烧偏方有哪些

2023-02-07 03:50:53

【独家焦点】三七血伤宁散

2023-02-07 01:01:07

妈妈驿站和菜鸟驿站的区别_mamayizhan-前沿资讯

2023-02-06 22:34:24

蔚来充电桩76%电量外供 蔚来总裁秦力洪:电动车公司一定要自建桩并开放

2023-02-06 19:05:23

极米科技跌5.79% 兴业证券申银万国在其高点唱多

2023-02-06 17:54:46

安卓系统是一种什么系统_系统yos是安卓系统 通讯

2023-02-06 17:10:19

携程:上线出境团近1200条产品覆盖16国

2023-02-06 15:01:16

【快播报】英搏尔:公司2022年有拓展新的乘用车、商用车和电动工程机械领域客户

2023-02-06 13:41:02

当前观察:齐翔腾达:2月3日融券卖出金额159.72万元,占当日流出金额的2.87%

2023-02-06 11:42:37

当前播报:科幻元宇宙!首钢科幻产业聚集区发力了

2023-02-06 11:05:06

养生能量桶骗局揭秘_能量桶真的养生吗

2023-02-06 07:56:56

【当前热闻】沉疴难起的读法

2023-02-06 05:54:38

涠洲岛旅游攻略必去景点_湛江硇洲岛旅游攻略-今日要闻

2023-02-06 02:16:40

故宫角楼赏月:圆月映衬千里江山图详细内容

2023-02-05 23:56:47

今头条!我国高校首艘破冰船“中山大学极地”号顺利完成渤海冰区试航

2023-02-05 21:16:42

东光小区 世界播报

2023-02-05 19:17:00

百事通!房产资讯:托马斯·希瑟威克揭示了从开普敦谷物筒仓中雕刻出来的Zeitz MOCAA美术馆

2023-02-05 15:47:03

湖人3大隐患曝光!威少首次回应交易,哈姆迷恋3后卫,浓眉用太狠

2023-02-05 13:57:18

罗宾逊:惊讶于拉波尔特缺少上场时间,但在顶级俱乐部这是常事 当前看点

2023-02-05 12:13:02

全球观热点:大学生电子设计大赛

2023-02-05 10:32:05

魔神英雄传礼包码是什么_当前视讯

2023-02-05 07:04:57

大便不通畅老有排不尽的感觉吃什么药_大便不通|全球快播

2023-02-05 04:07:09

fc联合大作战金手指_fc坦克大战金手指 世界热推荐

2023-02-05 01:59:45

郎中的意思简单 郎中的意思

2023-02-04 23:45:44

dfm报告怎么写_dfm报告是什么意思

2023-02-04 21:34:52

中国电信年鉴 世界微动态

2023-02-04 19:23:05

全球观速讯丨三国演义诸葛亮的歇后语_诸葛亮的歇后语

2023-02-04 15:49:40

【快播报】组装电脑最新配置单_组装强劲电脑配置清单2014

2023-02-04 14:49:42

行政公正原则|全球快播报

2023-02-04 12:53:12

全球今日报丨关注|南京出台鼓励汽车消费措施,新能源车免征购置税政策延续

2023-02-04 10:02:06

全球即时:扛不住了!农夫山泉宣布涨价,其他品牌会跟进吗?

2023-02-04 08:11:36

电车降价,相关二手车成烫手山芋!车商:10天降超2万,贬值太快不敢碰 环球观热点

2023-02-04 06:02:38

中金国检 深圳珠宝玉石质量检验中心有限公司

2023-02-04 04:04:14

丹东欣泰电气部件有限公司 每日速讯

2023-02-04 01:36:24

环球通讯!神雕侠侣演员

2023-02-03 23:36:25

全球观点:张杰仰望星空歌词打印_张杰 仰望星空 歌词

2023-02-03 20:59:30

就医预约

2023-02-03 19:49:56

2023重庆马拉松将于3月19日开跑

2023-02-03 17:43:34

奥康国际(603001)2月3日主力资金净卖出273.51万元

2023-02-03 15:32:07

副军级是什么_副军级相当于什么级别 当前观点

2023-02-03 14:36:48

油价调整将于2月3日24时开启

2023-02-03 12:19:41

精准强链补链延链 海口加快构建现代化产业体系-全球热消息

2023-02-03 10:56:26

房产证如何添加共有人在房产证上增加一个共有人是怎么加的

2023-02-03 08:51:26

边检保障快捷通关

2023-02-03 06:41:53

风度MX4价格多少钱?风度MX4大概售价 全球热点

2023-02-03 02:40:39

当前关注:体育女主播张心儿_关于体育女主播张心儿的基本详情介绍

2023-02-02 22:55:01

问政山东丨德州:大型物流园陆续建成 降本增效促消费

2023-02-02 20:08:43

国网温县供电公司:进行物资盘点 助推电网升级|当前热点

2023-02-02 18:31:49

连续两年荣立二等功,县委书记县长为他送喜报

2023-02-02 16:59:29

食品饮料板块表现活跃 千味央厨、味知香等涨停

2023-02-02 14:39:25

02月02日10时湖北随州昨日疫情新增0例、累计报告阳性感染者确诊1307例 天天微动态

2023-02-02 11:48:13

天天热点!北京市市场监管局:元宵、汤圆抽检全部合格

2023-02-02 10:03:49

AG一周赛训只一天,七点卡位赛,月光八点直播活动,凭什么赢?

2023-02-02 07:48:54

农产品加工板块2月1日涨0.96%,欧福蛋业领涨,主力资金净流出3001.82万元-观点

2023-02-02 03:49:22

当前快看:经典话剧剧本适合幼师_经典话剧剧本

2023-02-01 23:03:35

吹风机怎么吹头发_吹风机吹头发的正确方法 焦点观察

2023-02-01 19:42:47

焦点要闻:辽宁中欧班列实现新年“开门红”

2023-02-01 17:34:32