由于集群故障,连接不上hdfs,datanode节点部分挂,重新启动单个节点和namenode也不好使,给出方法格式化namenode,之后启动namenode和datanode,但是由于hdfs中有数据,格式化前没有备份数据,导致了数据块全部丢失,至此,整个集群中表数据都没有了,悲剧的开始。
为了处理这个问题,评估了事件,由于元数据存储在mysql中,所以表还在,只是hdfs表数据存储在hdfs中的路径和文件没有了。
1.业务数据补充
hive库的访问通过etl工具,所以业务数据的补充,直接通过etl工具。
由于hdfs文件目录被删除,所以第一步,建立目录:
hadoop fs -mkdir /user/hive/warehouse/hive_test_table
删分区,建立分区:
hive -e "alter table hive_test_table drop partition (op_month=201702,op_time= 20170215,op_hour=2017021514);"
hive -e "alter table hive_test_table add partition (op_month=201702,op_time= 20170215,op_hour=2017021514);"
把etl生成的文件put到hdfs文件目录:
hdfs dfs -put /test/hive_test_table.txt /user/hive/warehouse/hive_test_table/op_month=201702/op_time=20170215/op_hour=2017021514
把表数据添加到其他表:
INSERT INTO hive_test PARTITION (op_month=201702,op_time=20170215,op_hour=2017021514)
SELECT CUST_ID,USER_ID,ACCT_ID from hive_test_table where op_month='201702' AND op_time= '20170215' AND op_hour='2017021514';
2.维度表数据导入
查询维度表的表结构:
hive -e "desc formatted bts_type;"
显示:
所以在生成导入文件的时候需要按照;分割,生成文件bts_type.txt
对bts_type.txt转码:
iconv -f GBK -t UTF-8 bts_type.txt -o bts_type.txt
建立文件目录:
hadoop fs -mkdir /user/hive/warehouse/bts_type
put文件到hdfs指定路径下:
hdfs dfs -put /test/bts_type.txt /user/hive/warehouse/bts_type/bts_type.txt
由于集群中hdfs数据块都被删除了,维度表数据手动导入,业务数据表数据可以通过etl工具导入,为了避免类似问题发生,对集群数据的备份,和集群监控还需要完善现有的维护方案。
1. 采用svn管理备份元数据与维度表数据文件
2. 集群中获取zookeeper中namenode的状态,并监控namenode,datanode,zookeeper存活节点,出问题立刻发短信告警
3. 在生产选取一台主机备份维表数据和元数据, 并写批量脚步,如果以后发生类似事情,直接跑脚步,来修复