使用CapacityTaskScheduler

Hadoop 权限管理 如下图,hadoop访问控制分为两级,其中ServiceLevel Authorization为系统级,用于控制是否可以访问指定的服务,例如用户/组是否可以向集群提交Job,它是最基础的访问控制,优先于文件权限和mapred队列权限验证。Access Control on Job Queues在job调度策略层之上,控制mapred队列的权限。DFSPermmision用户控制文件权限。目前版本中 阅读详情

Hadoop的版本为0.19.2

关于这个调度的详细介绍,可以参考:http://hadoop.apache.org/common/docs/r0.19.2/capacity_scheduler.html

本文只介绍如何搭建一个CapacityTaskScheduler的系统。

在Master机器上执行如下操作:

1 将contrib/capacity-scheduler/hadoop-0.19.2-capacity-scheduler.jar文件拷贝到lib包下面(注意,如果有FairScheduler存在,请先删除这个包)。

2 添加如下内容到hadoop-site.xml文件中:

<property>
  <name>mapred.jobtracker.taskScheduler</name>
  <value>org.apache.hadoop.mapred.CapacityTaskScheduler</value>
</property>

<property>
  <name>mapred.queue.names</name>
  <value>logQueue1,logQueue2,algQueue1,algQueue2,default</value>
</property>

3 在capacity-scheduler.xml文件中填写如下内容:

<?xml version="1.0"?>
<configuration>

    <property>
        <name>mapred.capacity-scheduler.queue.logQueue1.guaranteed-capacity</name>
        <value>20</value>
    </property>

    <property>
        <name>mapred.capacity-scheduler.queue.logQueue1.reclaim-time-limit</name>
        <value>5</value>
    </property>

    <property>
        <name>mapred.capacity-scheduler.queue.logQueue1.supports-priority</name>
        <value>true</value>
    </property>

    <property>
        <name>mapred.capacity-scheduler.queue.logQueue2.guaranteed-capacity</name>
        <value>20</value>
    </property>

    <property>
        <name>mapred.capacity-scheduler.queue.logQueue2.reclaim-time-limit</name>
        <value>5</value>
    </property>

    <property>
        <name>mapred.capacity-scheduler.queue.logQueue2.supports-priority</name>
        <value>true</value>
    </property>

    <property>
        <name>mapred.capacity-scheduler.queue.algQueue1.guaranteed-capacity</name>
        <value>20</value>
    </property>

    <property>
        <name>mapred.capacity-scheduler.queue.algQueue1.reclaim-time-limit</name>
        <value>5</value>
    </property>

    <property>
        <name>mapred.capacity-scheduler.queue.algQueue1.supports-priority</name>
        <value>true</value>
    </property>

    <property>
        <name>mapred.capacity-scheduler.queue.algQueue2.guaranteed-capacity</name>
        <value>20</value>
    </property>

    <property>
        <name>mapred.capacity-scheduler.queue.algQueue2.reclaim-time-limit</name>
        <value>5</value>
    </property>

    <property>
        <name>mapred.capacity-scheduler.queue.algQueue2.supports-priority</name>
        <value>true</value>
    </property>

    <property>
        <name>mapred.capacity-scheduler.queue.default.guaranteed-capacity</name>
        <value>20</value>
    </property>

    <property>
        <name>mapred.capacity-scheduler.queue.default.reclaim-time-limit</name>
        <value>5</value>
    </property>

    <property>
        <name>mapred.capacity-scheduler.queue.default.supports-priority</name>
        <value>true</value>
    </property>

</configuration>

4 重启Hadoop

5 在Job的代码中,设置Job属于的队列:

conf.setQueueName(“QueueName”);

经过以上五步操作以后,我们的调度就配置起来了。

通过JobTracker的web界面看到如下的情况:

Scheduling Information

Queue Name
Scheduling Information

algQueue1
Guaranteed Capacity (%) : 20.0
Guaranteed Capacity Maps : 7
Guaranteed Capacity Reduces : 7
User Limit : 100
Reclaim Time limit : 5
Number of Running Maps : 0
Number of Running Reduces : 0
Number of Waiting Maps : 0
Number of Waiting Reduces : 0
Priority Supported : YES

algQueue2
Guaranteed Capacity (%) : 20.0
Guaranteed Capacity Maps : 7
Guaranteed Capacity Reduces : 7
User Limit : 100
Reclaim Time limit : 5
Number of Running Maps : 0
Number of Running Reduces : 0
Number of Waiting Maps : 0
Number of Waiting Reduces : 0
Priority Supported : YES

default
Guaranteed Capacity (%) : 20.0
Guaranteed Capacity Maps : 7
Guaranteed Capacity Reduces : 7
User Limit : 100
Reclaim Time limit : 0
Number of Running Maps : 0
Number of Running Reduces : 0
Number of Waiting Maps : 0
Number of Waiting Reduces : 0
Priority Supported : YES

logQueue1
Guaranteed Capacity (%) : 20.0
Guaranteed Capacity Maps : 7
Guaranteed Capacity Reduces : 7
User Limit : 100
Reclaim Time limit : 5
Number of Running Maps : 0
Number of Running Reduces : 0
Number of Waiting Maps : 0
Number of Waiting Reduces : 0
Priority Supported : YES

logQueue2
Guaranteed Capacity (%) : 20.0
Guaranteed Capacity Maps : 7
Guaranteed Capacity Reduces : 7
User Limit : 100
Reclaim Time limit : 5
Number of Running Maps : 0
Number of Running Reduces : 0
Number of Waiting Maps : 0
Number of Waiting Reduces : 0
Priority Supported : YES

Hadoop调度算法CapacityScheduler源码分析(2) (3)CapacityTaskScheduler类 核心成员变量: TaskSchedulingMgr mapScheduler = new MapSchedulingMgr(this); Map任务的调度器 TaskSchedulingMgr reduceSchedul 阅读详情

相关推荐

大模型训练流程(四):PPO强化学习实战与调优指南

本文详细解析了大模型训练中PPO强化学习的实战应用与调优技巧,涵盖RLHF核心原理、PPO算法实现及显存优化策略。通过具体案例和代码示例,指导开发者有效提升模型回答质量与安全性,避免常见训练陷阱。

weixin_29051811的博客 438

详谈计算能力调度器CapacityTaskScheduler

Hadoop中有一个默认的基于优先级的FIFO任务调度器JobQueueTaskScheduler,它的主要缺点就是对于在集群比较繁忙的情况,低优先级的作业将很难分配到集群的计算资源,这样对于那些低优先级同时又要求一定的响应时间的短作业来说是非常不利的。值得庆幸的是,Hadoop对作业的任务调度设计地相当灵活,即在它的任务调度器配置上开放了一个接口来允许用户根据自己的应用场景自定义一个合适的任务调

xhh198781的专栏 6137

2023东华大学机试OJ进阶版1-81题

先排序。每次找两个最小的数,把其中一个置为两数之和,并累加这个和值,另一个数置为-1,然后再排序,重复操作,直到只剩下一个数。105。

m0_49263811的博客 2796

Capacity Scheduler and Dynamic Scheduler

CapacityTaskScheduler链接:http://hadoop.apache.org/common/docs/r0.19.2/capacity_scheduler.htmlhttp://hadoop.apache.org/common/docs/r0.20.2/capacity_scheduler.htmlhttps://issues.apache.org/jira/browse/HADOOP-3445特性:支持多个队列,每个job 只会被提交到一个队列上。每个队列被分配了集群容量的一部分容量

lance家园 2346

超过4.2万个AOI(地理围栏),深圳市2025年2月15日更新的全类别AOI,矢量图层(全国22个超大特大城市AOI更新系列)

超过4.2万个AOI(地理围栏),深圳市2025年2月15日更新的全类别AOI,矢量图层(全国22个超大特大城市AOI更新系列)

1072

NI数据采集卡测电流的三种‘姿势’:直接连接、外接分流电阻还是用电流互感器?看完这篇不再纠结

本文全面解析了NI数据采集卡在电流测量中的三种主流方案:直接连接、外接分流电阻和电流互感器。通过对比精度、带宽、隔离等关键参数,结合NI-DAQmx软件生态,为工业自动化、电力监测等场景提供选型指南和实战技巧,帮助工程师优化测量系统设计。

weixin_30882895的博客 422

hadoop 调度器 capacityTaskScheduler

oozie 统计,搭建物理模型,etl服务的请求;各设置25。   1.修改mapred-site.xml   &lt;property&gt; &lt;name&gt;mapred.jobtracker.taskScheduler&lt;/name&gt; &lt;value&gt;org.apache.hadoop.mapred.CapacityTaskScheduler&lt;/value&gt

141

OpenVins解析:基于滤波框架的SLAM

这一方式存在的关键问题是匹配耗时很长,对性能影响显著。可以参考ORBSLAM3中的匹配方式来对其优化,比如左右目匹配可以在极线上搜索,前后帧可以利用运动先验投影匹配。理论上加入路标点会提升精度,代价是增加了计算量。着重说下基于描述子的匹配:OpenVins中匹配的方式是robust_match(),里面是调用的opencv的。openvins中不仅仅进行了传统的MSCKF更新(状态向量中不包含路标点),还在。中进行了包含路标点的估计更新。图像帧到来时,利用IMU递推得到的位姿给该图像帧赋初值。

qq_18076309的博客 4076

Hadoop 任务调度分析启动篇

学习hadoop已有一段时间,  从最初的搭建环境, 配置环境, 编写MapReduce应用, 到基于hive的查询, 慢慢的开始喜欢和习惯它的这种模式, 最近对hadoop集群环境运行原理很感兴趣, 很想知道它究竟是怎么做到这种分步式的运算与协调,  也很想能够从事这方面的工作.  学习了董西成的>一书后, 慢慢的为我揭开了Hadoop的盖头,  通过分析源码的实现, 从中也深刻的体会到架构

kangqiao182的专栏 2197

从零完成 STM32 + ESP-01S + 云服务器 TCP 通信测试

STM32 通过 USART3 控制 ESP-01S 接入手机 2.4 GHz 热点,随后连接公网云服务器 8.152.204.86:9002。云端在同一 TCP 连接中连续收到 seq=1~6 的测试报文,5 个发送间隔平均约 5.4 秒,说明本次 TCP 上行链路已经打通。

weixin_51387720的博客 312

R语言基础之R语言入门

R语言最初是由新西兰奥克兰大学统计系的教授Ross Ihaka和Robert Gentleman在S语言基础上开发完成的。是一门解释性语言。在我看来R语言是一门数学性极强的语言,或者说这是一门为数学而生的语言,因为其具有极其出色的计算与统计分析能力...

weixin_46912400的博客 5万+

hadoop 常见错误及解决方法

报错日志:2013-07-05 18:17:31,885 INFO org.apache.hadoop.mapred.JobTracker: STARTUP_MSG:/************************************************************STARTUP_MSG: Starting JobTrackerSTARTUP_MSG: ...

weixin_33816300的博客 188

8.26华为OD机试真题 新系统 - 字符串回文判 (Java/Py/C/C++/Js/Go)

8.26华为OD机试真题 新系统 - 字符串回文判 (Java/Py/C/C++/Js/Go)

算法大师! 1236

在Java中使用NIO进行网络编程

在JDK中,有一个非常有意思的库:NIO(New I/O)。这个库中有3个重要的类,分别是java.nio.channels中Selector和Channel,以及java.nio中的Buffer。本篇文章我们首先了解一下为什么需要NIO来进行网络编程,然后看看一步一步来讲解如何在网络编程中使用NIO。为什么需要NIO使用Java编写过Socket程序的同学一定都知道Socket和

4439

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

使用Hive的web界面:HWI

HWI是Hive Web Interface的简称,是hive cli的一个web替换方案。 关于如何搭建Hive平台,可以参考:搭建Hive平台 但是目前这个功能做的比较简陋,这篇文章我们一起来看看如何使用hive-0.4.1中自带的hwi来进行操作。 打开HWI 假设hive部署在10.20.151.7机器上,conf/hive-default.xml文件都是默认值,那么我们

4133

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

如何停止java线程

如何停止java的线程一直是一个困恼我们开发多线程程序的一个问题。这个问题最终在Java5的java.util.concurrent中得到了回答:使用interrupt(),让线程在run方法中停止。 简介 在Java的多线程编程中,java.lang.Thread类型包含了一些列的方法start(), stop(), stop(Throwable) and suspend(), destro

2559

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

初识ZooKeeper

Hadoop下面的子项目ZooKeeper是一个用于协调分布式程序的服务。我们可以利用它来保证各个机器之间的数据同步。单机环境运行ZooKeeper1 下载ZooKeeper:http://labs.xiaonei.com/apache-mirror/hadoop/zookeeper/zookeeper-3.2.2/zookeeper-3.2.2.tar.gz2 解压。3

2343

大话Cassandra数据模型

Cassandra是一个开源的分布式数据库,结合了Dynamo的Key/Value与Bigtable的面向列的特点。 Cassandra的特点如下: 1.灵活的schema:不需要象数据库一样预先设计schema,增加或者删除字段非常方便(on the fly)。 2.支持range查询:可以对Key进行范围查询。 3.高可用,可扩展:单点故障不影响集群服务,可线性

1310

揭秘Google Adwords API

搭建一个在线广告营销系统,离不开第三方的支持。而使用第三方提供的API,是一个非常不错的解决方案。 Google提供的Adwords API是一个跨语言的,支持基本所有的主流编程语言。 本文分为四个部分,首先讲解Adwords API是如何做到跨语言的;然后分别讲解Java版本的Client是如何工作的,以及作为开发人员,如何改进和扩展这个API;最后讲解我们在实际的应用中,都遇到了

1155

[翻译]Unit testing with JUnit 4.x and EasyMock in Eclipse - Tutorial

原文地址:http://www.vogella.de/articles/JUnit/article.html本文地址:博客园 逖靖寒 http://gpcuster.cnblogs.com译文:在Eclipse中使用Junit4.x与EasyMock进行单元测试摘要这篇文章简单讲解了如何在Eclipse中利用Junit 4.x和EasyMock进行单元测试。当你阅读

1077

搭建Hive平台

Hive是一个基于Hadoop的数据仓库平台。通过hive,我们可以方便地进行ETL的工作。hive定义了一个类似于SQL的查询语言:HQL,能够将用户编写的QL转化为相应的Mapreduce程序基于Hadoop执行。 本文讲解如何搭建一个Hive平台。假设我们有3台机器:hadoop1,hadoop2,hadoop3。并且都安装好了Hadoop-0.19.2(hive支持的Hadoo

848

Java中的异常

Java异常是我们编程中时时刻刻都要使用的特性,但是我们却很少去关注它细节的一些信息。 Exception架构 所有的异常都是派生至Throwable,最主要的2个继承类是Exception和Error。 我们常说的异常都是指Exception,Exception分为Check Exception和Unchecked Exception。 JDK文档中对Error中解释是:

815

最新大数据毕业设计选题推荐-基于大数据的歌曲流媒体寿命与分发数据可视化分析-大数据-Spark-Hadoop-Bigdata

本文介绍《基于大数据的歌曲流媒体寿命与分发数据可视化分析》系统,采用Hadoop+Spark进行数据存储与处理,结合Django/Spring Boot后端与Vue+Echarts前端,实现音频特征、歌曲寿命、分发渠道等多维度数据分析与可视化。系统涵盖数据清洗、聚合统计、大屏展示等功能,完整呈现歌曲生命周期与渠道影响,为毕业设计提供可落地的大数据实战案例。

IT研究室的博客 23
上一篇: 揭秘Google Adwords API
下一篇: Java中的异常
gpcuster
博客等级 码龄21年 297粉丝 99原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值