該方法的執(zhí)行過程比較復(fù)雜,我們慢慢來分析,首先來看下簡化的時序圖
3.1waitForCompletion
public boolean waitForCompletion(boolean verbose
) throws IOException, InterruptedException,
ClassNotFoundException {
// 判斷任務(wù)的狀態(tài),如果是DEFINE就提交
if (state == JobState.DEFINE) {
submit();
}
if (verbose) {
// 監(jiān)聽并且輸出任務(wù)信息
monitorAndPrintJob();
} else {
// get the completion poll interval from the client.
int completionPollIntervalMillis =
Job.getCompletionPollInterval(cluster.getConf());
while (!isComplete()) {
try {
// 間隔判斷是否執(zhí)行完成
Thread.sleep(completionPollIntervalMillis);
} catch (InterruptedException ie) {
}
}
}
return isSuccessful();
}
3.2submit
進入submit方法查看
public void submit()
throws IOException, InterruptedException, ClassNotFoundException {
// 再次確認任務(wù)狀態(tài)
ensureState(JobState.DEFINE);
// 默認使用new APIs
setUseNewAPI();
// 初始化cluster對象
connect();
// 根據(jù)初始化得到的cluster對象生成JobSubmitter對象
final JobSubmitter submitter =
getJobSubmitter(cluster.getFileSystem(), cluster.getClient());
//
status = ugi.doAs(new PrivilegedExceptionAction() {
public JobStatus run() throws IOException, InterruptedException,
ClassNotFoundException {
// 進入 submitJobInternal 方法查看
return submitter.submitJobInternal(Job.this, cluster);
}
});
//將job的狀態(tài)設(shè)置為RUNNING
state = JobState.RUNNING;
LOG.info("The url to track the job: " + getTrackingURL());
}
3.3 submitJobInternal
/**
-
檢查job的輸入輸出規(guī)范
-
計算job的InputSplit
-
如果需要的話,設(shè)置需要的核算信息對于job的分布式緩存
-
復(fù)制job的jar和配置文件到分布式文件系統(tǒng)的系統(tǒng)目錄
-
提交作業(yè)執(zhí)行以及監(jiān)控它的狀態(tài)
*/
JobStatus submitJobInternal(Job job, Cluster cluster)
throws ClassNotFoundException, InterruptedException, IOException {
//檢查job的輸出空間
checkSpecs(job);
Configuration conf = job.getConfiguration();
// 將MapReduce框架加入分布式緩存中
addMRFrameworkToDistributedCache(conf);
// 初始化job的工作根目錄并返回path路徑
Path jobStagingArea = JobSubmissionFiles.getStagingDir(cluster, conf);
//configure the command line options correctly on the submitting dfs
InetAddress ip = InetAddress.getLocalHost();
if (ip != null) {
submitHostAddress = ip.getHostAddress();
submitHostName = ip.getHostName();
conf.set(MRJobConfig.JOB_SUBMITHOST,submitHostName);
conf.set(MRJobConfig.JOB_SUBMITHOSTADDR,submitHostAddress);
}
// 為job分配一個名字
JobID jobId = submitClient.getNewJobID();
job.setJobID(jobId);
// 獲得job的提交路徑,也就是在jobStagingArea目錄下建一個以jobId為文件名的目錄
Path submitJobDir = new Path(jobStagingArea, jobId.toString());
JobStatus status = null;
// 進行一系列的配置
try {
conf.set(MRJobConfig.USER_NAME,
UserGroupInformation.getCurrentUser().getShortUserName());
conf.set(“hadoop.http.filter.initializers”,
“org.apache.hadoop.yarn.server.webproxy.amfilter.AmFilterInitializer”);
conf.set(MRJobConfig.MAPREDUCE_JOB_DIR, submitJobDir.toString());
LOG.debug("Configuring job " + jobId + " with " + submitJobDir
- " as the submit dir");
// get delegation token for the dir
TokenCache.obtainTokensForNamenodes(job.getCredentials(),
new Path[] { submitJobDir }, conf);
populateTokenCache(conf, job.getCredentials());
// generate a secret to authenticate shuffle transfers
if (TokenCache.getShuffleSecretKey(job.getCredentials()) == null) {
KeyGenerator keyGen;
try {
keyGen = KeyGenerator.getInstance(SHUFFLE_KEYGEN_ALGORITHM);
keyGen.init(SHUFFLE_KEY_LENGTH);
} catch (NoSuchAlgorithmException e) {
throw new IOException(“Error generating shuffle secret key”, e);
}
SecretKey shuffleKey = keyGen.generateKey();
TokenCache.setShuffleSecretKey(shuffleKey.getEncoded(),
job.getCredentials());
}
// 這個方法實現(xiàn)文件上傳
copyAndConfigureFiles(job, submitJobDir);
Path submitJobFile = JobSubmissionFiles.getJobConfPath(submitJobDir);
// Create the splits for the job
LOG.debug("Creating splits at " + jtFs.makeQualified(submitJobDir));
// 方法內(nèi)部會根據(jù)我們之前的設(shè)置,選擇使用new-api還是old-api分別進行分片操作
int maps = writeSplits(job, submitJobDir);
conf.setInt(MRJobConfig.NUM_MAPS, maps);
LOG.info(“number of splits:” + maps);
// write “queue admins of the queue to which job is being submitted”
// to job file.
String queue = conf.get(MRJobConfig.QUEUE_NAME,
JobConf.DEFAULT_QUEUE_NAME);
AccessControlList acl = submitClient.getQueueAdmins(queue);
conf.set(toFullPropertyName(queue,
QueueACL.ADMINISTER_JOBS.getAclName()), acl.getAclString());
// removing jobtoken referrals before copying the jobconf to HDFS
// as the tasks don’t need this setting, actually they may break
// because of it if present as the referral will point to a
// different job.
TokenCache.cleanUpTokenReferral(conf);
if (conf.getBoolean(
MRJobConfig.JOB_TOKEN_TRACKING_IDS_ENABLED,
MRJobConfig.DEFAULT_JOB_TOKEN_TRACKING_IDS_ENABLED)) {
// Add HDFS tracking ids
ArrayList trackingIds = new ArrayList();
for (Token<? extends TokenIdentifier> t :
job.getCredentials().getAllTokens()) {
trackingIds.add(t.decodeIdentifier().getTrackingId());
}
conf.setStrings(MRJobConfig.JOB_TOKEN_TRACKING_IDS,
trackingIds.toArray(new String[trackingIds.size()]));
自我介紹一下,小編13年上海交大畢業(yè),曾經(jīng)在小公司待過,也去過華為、OPPO等大廠,18年進入阿里一直到現(xiàn)在。
深知大多數(shù)Java工程師,想要提升技能,往往是自己摸索成長或者是報班學(xué)習(xí),但對于培訓(xùn)機構(gòu)動則幾千的學(xué)費,著實壓力不小。自己不成體系的自學(xué)效果低效又漫長,而且極易碰到天花板技術(shù)停滯不前!
因此收集整理了一份《2024年Java開發(fā)全套學(xué)習(xí)資料》,初衷也很簡單,就是希望能夠幫助到想自學(xué)提升又不知道該從何學(xué)起的朋友,同時減輕大家的負擔(dān)。
既有適合小白學(xué)習(xí)的零基礎(chǔ)資料,也有適合3年以上經(jīng)驗的小伙伴深入學(xué)習(xí)提升的進階課程,基本涵蓋了95%以上Java開發(fā)知識點,真正體系化!
由于文件比較大,這里只是將部分目錄大綱截圖出來,每個節(jié)點里面都包含大廠面經(jīng)、學(xué)習(xí)筆記、源碼講義、實戰(zhàn)項目、講解視頻,并且后續(xù)會持續(xù)更新
如果你覺得這些內(nèi)容對你有幫助,可以添加V獲取:vip1024b (備注Java)
結(jié)語
小編也是很有感觸,如果一直都是在中小公司,沒有接觸過大型的互聯(lián)網(wǎng)架構(gòu)設(shè)計的話,只靠自己看書去提升可能一輩子都很難達到高級架構(gòu)師的技術(shù)和認知高度。向厲害的人去學(xué)習(xí)是最有效減少時間摸索、精力浪費的方式。
我們選擇的這個行業(yè)就一直要持續(xù)的學(xué)習(xí),又很吃青春飯。
雖然大家可能經(jīng)常見到說程序員年薪幾十萬,但這樣的人畢竟不是大部份,要么是有名校光環(huán),要么是在阿里華為這樣的大企業(yè)。年齡一大,更有可能被裁。
送給每一位想學(xué)習(xí)Java小伙伴,用來提升自己。
本文到這里就結(jié)束了,喜歡的朋友可以幫忙點贊和評論一下,感謝支持!
一個人可以走的很快,但一群人才能走的更遠。如果你從事以下工作或?qū)σ韵赂信d趣,歡迎戳這里加入程序員的圈子,讓我們一起學(xué)習(xí)成長!文章來源:http://www.zghlxwxcb.cn/news/detail-850617.html
AI人工智能、Android移動開發(fā)、AIGC大模型、C C#、Go語言、Java、Linux運維、云計算、MySQL、PMP、網(wǎng)絡(luò)安全、Python爬蟲、UE5、UI設(shè)計、Unity3D、Web前端開發(fā)、產(chǎn)品經(jīng)理、車載開發(fā)、大數(shù)據(jù)、鴻蒙、計算機網(wǎng)絡(luò)、嵌入式物聯(lián)網(wǎng)、軟件測試、數(shù)據(jù)結(jié)構(gòu)與算法、音視頻開發(fā)、Flutter、IOS開發(fā)、PHP開發(fā)、.NET、安卓逆向、云計算文章來源地址http://www.zghlxwxcb.cn/news/detail-850617.html
71)]
本文到這里就結(jié)束了,喜歡的朋友可以幫忙點贊和評論一下,感謝支持!
一個人可以走的很快,但一群人才能走的更遠。如果你從事以下工作或?qū)σ韵赂信d趣,歡迎戳這里加入程序員的圈子,讓我們一起學(xué)習(xí)成長!
AI人工智能、Android移動開發(fā)、AIGC大模型、C C#、Go語言、Java、Linux運維、云計算、MySQL、PMP、網(wǎng)絡(luò)安全、Python爬蟲、UE5、UI設(shè)計、Unity3D、Web前端開發(fā)、產(chǎn)品經(jīng)理、車載開發(fā)、大數(shù)據(jù)、鴻蒙、計算機網(wǎng)絡(luò)、嵌入式物聯(lián)網(wǎng)、軟件測試、數(shù)據(jù)結(jié)構(gòu)與算法、音視頻開發(fā)、Flutter、IOS開發(fā)、PHP開發(fā)、.NET、安卓逆向、云計算
到了這里,關(guān)于mysql數(shù)據(jù)庫面試題基礎(chǔ)知識,Hadoop之MapReduce04,騰訊java面試流程的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!