好的网站建设哪家好,吉首企业自助建站,保定网站网站建设,软文营销广告HDFS 集群启动脚本 start-dfs.sh 分析 
启动 HDFS 集群总共会涉及到的角色会有 namenode, datanode, zkfc, journalnode, secondaryName 共五种角色。  
JournalNode 核心工作和启动流程源码剖析 
// 启动 JournalNode 的核心业务方法
public void start() throws IOException …HDFS 集群启动脚本 start-dfs.sh 分析 
启动 HDFS 集群总共会涉及到的角色会有 namenode, datanode, zkfc, journalnode, secondaryName 共五种角色。  
JournalNode 核心工作和启动流程源码剖析 
// 启动 JournalNode 的核心业务方法
public void start() throws IOException {// 第一件事创建 JournalNode 的本地工作目录// /home/bigdata/data/journaldata/hadoop330hafor (File journalDir : localDir) {validateAndCreateJournalDir(journalDir);}// 第二件事 创建和启动 JournalNode 的 Http 服务绑定端口 8480httpServer  new JournalNodeHttpServer(conf, this, getHttpServerBindAddress(conf));httpServer.start();// 第三件事 创建和启动 JournalNode 的 RPC 服务 JournalNodeRpcServer绑定端口 8485rpcServer  new JournalNodeRpcServer(conf, this);rpcServer.start();
}最重要的需要关注 JournalNodeRpcServer将来 NameNode 在进行一个事务操作需要记录日志的时候会把日志记录到 NameNode 的本地并发送日志到所 有的 JournalNode当 NameNode 本地记录成功并且 JournalNode 中的成功过半才认为这条事务的日志记录是成功的。 
// 1、JournalNodeRpcServer 实现了两个协议QJournalProtocol 和 InterQJournalProtocol
// 2、QJournalProtocol 是 NameNode 和 JournalNode 之间的通信协议
// 3、InterQJournalProtocol 是 JournalNode 之间进行沟通的协议
public class JournalNodeRpcServer implements QJournalProtocol, InterQJournalProtocol {// NameNode 发送命令让 JournalNode 开启一个新的日志段 LogSegmentpublic void startLogSegment(RequestInfo reqInfo, long txid, int layoutVersion){jn.getOrCreateJournal(....).startLogSegment(reqInfo, txid, layoutVersion);}// NameNode 发送 LogEdit 给 JournalNodepublic void journal(RequestInfo reqInfo, long segmentTxId, long firstTxnId, int numTxns, byte[] records){jn.getOrCreateJournal(....).journal(reqInfo, segmentTxId, firstTxnId, numTxns, records);}
}ZKFC 核心工作原理和启动源码剖析 关于 ZKFC 的工作流程 
建立和 ZK 的链接创建锁节点的父节点。启动一个监控 NameNode 健康状态的线程。启动 RPCServer将来可能会出现集群中有两个 standby 但是没有 active集群重启手动切换其中一个 namenode 为 active。 
hdfs haadmin --transitionToActive nn2ZKFC 尝试创建锁节点参与 active 选举方式就是通过 基于 zk 的分布式独占锁来执行选举。当选举成功自己先更新状态然后通过 RPC 告知 namenode 切换状态。选举不成功则注册监听监听 active namenode 的状态。 
HDFS NameNode 启动全流程源码剖析 
创建和启动 HttpServer 
加载磁盘元数据构建 FSNamesystem 
FSNamesystem 是 NameNode 的内部最重要的三大组件之一 (第一个是 HttpServer2第二个是 RpcServer第三个就是 FSNameSystem 了。FSNamesystem 负责 NameNode 里面的一切元数据相关的相关工作。在 NameNode 启动的过程中需要恢复磁盘元数据到内存中 1、构建 FSImage。 2、构建 FSNamesystemFSImage 作为 FSNamesystem 内部非常重要的组件来完成磁盘元数据维护, 在内部会构建 FSDirectory。 3、通过 FSNamesystem 去恢复元数据。 
创建 NameNode RPC 服务 
NameNodeRpcServer 的内部启动的 RPCServer 事实上有三个 
serviceRpcServer接受来自于 DataNode 的 RPC 请求进行处理。lifelineRpcServer默认没有配置不启动。clientRpcServer接受来自于 Client 的 RPC 请求进行处理。 
启动 RPCServer 和工作线程 
HDFS 的元数据管理 
HDFS 元数据管理全貌 关于上图中的几种角色关于 元数据处理 相关的工作 
客户端发送请求会涉及更新系统状态的请求事务请求。都会记录日志所以 NameNode 接收到该请求就会执行一个事务更新内存  记录磁盘日志NameNode执行事务事务成功必须是以下三件事都成功 更新元数据到内存数据结构 FSDirectory 中  写日志到磁盘中写日志到 Active NameNode 本地磁盘文件中 edits_inprogress_txid 文件中写日志到 Journal 系统: 发送 RPC 请求将日志发送给所有的 JournalNode 等待过半的 JournalNode 写成功 JournalNode在启动的时候其实它内部启动了一个 JouranlNodeRpcServer接收来自于 active NameNode 的 journal RPC 请求记录日志到本地Standby NameNode 做两件事 EditLogTailer每隔一段时间从 journal 系统中拉取日志数据然后合并到 standby namenode 的内存中其实 standby namenode 的内存中也有一份几乎最新状态的元数据存在。StandbyCheckpointer 线程每隔一段时间做一次判断检查是否要执行 checkpoint。 checkpoint 条件常规的条件一般有三种 日志条数  100WHDFS 条件之一时间1个小时HDFS 条件之一日志文件大小 1G 执行过程 发送 RPC 请求个 Active NameNode通知要进行一次 元数据checkpoint做一件事rollLogedits_inprogress_txid 变成 edits_starttxid_endtxidStandbyNameNode 去到 Active NameNode 中下载 fsiamge 文件和 edits 文件在 StandbyNameNode 的内存中进行 fsimage 和 edits 文件的合并生成一个最新的 fsimageStandbyNameNode 上传该 fsimage 文件给 active NameNode 补充说明下载和上传 fsiamge 或者 edits 都是通过 Http 方式   
HDFS 完成创建文件夹全流程源码分析 
重点DistributedFileSystem 
HDFS 更新内存元数据完整剖析 
重点FSDirectory 
FSEditlog 双写缓冲机制 
重点FSEditLog —— 双写缓冲  分段加锁 
FSEditlogAsync 异步写机制 
重点FSEditLogAsync —— react 模式 
NameNode 启动元数据恢复源码深度剖析 
核心加载磁盘元数据恢复到内存中。 
加载 fsimage 文件到内存加载 edits 文件到内存 
HDFS 元数据 Checkpoint 工作流程和源码分析 先下载 editLog然后校验 txId 是否连续连续则使用本地的 fsImage否则去 active NameNode 下载最新的 fsImage。 
HDFS DataNode 启动和上传数据全流程 
HDFS DataNode 启动全流程分析 
主类 DataNode通过 instantiateDataNode() 方法创建 DataNode通过 runDatanodeDaemon() 方法启动 DataNode 
创建 DataNode 实例 
在启动 DataNode 的过程中大致的工作 
构建 DataNode 实例对象启动 DataNode 创建 DataNode 内部的 DataXceiverServer创建 DataNode 内部的 HttpServer创建 DataNode 内部的 RPCServer创建 ErasureCodingWorker 和 BlockRecoveryWorker创建 BlockPoolManager 来完成 DataNode 向 NameNode 注册、心跳和数据块汇报   
DataNode 实例启动 
其实启动的时候就是启动 
BlockPoolManager 启动向 NameNode 注册并且维持心跳DataXceiveServer 服务启动用来接收 文件上传过程中 Client 发送过来的数据RPCServer 启动 
BPServiceActor 的 run() 方法中有两个重要方法 
第一个方法 connectToNNAndHandshake()DataNode 完成和 NameNode 的链接然后向 NameNode 执行注册第二个方法 offerService()启动 BPOfferServer 和 BPServiceActor 来让 DataNode 可以不停的向 NameNode 进行心跳和数据块汇报 
DataXceiver 初始化和启动 
数据传输过程中每个 datanode 中都有一个 DataXceiverServer 的这样一个组件启动起来等待客户端的链接请求如果接收到连接器请求完成链接建立然后构建一个新的线程专门对这个客户端提供服务。—— 实为 BIO 服务等待客户端连接。 
DataNode 向 NameNode 注册 
DataNode 向 NameNode 执行注册的实现在 BPServiceActor.connectToNNAndHandshake() 方法中完成。 心跳机制 HeartBeatManager 内部启动了一个 HeartBeatManager.Monitor 的线程来每隔 5s 钟执行一次判断如果发现某个 datanode 的上一次心跳时间距离现在超过 30s 了则启动检查机制每隔5min 检查一次。最多检查两次。当 两次检查时间  10次心跳时间都没有发现 datanode 复活就认为这个 datanode 死掉了 最终的答案 630s 
DataNode 向 NameNode 心跳 
DataNode 执行向 NameNode 的心跳和块汇报一个 BPServiceActor 负责和一个 NameNode 进行通信。 DataNode 会每隔 3s 钟向 NameNode 发送心跳信息得到的反馈是 NameNode 下发给 DataNode 需要执行的命令。 
DataNode 向 NameNode 数据块汇报 
全量汇报同样会返回 NameNode 下发给 DataNode 需要执行的命令。 全量汇报默认每 6 小时执行一次。 
HDFS 上传数据全流程源码分析 
概述 整个文件上传的过程的精髓就在三句代码 
初始化得到本地输入流读取本地文件数据 
InputStream in  srcFS.open(src);初始化得到目标文件系统输出流用于完成数据输出 
OutputStream out  dstFS.create(dst, overwrite);1发送 RPC 请求到 NameNode 创建 INodeFile 文件节点。 2创建输出流其实内部最重要的事情就是初始化 DataStreamer。 3启动 输出流内部的 DataStreamer 线程。 4如果 DataStreamer 消费到 dataQueue 中的一个 packet其实会做一个判断检查是否 SETUP_STAGE是则要创建 pipline。 精髓DFSOutputStream 的内部藏着 DataStreamer 线程它负责消费 dataQueue 队列当执行数据传输的时候通过本地输入流读取本地文件数据构造 Packet 数据包加入到 dataQueue 队列的时候DataStreamer 就负责发送 Packet 到多个 DataNode 建立的 pipline 数据管道之上完成数据传输。 3. 完成数据输出 
IOUtils.copyBytes(in, out, conf, true);1执行本地输入流数据读取构造 Packet 加入到 dataQueue 中其中需要注意的是Packet 是由很多 Chunk 组成的。 2发送 RPC 请求给 NameNode 申请一个 BlockNameNode 会调用 BlockPlacementPolicy 副本存放策略选取 DataNode 列表返回给客户端。 3客户端根据上一步拿到的该 Block 的 DataNode 列表建立数据传输管道。 
Client  DataNode01  DataNode02  DataNode034客户端启动 ResponseProcessor 线程用来处理 DataNode 反馈回来的 Packet 的 ACK 5从 dataQueue 弹出 Packet 加入到 ackQueue执行 Packet 发送 6如果一个 Block 的最后一个数据块发送完了则等待该 Block 的 ACK 7结束一个数据块 8如果结束了上一个数据块并且当前文件没有上传完毕意味着继续接收到了新的 Packet再次申请 BLock 建立数据管道完成数据传输。  
HDFS 创建文件元数据 
NameNode 中负责完成内存元数据管理的就是 FSNameSystem 中的 FSDirectory 具体实现就是构建一个 INodeFile 包含要上传的文件的各种信息然后添加到目录树中的指定文件夹下并且加入 INodeMap 进行管理维护方便以后根据 path 来索引。同时也记录了操作日志到磁盘元数据中。 最后构建了一个 HdfsFileStatus 返回给客户端包含了该文件的各种必要信息比如 文件路径文件大小副本个数数据块大小权限等。 
启动 DataStramer 线程 
DFSOutputStream 类继承结构。  精髓DFSClient 在创建文件的输入输出流 DFSOutputStream 的时候其实是在内部构造了一个 DataStreamer 线程内部维护了一个 dataQueue 数据 Packet 队列。当真正执行数据传输的时候其实就是本地输入流读取本地文件数据构造数据包 Packet 加进 dataQueue 队列这样的话DataStreamer 就可以从dataQueue 队列中获取 Packet 执行数据发送了。注意区分 
如果 BlockConstructionStage 为 PIPELINE_SETUP_CREATE 的时候DataStreamer 刚创建和上一个 Block 刚完成传输则需要向 NameNode 申请 Block并且构建 Client 到 DataNode1 到 DataNode2 到 DataNode3 的数据传输管道。并且 启动 ResponseProcessor 线程用来处理 Packet ACK 消息。如果数据管道存在则获取到的 Packet 执行正常发送即可。pepline 建立应用到了状态模式 至此本地输入流和 HDFS 输出流创建完成。可以认为把文件上传相关准备工作都做到位了接下来开始进行真正数据传输。 
创建 Packet 
HDFS 的客户端在进行文件上传的时候会创建本地文件输入流创建 HDFS 文件输出流。然后对接起来完成数据传输具体实现通过 FIleUtils 的 copy 方法来实现的。 
最终创建的输出流是 HdfsDataOutputStream是 FSDataOutputStream 的子类继承关系如图所示在创建 FSDataOutputStream 的时候会调用父类构造传入 PositionCache 输出流给父类保存在父类 FilterOutputStream 的成员变量 OutputStream 的 out 上。当开始进行数据传输调用 HdfsDataOutputStream 的 write() 方法HdfsDataOutputStream 类中并没有定义 write 方法所以其实最终调用的就是 DataOutputStream 的 write(byte b[], int off, int len) 方法来实现的而该方法的内部实现都是调用成员变量 OutputStream out 来实现的。由第二步知道out 就是 PositionCache。所以最后的结论 当调用 HdfsDataOutputStream.write(byte b[], int off, int len) 就是调用 PositionCache.write(byte b[], int off, int len) 方法。 另外补充一点PositionCache 内部包装了 DFSOutputStream所以中还是通过 DFSOutputStream 来完成数据输出。而 DFSOutputStream 是 FSOutputSummer 的子类。终于找到了 write 方法的具体实现。 关于如何写一个 Packet 是通过 DFSOutputStream 的 writeChunk() 方法不断写 Chunk 构建出来的最后添加到 DataStreamer 中的 dataQueue 队列中由 DataStreamer 线程完成 Packet 数据包发送。 
DFSClient 申请 Block 
当 DFSOutputStream 构建一个 Packet 提交到 DataStreamer 内的 dataQueue 队列时会唤醒阻塞在 dataQueue 的 DataStreamer 线程。DataStreamer 线程从 dataQueue 获取出来一个数据 Packet 执行发送这时候需要判断这个 Packet 执行发送的时候BlockConstructionStage 的值是什么。如果是 PIPELINE_SETUP_CREATE意味着是这个 Packet 是新的 Block 的第一个 Packet则需要申请 Block 获取 DataNode 存储列表然后建立数据管道进行数据传输。 总体来说就是 DFSClient 发送 RPC 请求给 NameNode 申请一个该 File 的一个 Block在 NameNode 内部主要做两件事 
首先根据默认副本存放策略实现 BlockPlacementPolicyDefault 选举副本个数 DataNode。构建一个 BlockInfo 对象加入到 FIle 的 blocks 数组中同时编号并记录 offset然后将必要的信息封装成 LocatedBlock 返回给 DFSClient必要的信息包含上一步获取的 DataNode。 
建立数据管道 
DFSClient 向 NameNode 申请到一个 BlockNameNode 给 DFSClient 返回了该 Block 的 DataNode 存储列表然后 DFSClient 就着手建立 Client 和 多个 DataNode 之间的数据传输管道了。 DFSClient 中构建了 Socket 客户端并且发起链接给 DataNode 启动的 DataXceiver 服务端建立连接然后构建输入输出流用于传输数据。最后 DFSClient 端构建了一个 Sender 线程用来完成向 DataNode 发送数据。最后构建 Sender 线程通过 writeBlock() 发送请求相关数据。 注意Sender 实现了 DataTransferProtocol但是 DataTransferProtocol 并不是标准的 Hadoop RPC 通信协议而是单独实现的一套用来传输数据的协议。 Sender 作为客户端发送 writeBlock RPC 请求DataXceiver 作为服务端处理 RPC 请求。 
当 DataNode 启动的时候创建和启动了一个用于做数据传输的一个 服务端 DataXceiverServer当 Client 申请到一个 Block 拿到了 3 个datanode 列表需要去建立数据传输管道client 生成一个 socket 客户端发起链接请求给 第一个datanode 建立连接之后 会接收到上游发送下来的操作代号 OP_WRITE。处理逻辑其实就是构建一个 BlockReceiver用来专门接收数据 生成一个 block 文件构建这个 block 的文件输出流 如果 targets 长度不为 0则表示下游依然有 DataNode则起一个 Sender 继续向下游发送数据。生成一个socket 发起链接请求给 下一个 datanode 那么 datnaode 中的 DataXceiverServer 也是构建一个 DataXceiver 来完成相关工作否则数据管道即构建成功。 
DataNode 接收数据和发送 ACK 
DataNode 中的 BlockReceiver 的职责就是负责接收数据块并且发送数据 Packet 给下游 DataNode 然后给上游 DataNode 返回 ACK。大概的工作机制 
读取上游发送过来的数据。如果存在下游 DataNode 的话则把读取到的 Packet 发送给下游 DataNode。执行数据 write to disk 的操作。给上游返回 SUCCESS 标识。 
PacketResponder 线程 
PacketResponder 就是 DataNode 负责处理 ACK 的从下游 DataNode 接收 ACK 发给上游 DataNode。 
ResponseProcessor线程 
从下游 DataNode 上读取 ACK 消息进行处理如果 Packet 成功则从 ackQueue 中进行移除。 
HDFS 契约机制 
当一个客户端想要去操作某个 HDFS 文件的时候首先要获取该文件的 契约然后能写入数据。而且同一时间只能有一个客户端获取契约。如果其他客户端没有获取到契约就只能等着别人释放。 具体的工作机制 客户端在写文件过程中会开启一个线程不停的发送请求给 NameNode 进行文件续约。 NameNode 端也有一个专门的检测线程负责监控各个契约的续约时间。如果某个契约长时间没有续约则删除从而让别的客户端有机会能写该 文件。 关于契约机制的源码解析 
第一步NameNode 在启动的时候会创建和启动 LeaseManager 进行工作。第二步当客户端发送 RPC 请求给 NameNode 创建一个文件的时候NameNode 会给该客户端生成一个 Lease 加入到 NameNode 中启动的 LeaseManager 中进行管理。第三步当 DFSClient 客户端获取到了 HDFS 某个文件的输出流之后就开启一个线程用来不停的去申请续约。 综上所述这个功能就是为了让操作该文件的 客户端保持独占类似于一把锁的作用。 
HDFS 文件上传的容错机制 
关于异常处理有两种方式 
如果宕机的 datanode 大于一半则丢弃刚才的 block重新申请 block 和 datanode 列表完全推倒重来。如果宕机的 datanode 不足一半则直接忽略用剩下的 datanode 列表来构建 pipline。 
HDFS 文件下载全流程分析 
HDFS 文件下载入口代码 
其实 HDFS 文件上传和下载的入口是一样的关键就看输入流输出流的不同了。 最终还是通过 FileUtil 来完成 输入流 到 输出流 上的数据传输的最后依然进入到 FileUtils 的 copy() 方法。 依然是三个重点 
创建 HDFS 文件输入流创建本地文件系统输出流执行数据传输 
数据读取客户端操作 
当真正要读取数据的时候是通过 in.read(buf); 驱动的这个 in 的 read() 功能最终就是 DFSInputStream 完成的。 
数据读取服务端操作 
当服务端收到 客户端的读取数据的请求最终还是由 DataXceiver 来完成的。 最大的特色就是会通过操作系统预读来加速数据读取内部涉及到零拷贝支持从而提高吞吐。 
源码阅读总结 
设计模式 
命令模式 
DataNode 心跳、块汇报给 NameNodeNameNode 会将待执行命令发送给 DataNode。RPC 通信中封装的 Call 对象也可以看做是命令模式。 
装饰者模式 
HDFSDataInputStream、FSDataInputStream (DFSInputStream) 对输入、输出的调用。 
组合模式 
HDFS 的文件系统功能实现。NameNode 的功能实现。ResourceManager 的功能实现。 
迭代器模式 
BatchedRemoteIterator 
状态模式 
pepline 建立。 文章转载自: http://www.morning.mwmtk.cn.gov.cn.mwmtk.cn http://www.morning.wpqwk.cn.gov.cn.wpqwk.cn http://www.morning.dyxlj.cn.gov.cn.dyxlj.cn http://www.morning.jbmbj.cn.gov.cn.jbmbj.cn http://www.morning.jwtjf.cn.gov.cn.jwtjf.cn http://www.morning.nmlpp.cn.gov.cn.nmlpp.cn http://www.morning.gslz.com.cn.gov.cn.gslz.com.cn http://www.morning.hcqd.cn.gov.cn.hcqd.cn http://www.morning.pyncx.cn.gov.cn.pyncx.cn http://www.morning.psxxp.cn.gov.cn.psxxp.cn http://www.morning.tyhfz.cn.gov.cn.tyhfz.cn http://www.morning.tcfhs.cn.gov.cn.tcfhs.cn http://www.morning.nqlcj.cn.gov.cn.nqlcj.cn http://www.morning.nsfxt.cn.gov.cn.nsfxt.cn http://www.morning.bby45.cn.gov.cn.bby45.cn http://www.morning.hbxnb.cn.gov.cn.hbxnb.cn http://www.morning.bpttm.cn.gov.cn.bpttm.cn http://www.morning.tntgc.cn.gov.cn.tntgc.cn http://www.morning.mkccd.cn.gov.cn.mkccd.cn http://www.morning.wclxm.cn.gov.cn.wclxm.cn http://www.morning.bxdlrcz.cn.gov.cn.bxdlrcz.cn http://www.morning.lywys.cn.gov.cn.lywys.cn http://www.morning.rntby.cn.gov.cn.rntby.cn http://www.morning.qsbcg.cn.gov.cn.qsbcg.cn http://www.morning.nlgnk.cn.gov.cn.nlgnk.cn http://www.morning.shnqh.cn.gov.cn.shnqh.cn http://www.morning.rgwrl.cn.gov.cn.rgwrl.cn http://www.morning.yzxhk.cn.gov.cn.yzxhk.cn http://www.morning.yqrfn.cn.gov.cn.yqrfn.cn http://www.morning.pcwzb.cn.gov.cn.pcwzb.cn http://www.morning.cfmrb.cn.gov.cn.cfmrb.cn http://www.morning.c7496.cn.gov.cn.c7496.cn http://www.morning.nqlcj.cn.gov.cn.nqlcj.cn http://www.morning.knnc.cn.gov.cn.knnc.cn http://www.morning.c7624.cn.gov.cn.c7624.cn http://www.morning.lmqfq.cn.gov.cn.lmqfq.cn http://www.morning.xtdms.com.gov.cn.xtdms.com http://www.morning.fbxdp.cn.gov.cn.fbxdp.cn http://www.morning.cwwts.cn.gov.cn.cwwts.cn http://www.morning.fbnsx.cn.gov.cn.fbnsx.cn http://www.morning.jrtjc.cn.gov.cn.jrtjc.cn http://www.morning.sbjbs.cn.gov.cn.sbjbs.cn http://www.morning.rzsxb.cn.gov.cn.rzsxb.cn http://www.morning.wjzzh.cn.gov.cn.wjzzh.cn http://www.morning.syqtt.cn.gov.cn.syqtt.cn http://www.morning.rdkt.cn.gov.cn.rdkt.cn http://www.morning.lmqfq.cn.gov.cn.lmqfq.cn http://www.morning.bqmdl.cn.gov.cn.bqmdl.cn http://www.morning.skbbt.cn.gov.cn.skbbt.cn http://www.morning.lqypx.cn.gov.cn.lqypx.cn http://www.morning.cjnfb.cn.gov.cn.cjnfb.cn http://www.morning.ypdhl.cn.gov.cn.ypdhl.cn http://www.morning.wyfpc.cn.gov.cn.wyfpc.cn http://www.morning.wdwfm.cn.gov.cn.wdwfm.cn http://www.morning.zwfgh.cn.gov.cn.zwfgh.cn http://www.morning.dtnjr.cn.gov.cn.dtnjr.cn http://www.morning.nqbcj.cn.gov.cn.nqbcj.cn http://www.morning.nlgyq.cn.gov.cn.nlgyq.cn http://www.morning.ptqpd.cn.gov.cn.ptqpd.cn http://www.morning.jljiangyan.com.gov.cn.jljiangyan.com http://www.morning.krhkn.cn.gov.cn.krhkn.cn http://www.morning.cfhwn.cn.gov.cn.cfhwn.cn http://www.morning.mxcgf.cn.gov.cn.mxcgf.cn http://www.morning.rsjf.cn.gov.cn.rsjf.cn http://www.morning.cknrs.cn.gov.cn.cknrs.cn http://www.morning.lgsfb.cn.gov.cn.lgsfb.cn http://www.morning.rtspr.cn.gov.cn.rtspr.cn http://www.morning.npmx.cn.gov.cn.npmx.cn http://www.morning.zrwlz.cn.gov.cn.zrwlz.cn http://www.morning.thbqp.cn.gov.cn.thbqp.cn http://www.morning.rbzht.cn.gov.cn.rbzht.cn http://www.morning.xqknl.cn.gov.cn.xqknl.cn http://www.morning.fgsct.cn.gov.cn.fgsct.cn http://www.morning.lxkhx.cn.gov.cn.lxkhx.cn http://www.morning.kdbbm.cn.gov.cn.kdbbm.cn http://www.morning.tlzbt.cn.gov.cn.tlzbt.cn http://www.morning.xbmwh.cn.gov.cn.xbmwh.cn http://www.morning.ypdmr.cn.gov.cn.ypdmr.cn http://www.morning.rqhdt.cn.gov.cn.rqhdt.cn http://www.morning.qdscb.cn.gov.cn.qdscb.cn