- 浏览: 348367 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
lvyuan1234:
你好,你那个sample.txt文件可以分享给我吗
hive insert overwrite into -
107x:
不错,谢谢!
hive 表的一些默认值 -
on_way_:
赞
Hadoop相关书籍 -
bupt04406:
dengkanghua 写道出来这个问题该怎么解决?hbase ...
Unexpected state导致HMaster abort -
dengkanghua:
出来这个问题该怎么解决?hbase master启动不起来。
Unexpected state导致HMaster abort
基于HBase trunk代码http://svn.apache.org/repos/asf/hbase/trunk,Revision: 1431176
Create table 的过程,Create table时 只有一个region 的assign 过程。 图示
Client HMaster HRegionServer
Client 发送请求到HMaster (HBaseAdmin)
HMaster收到请求
创建CreateTableHandler,CreateTableHandler的构造函数
里面会
(1)调用
MetaReader.tableExists(CatalogTracker catalogTracker,String tableName)来
扫描META表,检查table是否已存在
(2)在ZK中设置table的状态是ZooKeeperProtos.Table.State.ENABLING
/hbase/table/tablename
CreateTableHandler构造好了之后放入线程池(ExecutorService),
由线程池异步去执行
构造好CreateTableResponse,返回client
Client收到CreateTableResponse,
然后就wait,知道table创建好
HMaster开始执行CreateTableHandler,调用CreateTableHandler.process
(1)在HDFS上面创建Table的目录,并写上HTableDescriptor(文件.tableinfo)
(2) 创建HRegion,HRegion.createHRegion
(3) Close HRegion,region.close();
(4) RegionInfo信息往META表里面put
MetaEditor.addRegionsToMeta(this.catalogTracker, regionInfos);
//这里只有 info:regioninfo 这个cq,
没有info:server、info:serverstartcode等其他cq。
这里region的location是null,在AssignmentManager的rebuildUserRegions
里面有对这块(region的location为null时)单独进行处理。
(5) 在RegionStates里面为每个Region创建一个RegionState,状态为State.OFFLINE
(6) assign region,调用 AssignmentManager.assign(List<HRegionInfo> regions)
assign region出去
(1) 调用LoadBalancer进行Round Robin分配,给每个region分配一个Server,生成分配计划
(2)new 一个 GeneralBulkAssigner 按照生成的分配计划把region assign 出去
BulkAssigner ba = new GeneralBulkAssigner(this.server, bulkPlan, this);
ba.bulkAssign();
BulkAssigner.bulkAssign()
BulkAssigner.bulkAssign(boolean sync)
GeneralBulkAssigner.populatePool 具体调用SingleServerBulkAssigner来完成
GeneralBulkAssigner.waitUntilDone
这个的分配计划是Map<ServerName, List<HRegionInfo>>,Server对应一些HRegion,
GeneralBulkAssigner执行时每一个Server对应一个SingleServerBulkAssigner,由线程池去执行
SingleServerBulkAssigner,而自己只需要waitUntilDone
这里GeneralBulkAssigner的waitUntilDone条件是:
所有需要分配的Region在RegionStates中的状态满足
【1】在regionsInTransition没有这个region
【2】在regionAssignments中有这个region
SingleServerBulkAssigner的执行
SingleServerBulkAssigner.run
assignmentManager.assign(regionserver, regions)
AssignmentManager.assign(final ServerName destination,
final List<HRegionInfo> regions)的执行
(1)asyncSetOfflineInZooKeeper
(1.1)regionStates中更新Region的状态,从OFFLINE->OFFLINE
(1.2)ZK中/hbase/unassigned下面异步创建Region对应的节点,
数据RegionTransition是EventType.M_ZK_REGION_OFFLINE
其中有注册回调函数OfflineCallback
(1.3)每个Region创建一个RegionPlan
HMaster收到NodeChildrenChanged事件,path是/hbase/unassigned
触发回调函数OfflineCallback以及OfflineCallback.ExistCallback
这样HMaster就能往下执行了
// Wait until all unassigned nodes have been put up and watchers set.
把RegionPlan put到regionPlans中
更新Region的状态,从OFFLINE->PENDING_OPEN,ServerName不为null,同时会放入regionsInTransition
HMaster向HRegionServer发送rpc请求(open regions)
HRegionServer收到open region请求
创建OpenRegionHandler,丢到线程池(ExecutorService),
由线程池运行
返回HMaster Response,RegionOpeningState.OPENED
HMaster收到HRegionServer端的Response
AssignmentManager.assign(final ServerName destination,
final List<HRegionInfo> regions) 结束
SingleServerBulkAssigner.run结束
但是GeneralBulkAssigner还没有结束,还在运行waitUntilDone
HRegionServer运行OpenRegionHandler
(1)第一步修改zk上面region节点的信息,
M_ZK_REGION_OFFLINE->RS_ZK_REGION_OPENING
transitionZookeeperOfflineToOpening(encodedName,
versionOfOfflineNode)
因为上面HRegionServer修改了ZK节点的信息,所以HMaster会收到 HRegionServer open region,HRegion region = openRegion();
ZK的事件NodeDataChanged,path是 HRegion r = HRegion.newHRegion
/hbase/unassigned/98ab07ecd6bbfa1e3a170092f3fc4de6 r.openHRegion(reporter);
HMaster处理zk事件 HRegion.initialize
更新Region的状态,PENDING_OPEN->OPENING,ServerName不为null HRegion.initializeRegionInternals
创建 .regioninfo 文件
初始化HStore
HRegion open完成
OpenRegionHandler 接着处理HRegion open完后的逻辑
tickleOpening("post_region_open")
retransitionNodeOpening
RS_ZK_REGION_OPENING->RS_ZK_REGION_OPENING
HMaster收到ZK事件,NodeDataChanged,path是 执行OpenRegionHandler里面的updateMeta
/hbase/unassigned/98ab07ecd6bbfa1e3a170092f3fc4de6 启动线程PostOpenDeployTasksThread,并start运行
HMaster处理zk事件 PostOpenDeployTasksThread运行HRegionServer.postOpenDeployTasks
更新Region的状态,OPENING->OPENING,ServerName不为null HRegionServer: 更新META表,修改Region的Location信息
(Location原先是没有的)。
OpenRegionHandler 接着处理,修改zk中region的状态为
RS_ZK_REGION_OPENED
HMaster收到ZK事件,NodeDataChanged,path是 添加Region到OnlineRegions列表
/hbase/unassigned/98ab07ecd6bbfa1e3a170092f3fc4de6 OpenRegionHandler处理完成
事件是RS_ZK_REGION_OPENED
更新Region的状态,OPENING->OPEN,ServerName不为null
同时更新regionsInTransition中Region的状态为OPEN
HMaster创建OpenedRegionHandler,并且丢到线程池去运行
HMaster运行OpenedRegionHandler
OpenedRegionHandler主要是删除Region的ZK节点
/hbase/unassigned/98ab07ecd6bbfa1e3a170092f3fc4de6
HMaster收到ZK事件,NodeDeleted,path是
/hbase/unassigned/98ab07ecd6bbfa1e3a170092f3fc4de6
HMaster收到ZK事件,NodeChildrenChanged,path是
/hbase/unassigned
HMaster处理nodeDeleted事件
运行AssignmentManager.nodeDeleted
从regionsInTransition中获得Region的state状态
AssignmentManager.regionOnline
(1) RegionStates.regionOnline,
更新Region的状态,从OPEN->OPEN
从regionsInTransition中删除region的state信息
往regionAssignments中put数据
(2)AssignmentManager.clearRegionPlan
从regionPlans中删除region的RegionPlan
(3)AssignmentManager.addToServersInUpdatingTimer
添加ServerName到serversInUpdatingTimer中
GeneralBulkAssigner的waitUntilDone可以结束了,返回到
AssignmentManager.assign(List<HRegionInfo> regions)
AssignmentManager.assign结束,返回到
CreateTableHandler.handleCreateTable
CreateTableHandler.handleCreateTable
在ZK中设置table的状态是ZooKeeperProtos.Table.State.ENABLED
/hbase/table/tablename
CreateTableHandler结束
(1)Client扫描META表发现有这个Table的regions,
并且这些regions都已经在某个regionserver
上面了,那么设置doneWithMetaScan=true
MetaScanner.metaScan(conf, visitor, desc.getName());
(2)发现这个Table已经是enabled状态了,那么就return
isTableEnabled(desc.getName())
发表评论
-
hbase flush前提: 等待相关事务都完成
2016-07-04 16:40 1071DefaultMemStore: @Override ... -
turn log on/off
2015-10-21 10:06 0wget -q "http://hostna ... -
hbase的一些语义
2014-06-04 16:39 1123hbase里面对一行操作前会加锁。 http://had ... -
Unexpected state导致HMaster abort
2014-01-09 11:44 2722线上和开发集群都遇到过master abort的情况,而且 ... -
hbase build Too many unapproved licenses
2013-12-30 16:02 2365[ERROR] Failed to execute ... -
hbase hbck 导致的multi assign
2013-12-25 18:03 1677http://hbase.apache.org/book. ... -
HBase Log Split 配置相关
2013-12-15 16:54 1576(1)HMaster SplitLogManager ... -
hbase jmx
2013-12-11 20:42 2947conf/hbase-env.sh 里面配了 JMX后就可 ... -
hbase bulk多family,锁住region
2013-10-29 15:14 1235HBase在bulk 多family的数据时,会获得整个r ... -
Phoneix
2013-10-22 11:42 1511https://github.com/forcedotco ... -
hbase RowCounter 使用
2013-10-15 16:48 5929hbase org.apache.hadoop.hb ... -
hbase add table
2013-09-26 21:49 1346把table数据从一个集群移动到另外一个集群 (1) ... -
hbase shell
2013-09-26 11:18 1672hbase shell 命令 mvn cle ... -
hbase snapshot
2013-06-06 16:40 2183Snapshot: (1) take a sn ... -
hbase split 导致compact abort的日志
2013-06-06 16:37 34862013-06-06 14:58:43,131 INF ... -
HBase maxIdleTime
2013-03-29 18:01 1680HBaseClient端会建立跟HRegionServer ... -
facebook hbase版本目前做的一些重要特性,提升性能
2012-11-22 19:36 2149(1)每个regionserver多个HLog,提升写。 社区 ... -
Server端处理时间很长,Client发生SocketTimeoutException
2012-11-22 11:37 33465Client端只有一个put请求,往server端写数据,se ... -
RPC HBaseServer
2012-11-12 20:28 1098HBaseServer: 一个请求发送的数据是:数据的长 ... -
HDFS HBase NIO相关知识
2012-09-26 18:29 2661HDFS的NIO有一些相关的知识偶尔需要注意下: (1) 使 ...
相关推荐
CREATE TABLE hbase_hfile_table(key int, name string, age String) STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.hbase.HiveHFileOutputFormat' ...
hBaseAdmin.createTable(new HTableDescriptor(secondaryIndexTableName)); } secondaryIndexHTable = new HTable(hTable.getConfiguration(), secondaryIndexTableName); } catch (Exception ...
##### 3.4 样例: HBase CreateTable **3.4.1 样例代码** ```java // 示例代码片段 public class CreateTable { public static void main(String[] args) throws IOException { Configuration conf = ...
CREATE TABLE hive_hbase_table(key int, value string, name string) STORED BY 'org.apache.hadoop.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf1:val,cf2:val") ...
4. `--hbase-create-table`:如果HBase中的目标表和列族不存在,加上此参数, Sqoop会在运行时自动创建。若未指定,任务会因找不到表而失败,因此在导入前需要确保HBase表和列族已创建。 在执行导入步骤前,先创建...
CREATE EXTERNAL TABLE hbase_table (key STRING, column1 STRING, column2 STRING) STORED BY 'org.apache.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,column1,...
首先需要创建一个HBaseConfiguration对象,然后使用HBaseAdmin类的createTable方法创建表。 ```java public static void create(String tablename, String columnFamily) throws Exception { HBaseAdmin admin = ...
public class CreateTable { public static void main(String[] args) throws Exception { Configuration config = HBaseConfiguration.create(); config.set("hbase.zookeeper.quorum", "localhost"); // 设置...
import org.apache.hadoop.hbase.client.Table import org.apache.hadoop.hbase.client.Put import org.apache.hadoop.hbase.client.Get import org.apache.hadoop.hbase.util.Bytes ``` 2. 配置HBase连接: ...
第二步,结合索引定义和 DataTable Region 的 StartKey 信息,调用 HBaseAdmin 的 createTable(final HTableDescriptor desc, byte[][] splitKeys) 方法创建索引表。 知识点三:IndexTable RowKey 的设计 Index...
"zookeeper_server_ip"应替换为实际的Zookeeper服务器IP地址,"your_table_name"应替换为你要操作的HBase表名,"row_key"是你想要读取的行键。 接下来,我们要将读取到的HBase数据写入HDFS。Hadoop提供了`...
table = connection.create_table('my_table', {'cf': dict()}) ``` 这里 `'cf'` 是列族(Column Family)的名称,你可以根据需要添加多个列族。 4. **写入数据**:向表中插入数据: ```python row_key = 'row...
admin.createTable(tableDesc); } ``` 读取本地文件是通过Java的`FileInputStream`和`BufferedReader`实现的。这里假设文件是文本文件,每行代表一个记录: ```java File file = new File("path_to_your_file.txt...
创建 Hbase 表需要使用 HBaseAdmin 类,通过 getConfiguration() 方法获取 Hbase 配置信息,然后使用 createTable() 方法创建表结构。代码如下: ```java public static void create(String tableName, String ...
例如,`admin.createTable(DESC)`用于创建一个新表,其中`DESC`是`TableDescriptor`对象。 3. **操作数据**:`HTable`是与HBase表进行交互的主要接口。我们可以通过`getTable()`方法获取表实例,然后使用`put()`, `...
hbase(main):001:0> create 'my_table', 'cf1' hbase(main):002:0> put 'my_table', 'row1', 'cf1:col1', 'value1' hbase(main):003:0> get 'my_table', 'row1' ``` 9. **监控与维护**:可以使用HBase提供的...
conn.create_table(table_name, families) # 创建表,families是列族名 def put_data(conn, table_name, row_key, column_family, column, value): table = conn.table(table_name) table.put(row_key, {(column...