在启动master
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在启动master相关的知识,希望对你有一定的参考价值。
参考技术A 以下。一、master启动流程
1、脚本启动
1.1、启动脚本(start-hbase.sh)阅读:
"$bin"/hbase-daemon.sh--config"$HBASE_CONF_DIR"$commandToRunmaster
1.2、hbase-daemon.sh:
(start)
check_before_start
hbase_rotate_log$HBASE_LOGOUT
hbase_rotate_log$HBASE_LOGGC
echorunning$command,loggingto$HBASE_LOGOUT
$thiscmd--config"$HBASE_CONF_DIR"\\
foreground_start$command$args$HBASE_LOGOUT2>&1&
disown-h-r
sleep1;head"$HBASE_LOGOUT"
;;
(foreground_start)
trapcleanAfterRunSIGHUPSIGINTSIGTERMEXIT
if["$HBASE_NO_REDIRECT_LOG"!=""];then
#NOREDIRECT
echo"`date`Starting$commandon`hostname`"
echo"`ulimit-a`"
#incasetheparentshellgetsthekillmakesuretotrapsignals.
#Onlyonewillgetcalled.Eitherthetraportheflowwillgothrough.
nice-n$HBASE_NICENESS"$HBASE_HOME"/bin/hbase\\
--config"$HBASE_CONF_DIR"\\
$command"$@"start&
else
echo"`date`Starting$commandon`hostname`">>$HBASE_LOGLOG
echo"`ulimit-a`">>"$HBASE_LOGLOG"2>&1
#incasetheparentshellgetsthekillmakesuretotrapsignals.
#Onlyonewillgetcalled.Eitherthetraportheflowwillgothrough.
nice-n$HBASE_NICENESS"$HBASE_HOME"/bin/hbase\\
--config"$HBASE_CONF_DIR"\\
$command"$@"start>>$HBASE_LOGOUT2>&1&
fi
#Addtothecommandlogfilevitalstatsonourenvironment.
hbase_pid=$!
echo$hbase_pid>$HBASE_PID
wait$hbase_pid
;;
2、master的类实例化:
//1、创建rpc工厂类
rpcControllerFactory=RpcControllerFactory.instantiate(this.conf);
rpcRetryingCallerFactory=RpcRetryingCallerFactory.instantiate(this.conf);
rpcServices=createRpcServices();
this.rpcServices.start(zooKeeper);
//2、登录zk,并设置主监听ZKWatcher
ZKUtil.loginClient(this.conf,HConstants.ZK_CLIENT_KEYTAB_FILE,
HConstants.ZK_CLIENT_KERBEROS_PRINCIPAL,hostName);
zooKeeper=newZKWatcher(conf,getProcessName()+":"+
rpcServices.isa.getPort(),this,canCreateBaseZNode());
//3、启动线程,追踪master的地址,集群状态
masterAddressTracker=newMasterAddressTracker(getZooKeeper(),this);
masterAddressTracker.start();
clusterStatusTracker=newClusterStatusTracker(zooKeeper,this);
clusterStatusTracker.start();
//4、用于记录RegionServer的一些基本的实时信息,包括全局的memstore大小,memstore堆上堆
外开销,还包括replayeditsperregion
regionServerAccounting=newRegionServerAccounting(conf);
//5、是否启动blockCache块缓存和mob缓存,下边是判断条件,核心就是看看有没有表
booleanisMasterNotCarryTable=
thisinstanceofHMaster&&!LoadBalancer.isTablesOnMaster(conf);
if(!isMasterNotCarryTable)
blockCache=BlockCacheFactory.createBlockCache(conf);
mobFileCache=newMobFileCache(conf);
//6、启动文件系统
initializeFileSystem();
//7、实例化用于收集“Spans”结构的信息的追踪系统
spanReceiverHost=SpanReceiverHost.getInstance(getConfiguration());
3、run方法启动master:
?
最终通过hbase命令启动master,然后通过HMasterCommandLine执行HMaster中的run方法:
publicvoidrun()
try
if(!conf.getBoolean("hbase.testing.nocluster",false))
Threads.setDaemonThreadRunning(newThread(()->
try
intinfoPort=putUpJettyServer();
startActiveMasterManager(infoPort);
catch(Throwablet)
//Makesurewelogtheexception.
Stringerror="FailedtobecomeActiveMaster";
LOG.error(error,t);
//Abortshouldhavebeencalledalready.
if(!isAborted())
abort(error,t);
),getName()+":becomeActiveMaster");
//Fallinhereevenifwehavebeenaborted.Needtoruntheshutdownservicesand
//thesuperruncallwilldothisforus.
super.run();
finally
if(this.clusterSchemaService!=null)
//Ifonwayout,thenwearenolongeractivemaster.
this.clusterSchemaService.stopAsync();
try
this.clusterSchemaService.awaitTerminated(
getConfiguration().getInt(HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS,
DEFAULT_HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS),TimeUnit.SECONDS);
catch(TimeoutExceptionte)
LOG.warn("FailedshutdownofclusterSchemaService",te);
this.activeMaster=false;
1、注册backupmaster:
1.1startActiveMasterManager方法将会在znode中注册为backupmaster,因为最终不一定能成为active。当activemaster存在并知晓当前的backupmaster以后,就不会分配region给当前服务。
privatevoidstartActiveMasterManager(intinfoPort)throwsKeeperException
StringbackupZNode=ZNodePaths.joinZNode(
zooKeeper.getZNodePaths().backupMasterAddressesZNode,serverName.toString());
LOG.info("AddingbackupmasterZNode"+backupZNode);
if(!MasterAddressTracker.setMasterAddress(zooKeeper,backupZNode,serverName,infoPort))
LOG.warn("Failedcreateof"+backupZNode+"by"+serverName);
1.2、MasterAddressTracker.setMasterAddress将会调用zkUtil来完成节点和监听者的创建:
publicstaticbooleansetMasterAddress(finalZKWatcherzkw,
finalStringznode,finalServerNamemaster,intinfoPort)
throwsKeeperException
returnZKUtil.createEphemeralNodeAndWatch(zkw,znode,toByteArray(master,infoPort));
2、启动线程,尝试成为activemaster:
blockUntilBecomingActiveMaster会阻塞,通过while不停地抢占znode:
if(activeMasterManager.blockUntilBecomingActiveMaster(timeout,status))
finishActiveMasterInitialization(status);
在检查到可以成为activemaster之前,会删除znode中的backup信息,并修改状态为active:
if(ZKUtil.checkExists(this.watcher,backupZNode)!=-1)
LOG.info("DeletingZNodefor"+backupZNode+"frombackupmasterdirectory");
ZKUtil.deleteNodeFailSilent(this.watcher,backupZNode);
开始启动当前节点为activemaster:
privatevoidfinishActiveMasterInitialization(MonitoredTaskstatus)
循环判断当前节点是否还是master
//StarttheZombiemasterdetectoraftersettingmasterasactive,seeHBASE-21535
ThreadzombieDetector=newThread(newInitializationMonitor(this),
"ActiveMasterInitializationMonitor-"+System.currentTimeMillis());
zombieDetector.setDaemon(true);
zombieDetector.start();
master成为activemaster的过程:
//如果系统中有表就初始化MemStoreLAB
if(LoadBalancer.isTablesOnMaster(conf))
initializeMemStoreChunkCreator();
//初始化文件系统
this.fileSystemManager=newMasterFileSystem(conf);
this.walManager=newMasterWalManager(this);
//启动tabledesc缓存
this.tableDescriptors.setCacheOn();
initializeMemStoreChunkCreator初始化主要是MemstoreLab创建对象,封装参数:
配置文件中对应的参数有三个:
hbase.hregion.memstore.mslab.enabled:是否启用memstoreLab
hbase.hregion.memstore.mslab.chunksize:chunk的尺寸
hbase.hregion.memstore.mslab.max.allocation:MSLAB中单次分配内存的最大尺寸,默认256K,超过该尺寸的内存直接在Heap上分配,当key/value大小大于256k,认为不是内存碎片
MemStoreChunkPool&MSLAB可以用来检测内存碎片并优化,从而避免regionserver产生大量的堆碎片-------传送门
MasterFileManager,封装了HMaster对底层文件系统的基本操作接口,交互所需的创建初始化布局,检查文件系统等
MasterWalManager则负责日志的管理,如拆分、查找文件&目录等操作
将clusterId存到zk中:
ZKClusterId.setClusterId(this.zooKeeper,fileSystemManager.getClusterId());
publicstaticvoidsetClusterId(ZKWatcherwatcher,ClusterIdid)
throwsKeeperException
ZKUtil.createSetData(watcher,watcher.getZNodePaths().clusterIdZNode,id.toByteArray());
启动HBCK:
if(this.conf.getBoolean("hbase.write.hbck1.lock.file",true))
HBaseFsck.checkAndMarkRunningHbck(this.conf,
HBaseFsck.createLockRetryCounterFactory(this.conf).create());
创建一个管理work的线程池:
createProcedureExecutor();
创建一个作业管理器,并返回处于RIT状态的region列表
//CreateAssignmentManager
this.assignmentManager=createAssignmentManager(this);
this.assignmentManager.start();
//TODO:TRSPcanperformasthesubprocedureforotherprocedures,soevenifitismarkedas
//completed,itcouldstillbeintheprocedurelist.Thisisabitstrangebutisanother
//story,needtoverifytheimplementationforProcedureExecutorandProcedureStore.
List
procsByType.getOrDefault(TransitRegionStateProcedure.class,Collections.emptyList()).stream()
.filter(p->!p.isFinished()).map(p->(TransitRegionStateProcedure)p)
.collect(Collectors.toList());
this.assignmentManager.setupRIT(ritList);
创建RegionServerTracker,该服务用于通过zk追踪reigonserver的状态。然后通过(initializeZKBasedSystemTrackers)初始化其他基于zk的追踪器。
this.regionServerTracker=newRegionServerTracker(zooKeeper,this,this.serverManager);
this.regionServerTracker.start(
procsByType.getOrDefault(ServerCrashProcedure.class,Collections.emptyList()).stream()
.map(p->(ServerCrashProcedure)p).map(p->p.getServerName()).collect(Collectors.toSet()),
walManager.getLiveServersFromWALDir(),walManager.getSplittingServersFromWALDir());
//ThismanagerwillbestartedAFTERhbase:metaisconfirmedonline.
//hbase.mirror.table.state.to.zookeeperissohbase1clientscanconnect.Theyreadtable
//statefromzookeeperwhilehbase2readsitfromhbase:meta.Disableifnohbase1clients.
this.tableStateManager=
this.conf.getBoolean(MirroringTableStateManager.MIRROR_TABLE_STATE_TO_ZK_KEY,true)
?
newMirroringTableStateManager(this):
newTableStateManager(this);
status.setStatus("InitializingZKsystemtrackers");
initializeZKBasedSystemTrackers();
检查meta是否需要初始化,会单独启动一个新线程去执行:
InitMetaProceduretemp=newInitMetaProcedure();
procedureExecutor.submitProcedure(temp);
后边很多不是很重要,就不一一列举了,比如负载均衡器。
如何在 Cobalt master 16 上启动本地 url
【中文标题】如何在 Cobalt master 16 上启动本地 url【英文标题】:How to Launch local url on Cobalt master 16 【发布时间】:2018-06-14 13:46:18 【问题描述】:我想使用cobalt启动本地html页面,那么如何通过Cobalt 16 master启动本地页面。
./cobalt --url=xxxxxxx
.
【问题讨论】:
到目前为止您尝试过什么?在询问 *** 之前,您应该先尝试自己解决问题。给你一点提示,请查看en.wikipedia.org/wiki/File_URI_scheme 【参考方案1】:使用 --web_file_path 命令行参数设置本地内容的目录,结合 --url 指定起始页。
示例: ./cobalt --web_file_path=/home/content_folder --url=file:///index.html
(注意三个 /// 是必需的)
这将加载页面:/home/content_folder/index.html 适用于任何非黄金版本。
【讨论】:
非常感谢您的帮助。那么如何在代码中设置 web_file_path 并进行黄金构建。谢谢【参考方案2】:运行本地 Web 服务器并使用 --url=http://localhost:xxxx
将 Cobalt 指向它。这将适用于所有 Cobalt 配置,并允许您在需要时指定 HTTP 标头(例如,Content-Security-Policy
)。同源策略也将按预期工作,因此您将能够访问图像和样式表等资源。
【讨论】:
我们没有本地web服务器,我们只想启动本地页面。在master16之前,我们使用js扩展并指定参数kSbSystemPathSourceDirectory(/content/dir_source_root----System_get_path) ,所以我们可以把我们的页面放在这个目录中,并使用 --url=file:///index.html 来启动本地 url。但是master16这个参数不能用,怎么指定保存页面和图片\样式表的目录,让页面可以在黄金版上运行。非常感谢。以上是关于在启动master的主要内容,如果未能解决你的问题,请参考以下文章