全球热消息:如何编写一个YARN应用

本文档在高层次上描述了为 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

上一篇 :

有狐臭怎么办 该怎么去掉狐臭_有狐臭怎么办 该怎么去掉狐臭味道 全球即时看

下一篇 :

诉求反馈一键提交!“穗好办”APP上线文明城市建设“随手拍”服务 每日快报

分享到 :

推荐阅读

6699澳元汇率(2023年09月09日澳汇CN300指数是多少)

6699澳元汇率(2023年09月09日澳汇CN300指数是多少)

1、澳汇CN300有专门的文件说明,可以从官网下,也可以找他们的业务员要

2023-09-09
晓鸣股份:公司的祖代蛋种鸡为国外进口

晓鸣股份:公司的祖代蛋种鸡为国外进口

晓鸣股份(300967)09月09日在投资者关系平台上答复了投资者关心的问题。

2023-09-09
暖心守护!杨浦这样推进平安校园建设丨人民城市·政法故事⑤

暖心守护!杨浦这样推进平安校园建设丨人民城市·政法故事⑤

在日常巡逻方面,五角场派出所采取视频与实兵巡逻相结合的形式,加强对

2023-09-09
全新标致e-3008官图泄露,将推插混及纯电

全新标致e-3008官图泄露,将推插混及纯电

全新标致e-3008官图泄露,将推插混及纯电9月7日,全新设计的新标致3008

2023-09-09
麦迪:我认为欧文是现今联盟单挑最强的后卫 库里比尔等也很棒

麦迪:我认为欧文是现今联盟单挑最强的后卫 库里比尔等也很棒

麦迪:我认为欧文是现今联盟单挑最强的后卫库里比尔等也很棒,麦蒂,麦迪

2023-09-09
eminem歌曲大全(eminem好听的歌)

eminem歌曲大全(eminem好听的歌)

来为大家解答以上问题,eminem歌曲大全,eminem好听的歌很多人还不知道

2023-09-09
2023年中国国际(大连)预制菜产业发展大会将举行

2023年中国国际(大连)预制菜产业发展大会将举行

在预制菜成为越来越多人餐桌“新宠”的今天,如何保证口味稳定,提升食

2023-09-08
江西出台19项政策关爱孤独症儿童 含筛查康复教育等方面

江西出台19项政策关爱孤独症儿童 含筛查康复教育等方面

(记者 吴鹏泉)记者8日从江西省残疾人联合会获悉,江西省残联等江

2023-09-08
土耳其vs亚美尼亚预测分析 土耳其vs亚美尼亚比赛预测

土耳其vs亚美尼亚预测分析 土耳其vs亚美尼亚比赛预测

土耳其vs亚美尼亚预测分析,风暴体育讯北京时间9月9日02:45,新赛季欧

2023-09-08
罗湖雨汛形势逐渐平稳 交通有序恢复

罗湖雨汛形势逐渐平稳 交通有序恢复

深圳新闻网2023年9月8日讯(记者杨笑尘)今天上午,强降雨主要出现在罗

2023-09-08
公寓房适合家庭居住吗(公寓适合居住吗)

公寓房适合家庭居住吗(公寓适合居住吗)

一、公寓适合居住吗公寓适合居住,比较适合SOHO办公族、年轻人想买套公

2023-09-08
《三孩来了》王祖蓝夫妇空降带娃 机智分享育儿妙招引全场“抄作业”

《三孩来了》王祖蓝夫妇空降带娃 机智分享育儿妙招引全场“抄作业”

金鹰卡通卫视联合宜品纯羊奶粉推出的全国首档三孩家庭生活观察真人秀《

2023-09-08
第二十三届工博会精准推动补链强链 将展现重点领域攻关突破成果

第二十三届工博会精准推动补链强链 将展现重点领域攻关突破成果

上证报中国证券网讯(记者严曦梦)第二十三届中国国际工业博览会(下称

2023-09-08
港交所:证券及衍生产品市场延迟开市

港交所:证券及衍生产品市场延迟开市

香港交易所宣布,由于黑色暴雨警告现正生效,今天(星期五)证券(包括沪

2023-09-08
安泰科技:公司不直接涉及电池业务

安泰科技:公司不直接涉及电池业务

每经AI快讯,有投资者在投资者互动平台提问:董秘您好:隆基绿能明确未

2023-09-08
从荷马至纳博科夫 吐纳之间的世界文学名著

从荷马至纳博科夫 吐纳之间的世界文学名著

在当下“短平快”的“读图”时代,一些耳熟能详的经典作品总是被选择性

2023-09-08
慧博云通9月1日加速下跌

慧博云通9月1日加速下跌

以下是慧博云通在北京时间9月1日10:27分盘口异动快照:9月1日,慧博云

2023-09-01
国米CEO:没想到卢卡库会去罗马 但这就是足球 足球就是马戏团

国米CEO:没想到卢卡库会去罗马 但这就是足球 足球就是马戏团

马洛塔表示,自己没有想到卢卡库会去罗马,但这就是足球,足球就是马戏

2023-09-01
浙江:到2025年建设加氢站50座以上

浙江:到2025年建设加氢站50座以上

浙江:到2025年建设加氢站50座以上2023年8月28日,浙江省发展和改革委

2023-09-01
《乡村地理》丨登鲁村——金丝楠木第一村

《乡村地理》丨登鲁村——金丝楠木第一村

藏在山腰间的登鲁村。杨晓波 摄登鲁,四面环山,沟谷相连。如同巨大的

2023-09-01
联想启天m6988(联想启天M6900简介)

联想启天m6988(联想启天M6900简介)

HELLO,我是智能手机网小溪,我来为大家解答以上问题。联想启天m6988,

2023-09-01
生兴控股(01472.HK):张为国辞任独立非执行董事

生兴控股(01472.HK):张为国辞任独立非执行董事

格隆汇8月31日丨生兴控股(01472 HK)公告,由于张为国希望将更多时间投

2023-08-31
集美大学什么专业好考研 集美大学什么专业好

集美大学什么专业好考研 集美大学什么专业好

1、本科专业:经济学、国际经济与贸易、财政学、金融学、投资学、法学

2023-08-31
备战亚运 浙江金华铁路部门加强外语等相关培训

备战亚运 浙江金华铁路部门加强外语等相关培训

备战亚运浙江金华铁路部门加强外语等相关培训---杭州亚运会将于9月23日

2023-08-31
祝贺!我国成功发射遥感三十九号卫星

祝贺!我国成功发射遥感三十九号卫星

北京时间2023年8月31日15时36分,我国在西昌卫星发射中心使用长征二号

2023-08-31
天健集团龙虎榜数据(8月31日)

天健集团龙虎榜数据(8月31日)

天健集团今日跌停,全天换手率5 01%,成交额6 32亿元,振幅10 58%。龙

2023-08-31
META举办虚拟键盘打字比赛

META举办虚拟键盘打字比赛

Meta最近举办了一场虚拟键盘打字比赛,展示了RealityLabs虚拟键盘的功

2023-08-31
支朝奇调研督导乡村振兴、基层社会治理等工作

支朝奇调研督导乡村振兴、基层社会治理等工作

8月30日,区委副书记、区长支朝奇深入腰市镇调研督导乡村振兴、基层社

2023-08-31
储蓄型重疾险的优缺点?

储蓄型重疾险的优缺点?

储蓄型重疾险将储蓄元素融入重疾险产品,在保障的同时带来了储蓄收益,

2023-08-31
大力推动人力资源服务业高质量发展
              上海形成引才聚才“强磁场”

大力推动人力资源服务业高质量发展 上海形成引才聚才“强磁场”

上海形成引才聚才“强磁场”,人民政协网是由人民政协报社主办,全方位

2023-08-31
邓白氏编码怎么来的 邓白氏编码是什么

邓白氏编码怎么来的 邓白氏编码是什么

1、邓氏编码是邓白氏拥有的一个独一无二的9位数字全球编码系统,它可以

2023-08-31
9月1日起首部与《反间谍法》配套的地方性法规正式实施

9月1日起首部与《反间谍法》配套的地方性法规正式实施

近期,重庆市人大常委会审议通过《重庆市反间谍工作条例》(以下简称《

2023-08-31
城厢街道聚力推进迎亚运三大提升行动

城厢街道聚力推进迎亚运三大提升行动

亚运会临近,站在萧山区体育中心望去,周边的环境面貌焕然一新。城厢街

2023-08-31
玖月奇迹简历 你知道玖月奇迹吗

玖月奇迹简历 你知道玖月奇迹吗

环球汽车7月消息小杨来为大家解答以上问题,玖月奇迹简历,你知道玖月

2023-08-31
三房巷(600370):8月30日北向资金增持20.28万股

三房巷(600370):8月30日北向资金增持20.28万股

8月30日北向资金增持20 28万股三房巷。近5个交易日中,获北向资金增持

2023-08-31
惠民县桑落墅镇抓好“四个一”便民服务,打造更优政务水平

惠民县桑落墅镇抓好“四个一”便民服务,打造更优政务水平

记者王文彬通讯员杨鹏宇今年来,惠民县桑落墅镇聚焦“一次办好”改革,

2023-08-30
科思科技:拟回购不低于3300万元且不超过5500万元公司股份

科思科技:拟回购不低于3300万元且不超过5500万元公司股份

科思科技(SH688788,收盘价:元)8月30日晚间发布公告称,2023年8月24

2023-08-30
2023中报直击| 万科牢筑财务安全底线,经营性现金流连续14年为正

2023中报直击| 万科牢筑财务安全底线,经营性现金流连续14年为正

“支持上市房企在资本市场融资,保持房企股债融资渠道稳定,支持正常经

2023-08-30
郑州方特梦幻王国国庆营业时间

郑州方特梦幻王国国庆营业时间

以下为2022的,仅供参考,2023年活动公布以后会持续更新郑州方特梦幻王

2023-08-30
键凯科技:8月29日召开业绩说明会,包括知名机构高毅资产的多家机构参与

键凯科技:8月29日召开业绩说明会,包括知名机构高毅资产的多家机构参与

2023年8月30日键凯科技(688356)发布公告称公司于2023年8月29日召开业

2023-08-30
河北受灾地区多措并举确保学生秋季如期开学

河北受灾地区多措并举确保学生秋季如期开学

河北受灾地区多措并举确保学生秋季如期开学

2023-08-30
部分人呼吁抵制日货 外交部回应:日方应做的是立即纠正排放污水这一行径

部分人呼吁抵制日货 外交部回应:日方应做的是立即纠正排放污水这一行径

【外交部发言人汪文斌:日本应立即纠正向海洋排放核污染水的行为】中国

2023-08-30
技术指标粘合线金叉

技术指标粘合线金叉

量化伏妖:技术指标粘合线金叉  技术上粘合线发生金叉,预示短线上涨

2023-08-30
A股高开沪指涨0.27%,华为概念股活跃

A股高开沪指涨0.27%,华为概念股活跃

中新经纬8月30日电周三,A股三大指数集体高开,沪指高开0 27%,深成指

2023-08-30
方达控股(01521.HK)回购100万股 涉资约228.86万港元

方达控股(01521.HK)回购100万股 涉资约228.86万港元

【财华社讯】方达控股(01521 HK)公布,于2023年08月29日回购100万股,

2023-08-30
博士枪杀导师:3年间父母先后去世 曾因高考高分被媒体报道

博士枪杀导师:3年间父母先后去世 曾因高考高分被媒体报道

据央视新闻报道,当地时间8月28日,美国北卡罗来纳大学教堂山分校(UNC

2023-08-30
易建联宣布退役,结束21年篮球生涯

易建联宣布退役,结束21年篮球生涯

易建联宣布退役,结束21年篮球生涯

2023-08-30
A股行情持续回暖 47只连续两日大涨股获机构扎堆关注

A股行情持续回暖 47只连续两日大涨股获机构扎堆关注

昨日A股市场继续反弹,上证指数收涨1 2%,重回3100点大关;两大科创指

2023-08-30
lifeme魅蓝Blus mini真无线耳机体验:百元耳机清新又出彩

lifeme魅蓝Blus mini真无线耳机体验:百元耳机清新又出彩

小尺寸的手机在当下依然有人爱着,那对于小尺寸的真无线耳机了,我觉得

2023-08-30
花溪科技上半年营收和净利润均腰斩:4月6日登陆北交所

花溪科技上半年营收和净利润均腰斩:4月6日登陆北交所

挖贝网8月29日,花溪科技(872895)发布2023年上半年业绩报告,实现营

2023-08-29
2023年郑州购房退税要满足哪些条件

2023年郑州购房退税要满足哪些条件

问:2023年郑州购房退税要满足哪些条件?答:自2024年1月1日至2025年12

2023-08-29
许鸿飞雕塑作品展亮相长春美术馆,南方“肥女”走进北国春城

许鸿飞雕塑作品展亮相长春美术馆,南方“肥女”走进北国春城

8月27日,由吉林省文学艺术界联合会、吉林省美术家协会、广东省文学艺

2023-08-29
教师节来啦!到这个展来看“斜杠”教师的艺术作品

教师节来啦!到这个展来看“斜杠”教师的艺术作品

四川新闻网-首屏新闻成都8月29日讯(记者陈淋)8月29日,在第39个教师

2023-08-29
今日无线网卡价格区别(无线网卡的价格)

今日无线网卡价格区别(无线网卡的价格)

您好,来为大家解答以上问题。无线网卡价格区别,无线网卡的价格很多人

2023-08-29
临颍状元村尊师重教 发放万元奖学金资助莘莘学子

临颍状元村尊师重教 发放万元奖学金资助莘莘学子

8月28日上午,临颍县王孟镇化庄小学院内锣鼓喧天,彩旗飘扬,鞭炮齐鸣

2023-08-29
华为商城正式上线Mate 60系列

华为商城正式上线Mate 60系列

8月28日,华为推出了“HUAWEIMate60Pro先锋计划”,在华为商城,12:08

2023-08-29
牙齿龋坏一定要做根管治疗?-深圳博爱曙光医院

牙齿龋坏一定要做根管治疗?-深圳博爱曙光医院

龋坏的牙齿一阵一阵的刺痛,仿佛在警告你赶紧做治疗,一到医院,医生简

2023-08-29
浙江建德:走出特色乡村振兴之路

浙江建德:走出特色乡村振兴之路

碧水青波荷香远,处暑虽过,浙江建德大慈岩依旧是“映日荷花别样红”的

2023-08-29
[快讯]持续降本增效!会畅通讯上半年营收2.47亿元 经营性净现金流由负转正

[快讯]持续降本增效!会畅通讯上半年营收2.47亿元 经营性净现金流由负转正

8月28日,会畅通讯(300578)发布2023年半年报。报告期内,公司实现营

2023-08-29
红旗HS7 H9 HQ9闪耀长春电影节 助力汽车+电影两城市名片叠加升

红旗HS7 H9 HQ9闪耀长春电影节 助力汽车+电影两城市名片叠加升

2023年8月28日,以“新时代·新摇篮·新力量·新突破”为主题的第十八

2023-08-29
硕士学位类别是什么意思(硕士研究生的学位类别如何填写)

硕士学位类别是什么意思(硕士研究生的学位类别如何填写)

硕士学位类别是什么意思,硕士研究生的学位类别如何填写这个很多人还不

2023-08-29
粤港澳社会组织创建青年创业就业合作平台

粤港澳社会组织创建青年创业就业合作平台

8月28日下午,引力大湾区青年“兴”引擎——2023粤港澳大湾区社会组织

2023-08-28
最新战报,国乒男团最强阵容爆冷丢冠!王楚钦连输两场是主因

最新战报,国乒男团最强阵容爆冷丢冠!王楚钦连输两场是主因

为更好备战亚锦赛和亚运会的国乒近日举办了队内热身赛,结果首日团体比

2023-08-28
逐梦乡村 | 成为网红之后

逐梦乡村 | 成为网红之后

逐梦乡村|成为网红之后-网友喜欢刘元杰的努力、率性、真诚、豁达,这意

2023-08-28
安杰思:
产线预计在今年年底至明年年初完成搬迁工作,公司在搬迁的同时也会保证充足的库存,请您放心

安杰思: 产线预计在今年年底至明年年初完成搬迁工作,公司在搬迁的同时也会保证充足的库存,请您放心

安杰思(688581)08月28日在投资者关系平台上答复了投资者关心的问题。

2023-08-28
奇瑞e3重量多少及相关信息

奇瑞e3重量多少及相关信息

奇瑞e3重量多少奇瑞e3是奇瑞汽车公司生产的一款电动汽车,作为一款环保

2023-08-28
莲华(关于莲华简述)

莲华(关于莲华简述)

,你们好,今天0471房产来聊聊一篇华,华简述的文章,网友们对这件事情

2023-08-28
今日黄金首饰价格多少钱一克(2023年8月28日)

今日黄金首饰价格多少钱一克(2023年8月28日)

2023年8月28日黄金首饰价格多少钱一克?日内国内黄金行情如何?以下是

2023-08-28
7大饮食小常识!以前全吃错了

7大饮食小常识!以前全吃错了

1水不是最补水的饮品补水指数是指液体在体内存留的时间,时间越久,补

2023-08-28
港媒:渲染中国经济“困难”,美国将自己置于险境

港媒:渲染中国经济“困难”,美国将自己置于险境

香港《南华早报》8月26日文章,原题:对中国经济问题幸灾乐祸,美国将

2023-08-28
云南马龙区:“守门人”让群众安全更安心

云南马龙区:“守门人”让群众安全更安心

连日来,走进云南曲靖市马龙区月望乡水箐村民小组,远远就能看见一群身

2023-08-28
8K显示器来了!三星G9正式上市,超高规格以及超高价格

8K显示器来了!三星G9正式上市,超高规格以及超高价格

基本上,目前显示器领域要说普及了4K也不是啥大问题,当然如果是游戏用

2023-08-28
iPhone15系列全新USB-C,还将新增灰色配色!

iPhone15系列全新USB-C,还将新增灰色配色!

对于众多的苹果粉丝来说,每年iPhone新机的发布都是一件令人兴奋的大事

2023-08-27
水上公园新儿童乐园投入运营

水上公园新儿童乐园投入运营

27日,新开园不久的水上公园儿童乐园迎来5000多名游客。

2023-08-27
杰恩设计(300668.SZ)发布上半年业绩,净利润3045.8万元,同比增长114.63%

杰恩设计(300668.SZ)发布上半年业绩,净利润3045.8万元,同比增长114.63%

智通财经讯,杰恩设计(300668 SZ)发布2023年半年度报告,公司营业收入3

2023-08-27
汤汪路北延最新进展:已完成全部水稳铺设 向北连接上横沟

汤汪路北延最新进展:已完成全部水稳铺设 向北连接上横沟

扬州发布记者姜传刚文 图27日,记者在京杭大运河西岸的汤汪路北延工程

2023-08-27
2023第二届无锡市魔方运动会(夏季赛)落幕!

2023第二届无锡市魔方运动会(夏季赛)落幕!

8月20日,2023第二届无锡市魔方运动会(夏季赛)成功举办。此次赛事由

2023-08-27
张稀哲生涯赚了多少钱?张稀哲家庭背景?张稀哲鲜为人知故事曝光

张稀哲生涯赚了多少钱?张稀哲家庭背景?张稀哲鲜为人知故事曝光

奥乌苏推远角破门扳回一球【张稀哲赛后采访】第一个进球比较幸运,取得

2023-08-27
琼州海峡南北两岸客货车“一站式”过海 省时更省心

琼州海峡南北两岸客货车“一站式”过海 省时更省心

提前购票后开车前往港口,预约通道2秒便可自动识别,随后完成安检进入

2023-08-27
莲花社区-志愿者服务队(关于莲花社区-志愿者服务队简述)

莲花社区-志愿者服务队(关于莲花社区-志愿者服务队简述)

,你们好,今天0471房产来聊聊一篇花社区-志愿者服务队,花社区-志愿

2023-08-27
庄子三言指的是哪三言(庄子三言)

庄子三言指的是哪三言(庄子三言)

1、寓言:有关夸张离奇,幻想奇异。2、重言:有关探讨前人,圣人提出的

2023-08-27
国内海上平台最大段塞流捕集器完成陆地吊装

国内海上平台最大段塞流捕集器完成陆地吊装

海油工程消息,近日,“深海一号”二期工程新建平台段塞流捕集器在海油

2023-08-26
以“用户思维”定义交付和品质,中海汇德里让“家”更懂客户

以“用户思维”定义交付和品质,中海汇德里让“家”更懂客户

作为一家坚持“长期主义”的央企开发商,中海将持续以“用户思维”去组

2023-08-26
亿缕阳光|有一种甜叫隔代亲

亿缕阳光|有一种甜叫隔代亲

愿时光再慢一点,让陪伴再多一点

2023-08-26
暴雨最强时段将至!这些地方降雨具有极端性

暴雨最强时段将至!这些地方降雨具有极端性

新一轮降雨过程已于8月25日上线,未来三天,强降雨将自西向东横扫我国

2023-08-26
拒绝千万年薪!免签国米!张康阳神了,一进一出,赢得金钱和未来

拒绝千万年薪!免签国米!张康阳神了,一进一出,赢得金钱和未来

国米正式宣布和老将桑切斯完成签约,这次国米将会为桑切斯送上一份280

2023-08-26
中国驻泰使馆通报:已寻获张某 争取尽快安排其回国

中国驻泰使馆通报:已寻获张某 争取尽快安排其回国

中新网8月26日电中国驻泰国大使馆微信公众号发布关于驻泰使领馆积极协

2023-08-26
楼市政策优化放大招 三部门合力推动“认房不认贷”

楼市政策优化放大招 三部门合力推动“认房不认贷”

“认房不认贷”终于来了。8月25日,《证券日报》记者从住房和城乡建设

2023-08-26
科创板融资余额减少2.56亿元

科创板融资余额减少2.56亿元

截至6月30日,科创板两融余额合计1072 89亿元,较上一交易日增加1 89亿

2023-08-26
本周盘点(8.21-8.25):福事特周跌13.14%,主力资金合计净流出2625.88万元

本周盘点(8.21-8.25):福事特周跌13.14%,主力资金合计净流出2625.88万元

截至2023年8月25日收盘,福事特(301446)报收于31 52元,较上周的36 2

2023-08-26
全新福特EcoBlue发动机在全顺范围首次亮相

全新福特EcoBlue发动机在全顺范围首次亮相

新的福特全顺和全顺定制商务车将采用该公司的新型EcoBlue柴油发动机。

2023-08-25
阳光股份(000608.SZ)半年报净亏损2206.94万元,同比收窄

阳光股份(000608.SZ)半年报净亏损2206.94万元,同比收窄

格隆汇8月25日丨阳光股份(000608 SZ)披露2023年半年度报告,实现营业收

2023-08-25
ST贵人:
关于该案件如有相关进展,公司将及时履行信息披露义务

ST贵人: 关于该案件如有相关进展,公司将及时履行信息披露义务

ST贵人(603555)08月25日在投资者关系平台上答复了投资者关心的问题。

2023-08-25
回了趟老家,不想再回城里了!老宅老院,还是我们农村人的归宿!

回了趟老家,不想再回城里了!老宅老院,还是我们农村人的归宿!

2004年,我离开成长的村庄,去40里外的县城读书,寄宿制,每月回家

2023-08-25
宁波市自2023年9月1日起实施境外旅客购物离境退税政策。

宁波市自2023年9月1日起实施境外旅客购物离境退税政策。

宁波市自2023年9月1日起实施境外旅客购物离境退税政策。:宁波市自2023

2023-08-25
意媒:拉齐奥有意引进贡多齐,马赛要价约1800万欧

意媒:拉齐奥有意引进贡多齐,马赛要价约1800万欧

直播吧8月25日讯据《罗马体育报》和《米兰体育报》报道,拉齐奥有意引

2023-08-25
8月25日午间评论

8月25日午间评论

8月25日午间评论周五上午A股市场呈现探底之后震荡消化的格局,截止午间

2023-08-25
全球金属供应链稳定性面临挑战 再生铝产业规模持续扩大

全球金属供应链稳定性面临挑战 再生铝产业规模持续扩大

全球金属供应链稳定性面临挑战近年来,全球重要工业国都把关键矿产供应

2023-08-25
上海贸促集团9065万元转让上海国贸中心3.52%股权

上海贸促集团9065万元转让上海国贸中心3.52%股权

此次挂牌转让底价9065万元,披露公告期为20个工作日,披露结束日期为20

2023-08-25
“太空菜园”丰收了!中国空间站太空栽培喜获丰收

“太空菜园”丰收了!中国空间站太空栽培喜获丰收

“太空菜园”丰收了!中国空间站太空栽培喜获丰收---目前,国家太空实

2023-08-25
x 广告
x 广告

Copyright ©  2015-2022 大河水产网版权所有  备案号:京ICP备2022022245号-75   联系邮箱:435 226 40@qq.com