天天看点

Hadoop集群(二) HDFS搭建

   HDFS只是Hadoop最基本的一个服务,很多其他服务,都是基于HDFS展开的。所以部署一个HDFS集群,是很核心的一个动作,也是大数据平台的开始。

   安装Hadoop集群,首先需要有Zookeeper才可以完成安装。如果没有Zookeeper,请先部署一套Zookeeper。另外,JDK以及物理主机的一些设置等。请参考:

<a href="http://hsbxxl.blog.51cto.com/181620/1971241" target="_blank"></a>

<a href="http://hsbxxl.blog.51cto.com/181620/1971241" target="_blank">Hadoop集群(一) Zookeeper搭建</a>

<a href="http://hsbxxl.blog.51cto.com/181620/1971501" target="_blank">Hadoop集群(三) Hbase搭建</a>

<a href="http://hsbxxl.blog.51cto.com/181620/1976472" target="_blank">Hadoop集群(四) Hadoop升级</a>

下面开始HDFS的安装

HDFS主机分配

1

2

3

<code>192.168.67.101 c6701 </code><code>--Namenode+datanode</code>

<code>192.168.67.102 c6702 </code><code>--datanode</code>

<code>192.168.67.103 c6703 </code><code>--datanode</code>

1. 安装HDFS,解压hadoop-2.6.0-EDH-0u2.tar.gz 

我同时下载2.6和2.7版本的软件,先安装2.6,然后在执行2.6到2.7的升级步骤

4

5

6

7

8

9

10

11

12

13

14

15

16

<code>useradd hdfs</code>

<code>echo </code><code>"hdfs:hdfs"</code> <code>| chpasswd</code>

<code>su - hdfs</code>

<code>cd /tmp/software</code>

<code>tar -zxvf hadoop-2.6.0-EDH-0u2.tar.gz -C /home/hdfs/</code>

<code>mkdir -p /data/hadoop/</code><code>temp</code> 

<code>mkdir -p /data/hadoop/journal </code>

<code>mkdir -p /data/hadoop/hdfs/</code><code>name</code> 

<code>mkdir -p /data/hadoop/hdfs/data</code>

<code>chown -R hdfs:hdfs /data/hadoop</code>

<code>chown -R hdfs:hdfs /data/hadoop/</code><code>temp</code> 

<code>chown -R hdfs:hdfs /data/hadoop/journal </code>

<code>chown -R hdfs:hdfs /data/hadoop/hdfs/</code><code>name</code> 

<code>chown -R hdfs:hdfs /data/hadoop/hdfs/data </code>

<code>$ pwd</code>

<code>/home/hdfs/hadoop-2.6.0-EDH-0u2/etc/hadoop</code>

2. 修改core-site.xml对应的参数

17

18

19

20

21

22

23

<code>$ cat core-site.xml</code>

<code>&lt;configuration&gt;</code>

<code> </code><code>&lt;!</code><code>-- 指定hdfs的nameservice为ns --&gt;</code>

<code> </code><code>&lt;property&gt;   </code>

<code>      </code><code>&lt;</code><code>name</code><code>&gt;fs.defaultFS&lt;/</code><code>name</code><code>&gt;   </code>

<code>      </code><code>&lt;value&gt;hdfs://ns&lt;/value&gt;   </code>

<code> </code><code>&lt;/property&gt;</code>

<code> </code><code>&lt;!</code><code>--指定hadoop数据临时存放目录--&gt;</code>

<code> </code><code>&lt;property&gt;</code>

<code>      </code><code>&lt;</code><code>name</code><code>&gt;hadoop.tmp.dir&lt;/</code><code>name</code><code>&gt;</code>

<code>      </code><code>&lt;value&gt;/data/hadoop/</code><code>temp</code><code>&lt;/value&gt;</code>

<code> </code><code>&lt;/property&gt; </code>

<code>                         </code> 

<code>      </code><code>&lt;</code><code>name</code><code>&gt;io.file.buffer.</code><code>size</code><code>&lt;/</code><code>name</code><code>&gt;   </code>

<code>      </code><code>&lt;value&gt;4096&lt;/value&gt;   </code>

<code> </code><code>&lt;!</code><code>--指定zookeeper地址--&gt;</code>

<code>      </code><code>&lt;</code><code>name</code><code>&gt;ha.zookeeper.quorum&lt;/</code><code>name</code><code>&gt;</code>

<code>      </code><code>&lt;value&gt;c6701:2181,c6702:2181,c6703:2181&lt;/value&gt;</code>

<code> </code><code>&lt;/configuration&gt;</code>

3. 修改hdfs-site.xml对应的参数

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

<code>cat hdfs-site.xml</code>

<code>    </code><code>&lt;!</code><code>--指定hdfs的nameservice为ns,需要和core-site.xml中的保持一致,并且ns如果改,整个文件中,全部的ns要都修改,保持统一 --&gt;   </code>

<code>    </code><code>&lt;property&gt;   </code>

<code>        </code><code>&lt;</code><code>name</code><code>&gt;dfs.nameservices&lt;/</code><code>name</code><code>&gt;   </code>

<code>        </code><code>&lt;value&gt;ns&lt;/value&gt;   </code>

<code>    </code><code>&lt;/property&gt; </code>

<code>    </code><code>&lt;!</code><code>-- ns下面有两个NameNode,分别是nn1,nn2 --&gt;</code>

<code>    </code><code>&lt;property&gt;</code>

<code>      </code><code>&lt;</code><code>name</code><code>&gt;dfs.ha.namenodes.ns&lt;/</code><code>name</code><code>&gt;</code>

<code>      </code><code>&lt;value&gt;nn1,nn2&lt;/value&gt;</code>

<code>    </code><code>&lt;/property&gt;</code>

<code>    </code><code>&lt;!</code><code>-- nn1的RPC通信地址 --&gt;</code>

<code>      </code><code>&lt;</code><code>name</code><code>&gt;dfs.namenode.rpc-address.ns.nn1&lt;/</code><code>name</code><code>&gt;</code>

<code>      </code><code>&lt;value&gt;c6701:9000&lt;/value&gt;</code>

<code>    </code><code>&lt;!</code><code>-- nn1的http通信地址 --&gt;</code>

<code>        </code><code>&lt;</code><code>name</code><code>&gt;dfs.namenode.http-address.ns.nn1&lt;/</code><code>name</code><code>&gt;</code>

<code>        </code><code>&lt;value&gt;c6701:50070&lt;/value&gt;</code>

<code>    </code><code>&lt;!</code><code>-- nn2的RPC通信地址 --&gt;</code>

<code>        </code><code>&lt;</code><code>name</code><code>&gt;dfs.namenode.rpc-address.ns.nn2&lt;/</code><code>name</code><code>&gt;</code>

<code>        </code><code>&lt;value&gt;c6702:9000&lt;/value&gt;</code>

<code>    </code><code>&lt;!</code><code>-- nn2的http通信地址 --&gt;</code>

<code>        </code><code>&lt;</code><code>name</code><code>&gt;dfs.namenode.http-address.ns.nn2&lt;/</code><code>name</code><code>&gt;</code>

<code>        </code><code>&lt;value&gt;c6702:50070&lt;/value&gt;</code>

<code>    </code><code>&lt;!</code><code>-- 指定NameNode的元数据在JournalNode上的存放位置 --&gt;</code>

<code>        </code><code>&lt;</code><code>name</code><code>&gt;dfs.namenode.shared.edits.dir&lt;/</code><code>name</code><code>&gt;</code>

<code>        </code><code>&lt;value&gt;qjournal://c6701:8485;c6702:8485;c6703:8485/ns&lt;/value&gt;</code>

<code>    </code><code>&lt;!</code><code>-- 指定JournalNode在本地磁盘存放数据的位置 --&gt;</code>

<code>          </code><code>&lt;</code><code>name</code><code>&gt;dfs.journalnode.edits.dir&lt;/</code><code>name</code><code>&gt;</code>

<code>          </code><code>&lt;value&gt;/data/hadoop/journal&lt;/value&gt;</code>

<code>    </code><code>&lt;!</code><code>-- 开启NameNode故障时自动切换 --&gt;</code>

<code>          </code><code>&lt;</code><code>name</code><code>&gt;dfs.ha.automatic-failover.enabled&lt;/</code><code>name</code><code>&gt;</code>

<code>          </code><code>&lt;value&gt;</code><code>true</code><code>&lt;/value&gt;</code>

<code>    </code><code>&lt;!</code><code>-- 配置失败自动切换实现方式 --&gt;</code>

<code>            </code><code>&lt;</code><code>name</code><code>&gt;dfs.client.failover.proxy.provider.ns&lt;/</code><code>name</code><code>&gt;</code>

<code>            </code><code>&lt;value&gt;org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider&lt;/value&gt;</code>

<code>    </code><code>&lt;!</code><code>-- 配置隔离机制 --&gt;</code>

<code>            </code><code>&lt;</code><code>name</code><code>&gt;dfs.ha.fencing.methods&lt;/</code><code>name</code><code>&gt;</code>

<code>            </code><code>&lt;value&gt;sshfence&lt;/value&gt;</code>

<code>    </code><code>&lt;!</code><code>-- 使用隔离机制时需要ssh免登陆 --&gt;</code>

<code>            </code><code>&lt;</code><code>name</code><code>&gt;dfs.ha.fencing.ssh.private-</code><code>key</code><code>-files&lt;/</code><code>name</code><code>&gt;</code>

<code>            </code><code>&lt;value&gt;/home/hdfs/.ssh/id_rsa&lt;/value&gt;</code>

<code>                             </code> 

<code>        </code><code>&lt;</code><code>name</code><code>&gt;dfs.namenode.</code><code>name</code><code>.dir&lt;/</code><code>name</code><code>&gt;   </code>

<code>        </code><code>&lt;value&gt;/data/hadoop/hdfs/</code><code>name</code><code>&lt;/value&gt;   </code>

<code>    </code><code>&lt;/property&gt;   </code>

<code>   </code> 

<code>        </code><code>&lt;</code><code>name</code><code>&gt;dfs.datanode.data.dir&lt;/</code><code>name</code><code>&gt;   </code>

<code>        </code><code>&lt;value&gt;/data/hadoop/hdfs/data&lt;/value&gt;   </code>

<code>      </code><code>&lt;</code><code>name</code><code>&gt;dfs.replication&lt;/</code><code>name</code><code>&gt;   </code>

<code>      </code><code>&lt;value&gt;2&lt;/value&gt;   </code>

<code>    </code><code>&lt;!</code><code>-- 在NN和DN上开启WebHDFS (REST API)功能,不是必须 --&gt;                                                                   </code>

<code>      </code><code>&lt;</code><code>name</code><code>&gt;dfs.webhdfs.enabled&lt;/</code><code>name</code><code>&gt;   </code>

<code>      </code><code>&lt;value&gt;</code><code>true</code><code>&lt;/value&gt;   </code>

<code>&lt;/configuration&gt;</code>

4. 添加slaves文件

<code>$ more slaves</code>

<code>c6701</code>

<code>c6702</code>

<code>c6703</code>

--- 安装C6702的hdfs---

5. 创建c6702的用户,并为hdfs用户ssh免密

<code>ssh c6702 </code><code>"useradd hdfs"</code>

<code>ssh c6702 </code><code>"echo "</code><code>hdfs:hdfs</code><code>" | chpasswd"</code>

<code>ssh-copy-id  hdfs@c6702</code>

6. 拷贝软件

<code>scp -r /tmp/software/hadoop-2.6.0-EDH-0u2.tar.gz root@c6702:/tmp/software/.</code>

<code>ssh c6702 </code><code>"chmod 777 /tmp/software/*"</code>

7. 创建目录,解压软件

<code>ssh hdfs@c6702 </code><code>"mkdir hdfs"</code>

<code>ssh hdfs@c6702 </code><code>"tar -zxvf /tmp/software/hadoop-2.6.0-EDH-0u2.tar.gz -C /home/hdfs"</code>

<code>ssh hdfs@c6702 </code><code>"ls -al hdfs"</code>

<code>ssh hdfs@c6702 </code><code>"ls -al hdfs/hadoop*"</code>

复制配置文件

<code>ssh hdfs@c6702 </code><code>"rm -rf /home/hdfs/hadoop-2.6.0-EDH-0u2/etc/hadoop/core-site.xml"</code>

<code>ssh hdfs@c6702 </code><code>"rm -rf /home/hdfs/hadoop-2.6.0-EDH-0u2/etc/hadoop/hdfs-site.xml"</code>

<code>scp -r /home/hdfs/hadoop-2.6.0-EDH-0u2/etc/hadoop/core-site.xml hdfs@c6702:/home/hdfs/hadoop-2.6.0-EDH-0u2/etc/hadoop/core-site.xml</code>

<code>scp -r /home/hdfs/hadoop-2.6.0-EDH-0u2/etc/hadoop/hdfs-site.xml hdfs@c6702:/home/hdfs/hadoop-2.6.0-EDH-0u2/etc/hadoop/hdfs-site.xml</code>

<code>scp -r /home/hdfs/hadoop-2.6.0-EDH-0u2/etc/hadoop/slaves hdfs@c6702:/home/hdfs/hadoop-2.6.0-EDH-0u2/etc/hadoop/slaves</code>

创建hdfs需要的目录

<code>ssh root@c6702 </code><code>"mkdir -p /data/hadoop"</code>

<code>ssh root@c6702 </code><code>" chown -R hdfs:hdfs  /data/hadoop"</code>

<code>ssh hdfs@c6702 </code><code>"mkdir -p /data/hadoop/temp"</code>

<code>ssh hdfs@c6702 </code><code>"mkdir -p /data/hadoop/journal"</code>

<code>ssh hdfs@c6702 </code><code>"mkdir -p /data/hadoop/hdfs/name"</code>

<code>ssh hdfs@c6702 </code><code>"mkdir -p /data/hadoop/hdfs/data"</code>

--- 安装C6703的hdfs---

8. 创建c6703的用户,并为hdfs用户ssh免密

<code>ssh c6703 </code><code>"useradd hdfs"</code>

<code>ssh c6703 </code><code>"echo "</code><code>hdfs:hdfs</code><code>" | chpasswd"</code>

<code>ssh-copy-id  hdfs@c6703</code>

9. 拷贝软件

<code>scp -r /tmp/software/hadoop-2.6.0-EDH-0u2.tar.gz root@c6703:/tmp/software/.</code>

<code>ssh c6703 </code><code>"chmod 777 /tmp/software/*"</code>

<code>10. 创建目录,解压软件</code>

<code>ssh hdfs@c6703 </code><code>"mkdir hdfs"</code>

<code>ssh hdfs@c6703 </code><code>"tar -zxvf /tmp/software/hadoop-2.6.0-EDH-0u2.tar.gz -C /home/hdfs"</code>

<code>ssh hdfs@c6703 </code><code>"ls -al hdfs"</code>

<code>ssh hdfs@c6703 </code><code>"ls -al hdfs/hadoop*"</code>

<code>ssh hdfs@c6703 </code><code>"rm -rf /home/hdfs/hadoop-2.6.0-EDH-0u2/etc/hadoop/core-site.xml"</code>

<code>ssh hdfs@c6703 </code><code>"rm -rf /home/hdfs/hadoop-2.6.0-EDH-0u2/etc/hadoop/hdfs-site.xml"</code>

<code>scp -r /home/hdfs/hadoop-2.6.0-EDH-0u2/etc/hadoop/core-site.xml hdfs@c6703:/home/hdfs/hadoop-2.6.0-EDH-0u2/etc/hadoop/core-site.xml</code>

<code>scp -r /home/hdfs/hadoop-2.6.0-EDH-0u2/etc/hadoop/hdfs-site.xml hdfs@c6703:/home/hdfs/hadoop-2.6.0-EDH-0u2/etc/hadoop/hdfs-site.xml</code>

<code>scp -r /home/hdfs/hadoop-2.6.0-EDH-0u2/etc/hadoop/slaves hdfs@c6703:/home/hdfs/hadoop-2.6.0-EDH-0u2/etc/hadoop/slaves</code>

<code>ssh root@c6703 </code><code>"mkdir -p /data/hadoop"</code>

<code>ssh root@c6703 </code><code>" chown -R hdfs:hdfs  /data/hadoop"</code>

<code>ssh hdfs@c6703 </code><code>"mkdir -p /data/hadoop/temp"</code>

<code>ssh hdfs@c6703 </code><code>"mkdir -p /data/hadoop/journal"</code>

<code>ssh hdfs@c6703 </code><code>"mkdir -p /data/hadoop/hdfs/name"</code>

<code>ssh hdfs@c6703 </code><code>"mkdir -p /data/hadoop/hdfs/data"</code>

11. 启动HDFS,先启动三个节点的journalnode

/home/hdfs/hadoop-2.6.0-EDH-0u2/sbin/hadoop-daemon.sh start journalnode

检查状态

<code>$ jps</code>

<code>3958 Jps</code>

<code>3868 JournalNode</code>

12. 然后启动namenode,首次启动namenode之前,先在其中一个节点(主节点)format namenode信息,信息会存在于dfs.namenode.name.dir指定的路径中

<code> </code><code>&lt;</code><code>name</code><code>&gt;dfs.namenode.</code><code>name</code><code>.dir&lt;/</code><code>name</code><code>&gt;   </code>

<code> </code><code>&lt;value&gt;/data/hadoop/hdfs/</code><code>name</code><code>&lt;/value&gt;</code>

<code>$ ./hdfs namenode -format</code>

<code>17/09/26 07:52:17 INFO namenode.NameNode: STARTUP_MSG:</code>

<code>/************************************************************</code>

<code>STARTUP_MSG: Starting NameNode</code>

<code>STARTUP_MSG:   host = c6701.python279.org/192.168.67.101</code>

<code>STARTUP_MSG:   args = [-format]</code>

<code>STARTUP_MSG:   version = 2.6.0-EDH-0u2</code>

<code>STARTUP_MSG:   classpath = /home/hdfs/hadoop-2.6.0-EDHxxxxxxxxxx</code>

<code>STARTUP_MSG:   build = http://gitlab-xxxxx</code>

<code>STARTUP_MSG:   java = 1.8.0_144</code>

<code>************************************************************/</code>

<code>17/09/26 07:52:17 INFO namenode.NameNode: registered UNIX signal handlers </code><code>for</code> <code>[TERM, HUP, </code><code>INT</code><code>]</code>

<code>17/09/26 07:52:17 INFO namenode.NameNode: createNameNode [-format]</code>

<code>17/09/26 07:52:18 WARN common.Util: Path /data/hadoop/hdfs/</code><code>name</code> <code>should be specified </code><code>as</code> <code>a URI </code><code>in</code> <code>configuration files. Please </code><code>update</code> <code>hdfs configuration.</code>

<code>Formatting using clusterid: CID-b2f01411-862f-44b2-a6dc-7d17bd48d522</code>

<code>17/09/26 07:52:18 INFO namenode.FSNamesystem: </code><code>No</code> <code>KeyProvider found.</code>

<code>17/09/26 07:52:18 INFO namenode.FSNamesystem: fsLock </code><code>is</code> <code>fair:</code><code>true</code>

<code>17/09/26 07:52:18 INFO blockmanagement.DatanodeManager: dfs.block.invalidate.limit=1000</code>

<code>17/09/26 07:52:18 INFO blockmanagement.DatanodeManager: dfs.namenode.datanode.registration.ip-hostname-</code><code>check</code><code>=</code><code>true</code>

<code>17/09/26 07:52:18 INFO blockmanagement.BlockManager: dfs.namenode.startup.delay.block.deletion.sec </code><code>is</code> <code>set</code> <code>to</code> <code>000:00:00:00.000</code>

<code>17/09/26 07:52:18 INFO blockmanagement.BlockManager: The block deletion will start around 2017 Sep 26 07:52:18</code>

<code>17/09/26 07:52:18 INFO util.GSet: Computing capacity </code><code>for</code> <code>map BlocksMap</code>

<code>17/09/26 07:52:18 INFO util.GSet: VM type       = 64-</code><code>bit</code>

<code>17/09/26 07:52:18 INFO util.GSet: 2.0% </code><code>max</code> <code>memory 966.7 MB = 19.3 MB</code>

<code>17/09/26 07:52:18 INFO util.GSet: capacity      = 2^21 = 2097152 entries</code>

<code>17/09/26 07:52:18 INFO blockmanagement.BlockManager: dfs.block.access.token.enable=</code><code>false</code>

<code>17/09/26 07:52:18 INFO blockmanagement.BlockManager: defaultReplication         = 2</code>

<code>17/09/26 07:52:18 INFO blockmanagement.BlockManager: maxReplication             = 512</code>

<code>17/09/26 07:52:18 INFO blockmanagement.BlockManager: minReplication             = 1</code>

<code>17/09/26 07:52:18 INFO blockmanagement.BlockManager: maxReplicationStreams      = 2</code>

<code>17/09/26 07:52:18 INFO blockmanagement.BlockManager: shouldCheckForEnoughRacks  = </code><code>false</code>

<code>17/09/26 07:52:18 INFO blockmanagement.BlockManager: replicationRecheckInterval = 3000</code>

<code>17/09/26 07:52:18 INFO blockmanagement.BlockManager: encryptDataTransfer        = </code><code>false</code>

<code>17/09/26 07:52:18 INFO blockmanagement.BlockManager: maxNumBlocksToLog          = 1000</code>

<code>17/09/26 07:52:18 INFO namenode.FSNamesystem: fsOwner             = hdfs (auth:SIMPLE)</code>

<code>17/09/26 07:52:18 INFO namenode.FSNamesystem: supergroup          = supergroup</code>

<code>17/09/26 07:52:18 INFO namenode.FSNamesystem: isPermissionEnabled = </code><code>true</code>

<code>17/09/26 07:52:18 INFO namenode.FSNamesystem: Determined nameservice ID: ns</code>

<code>17/09/26 07:52:18 INFO namenode.FSNamesystem: HA Enabled: </code><code>true</code>

<code>17/09/26 07:52:18 INFO namenode.FSNamesystem: Append Enabled: </code><code>true</code>

<code>17/09/26 07:52:18 INFO util.GSet: Computing capacity </code><code>for</code> <code>map INodeMap</code>

<code>17/09/26 07:52:18 INFO util.GSet: 1.0% </code><code>max</code> <code>memory 966.7 MB = 9.7 MB</code>

<code>17/09/26 07:52:18 INFO util.GSet: capacity      = 2^20 = 1048576 entries</code>

<code>17/09/26 07:52:18 INFO namenode.NameNode: Caching file names occuring more than 10 times</code>

<code>17/09/26 07:52:18 INFO util.GSet: Computing capacity </code><code>for</code> <code>map cachedBlocks</code>

<code>17/09/26 07:52:18 INFO util.GSet: 0.25% </code><code>max</code> <code>memory 966.7 MB = 2.4 MB</code>

<code>17/09/26 07:52:18 INFO util.GSet: capacity      = 2^18 = 262144 entries</code>

<code>17/09/26 07:52:18 INFO namenode.FSNamesystem: dfs.namenode.safemode.threshold-pct = 0.9990000128746033</code>

<code>17/09/26 07:52:18 INFO namenode.FSNamesystem: dfs.namenode.safemode.</code><code>min</code><code>.datanodes = 0</code>

<code>17/09/26 07:52:18 INFO namenode.FSNamesystem: dfs.namenode.safemode.extension     = 30000</code>

<code>17/09/26 07:52:18 INFO namenode.FSNamesystem: Retry cache </code><code>on</code> <code>namenode </code><code>is</code> <code>enabled</code>

<code>17/09/26 07:52:18 INFO namenode.FSNamesystem: Retry cache will use 0.03 </code><code>of</code> <code>total heap </code><code>and</code> <code>retry cache entry expiry </code><code>time</code> <code>is</code> <code>600000 millis</code>

<code>17/09/26 07:52:18 INFO util.GSet: Computing capacity </code><code>for</code> <code>map NameNodeRetryCache</code>

<code>17/09/26 07:52:18 INFO util.GSet: 0.029999999329447746% </code><code>max</code> <code>memory 966.7 MB = 297.0 KB</code>

<code>17/09/26 07:52:18 INFO util.GSet: capacity      = 2^15 = 32768 entries</code>

<code>17/09/26 07:52:18 INFO namenode.NNConf: ACLs enabled? </code><code>false</code>

<code>17/09/26 07:52:18 INFO namenode.NNConf: XAttrs enabled? </code><code>true</code>

<code>17/09/26 07:52:18 INFO namenode.NNConf: Maximum </code><code>size</code> <code>of</code> <code>an xattr: 16384</code>

<code>17/09/26 07:52:19 INFO namenode.FSImage: Allocated new BlockPoolId: BP-144216011-192.168.67.101-1506412339757</code>

<code>17/09/26 07:52:19 INFO common.Storage: Storage directory /data/hadoop/hdfs/</code><code>name</code> <code>has been successfully formatted.</code>

<code>17/09/26 07:52:20 INFO namenode.NNStorageRetentionManager: Going </code><code>to</code> <code>retain 1 images </code><code>with</code> <code>txid &gt;= 0</code>

<code>17/09/26 07:52:20 INFO util.ExitUtil: Exiting </code><code>with</code> <code>status 0</code>

<code>17/09/26 07:52:20 INFO namenode.NameNode: SHUTDOWN_MSG:</code>

<code>SHUTDOWN_MSG: Shutting down NameNode </code><code>at</code> <code>c6701.python279.org/192.168.67.101</code>

13. standby namenode需要先执行bootstrapstandby,输出如下

<code>[hdfs@c6702 sbin]$ ../bin/hdfs namenode -bootstrapstandby</code>

<code>17/09/26 09:44:58 INFO namenode.NameNode: STARTUP_MSG:</code>

<code>STARTUP_MSG:   host = c6702.python279.org/192.168.67.102</code>

<code>STARTUP_MSG:   args = [-bootstrapstandby]</code>

<code>STARTUP_MSG:   classpath = /home/hdfs/haxxx</code>

<code>STARTUP_MSG:   build = http://gitlab-xxxx</code>

<code>17/09/26 09:44:58 INFO namenode.NameNode: registered UNIX signal handlers </code><code>for</code> <code>[TERM, HUP, </code><code>INT</code><code>]</code>

<code>17/09/26 09:44:58 INFO namenode.NameNode: createNameNode [-bootstrapstandby]</code>

<code>17/09/26 09:44:59 WARN common.Util: Path /data/hadoop/hdfs/</code><code>name</code> <code>should be specified </code><code>as</code> <code>a URI </code><code>in</code> <code>configuration files. Please </code><code>update</code> <code>hdfs configuration.</code>

<code>=====================================================</code>

<code>About </code><code>to</code> <code>bootstrap Standby ID nn2 </code><code>from</code><code>:</code>

<code>           </code><code>Nameservice ID: ns</code>

<code>        </code><code>Other Namenode ID: nn1</code>

<code>  </code><code>Other NN</code><code>'s HTTP address: http://c6701:50070</code>

<code>  </code><code>Other NN'</code><code>s IPC  address: c6701/192.168.67.101:9000</code>

<code>             </code><code>Namespace ID: 793662207</code>

<code>            </code><code>Block pool ID: BP-144216011-192.168.67.101-1506412339757</code>

<code>               </code><code>Cluster ID: CID-b2f01411-862f-44b2-a6dc-7d17bd48d522</code>

<code>           </code><code>Layout version: -60</code>

<code>Re-format filesystem </code><code>in</code> <code>Storage Directory /data/hadoop/hdfs/</code><code>name</code> <code>? (Y </code><code>or</code> <code>N) y</code>

<code>17/09/26 09:45:16 INFO common.Storage: Storage directory /data/hadoop/hdfs/</code><code>name</code> <code>has been successfully formatted.</code>

<code>17/09/26 09:45:16 WARN common.Util: Path /data/hadoop/hdfs/</code><code>name</code> <code>should be specified </code><code>as</code> <code>a URI </code><code>in</code> <code>configuration files. Please </code><code>update</code> <code>hdfs configuration.</code>

<code>17/09/26 09:45:17 INFO namenode.TransferFsImage: Opening </code><code>connection</code> <code>to</code> <code>http://c6701:50070/imagetransfer?getimage=1&amp;txid=0&amp;storageInfo=-60:793662207:0:CID-b2f01411-862f-44b2-a6dc-7d17bd48d522</code>

<code>17/09/26 09:45:17 INFO namenode.TransferFsImage: Image Transfer timeout configured </code><code>to</code> <code>60000 milliseconds</code>

<code>17/09/26 09:45:17 INFO namenode.TransferFsImage: Transfer took 0.01s </code><code>at</code> <code>0.00 KB/s</code>

<code>17/09/26 09:45:17 INFO namenode.TransferFsImage: Downloaded file fsimage.ckpt_0000000000000000000 </code><code>size</code> <code>351 bytes.</code>

<code>17/09/26 09:45:17 INFO util.ExitUtil: Exiting </code><code>with</code> <code>status 0</code>

<code>17/09/26 09:45:17 INFO namenode.NameNode: SHUTDOWN_MSG:</code>

<code>SHUTDOWN_MSG: Shutting down NameNode </code><code>at</code> <code>c6702.python279.org/192.168.67.102</code>

14. 检查状态,namenode还没有启动

<code>[hdfs@c6702 sbin]$ jps</code>

<code>4539 Jps</code>

15. 启动standby namenode,命令和master启动的方式相同

<code>[hdfs@c6702 sbin]$ ./hadoop-daemon.sh start namenode</code>

<code>starting namenode, logging </code><code>to</code> <code>/home/hdfs/hadoop-2.6.0-EDH-0u2/logs/hadoop-hdfs-namenode-c6702.python279.org.</code><code>out</code>

16. 再次检查,namenode已经启动

<code>4640 Jps</code>

<code>4570 NameNode</code>

17. 格式化zkfc,让在zookeeper中生成ha节点,在master上执行如下命令,完成格式化

<code>[hdfs@c6701 bin]$ ./hdfs zkfc -formatZK</code>

<code>17/09/26 09:59:20 INFO tools.DFSZKFailoverController: Failover controller configured </code><code>for</code> <code>NameNode NameNode </code><code>at</code> <code>c6701/192.168.67.101:9000</code>

<code>17/09/26 09:59:20 INFO zookeeper.ZooKeeper: Client environment:zookeeper.version=3.4.6-1569965, built </code><code>on</code> <code>02/20/2014 09:09 GMT</code>

<code>17/09/26 09:59:20 INFO zookeeper.ZooKeeper: Client environment:host.</code><code>name</code><code>=c6701.python279.org</code>

<code>17/09/26 09:59:20 INFO zookeeper.ZooKeeper: Client environment:java.version=1.8.0_144</code>

<code>17/09/26 09:59:20 INFO zookeeper.ZooKeeper: Client environment:java.vendor=Oracle Corporation</code>

<code>17/09/26 09:59:20 INFO zookeeper.ZooKeeper: Client environment:java.home=/usr/</code><code>local</code><code>/jdk1.8.0_144/jre</code>

<code>17/09/26 09:59:20 INFO zookeeper.ZooKeeper: Client environment:java.class.path=/home/hdfs/hadoop-2.6.0-EDH-0u2/exxxx</code>

<code>17/09/26 09:59:20 INFO zookeeper.ZooKeeper: Client environment:java.library.path=/home/hdfs/hadoop-2.6.0-EDH-0u2/lib/native</code>

<code>17/09/26 09:59:20 INFO zookeeper.ZooKeeper: Client environment:java.io.tmpdir=/tmp</code>

<code>17/09/26 09:59:20 INFO zookeeper.ZooKeeper: Client environment:java.compiler=&lt;NA&gt;</code>

<code>17/09/26 09:59:20 INFO zookeeper.ZooKeeper: Client environment:os.</code><code>name</code><code>=Linux</code>

<code>17/09/26 09:59:20 INFO zookeeper.ZooKeeper: Client environment:os.arch=amd64</code>

<code>17/09/26 09:59:20 INFO zookeeper.ZooKeeper: Client environment:os.version=2.6.32-573.el6.x86_64</code>

<code>17/09/26 09:59:20 INFO zookeeper.ZooKeeper: Client environment:</code><code>user</code><code>.</code><code>name</code><code>=hdfs</code>

<code>17/09/26 09:59:20 INFO zookeeper.ZooKeeper: Client environment:</code><code>user</code><code>.home=/home/hdfs</code>

<code>17/09/26 09:59:20 INFO zookeeper.ZooKeeper: Client environment:</code><code>user</code><code>.dir=/home/hdfs/hadoop-2.6.0-EDH-0u2/bin</code>

<code>17/09/26 09:59:20 INFO zookeeper.ZooKeeper: Initiating client </code><code>connection</code><code>, connectString=c6701:2181,c6702:2181,c6703:2181 sessionTimeout=5000 watcher=org.apache.hadoop.ha.ActiveStandbyElector$WatcherWithClientRef@20deea7f</code>

<code>17/09/26 09:59:20 INFO zookeeper.ClientCnxn: Opening socket </code><code>connection</code> <code>to</code> <code>server c6703.python279.org/192.168.67.103:2181. Will </code><code>not</code> <code>attempt </code><code>to</code> <code>authenticate using SASL (unknown error)</code>

<code>17/09/26 09:59:20 INFO zookeeper.ClientCnxn: Socket </code><code>connection</code> <code>established </code><code>to</code> <code>c6703.python279.org/192.168.67.103:2181, initiating session</code>

<code>17/09/26 09:59:20 INFO zookeeper.ClientCnxn: Session establishment complete </code><code>on</code> <code>server c6703.python279.org/192.168.67.103:2181, sessionid = 0x35ebc5163710000, negotiated timeout = 5000</code>

<code>17/09/26 09:59:20 INFO ha.ActiveStandbyElector: Session connected.</code>

<code>17/09/26 09:59:20 INFO ha.ActiveStandbyElector: Successfully created /hadoop-ha/ns </code><code>in</code> <code>ZK.</code>

<code>17/09/26 09:59:20 INFO zookeeper.ZooKeeper: Session: 0x35ebc5163710000 closed</code>

<code>17/09/26 09:59:20 INFO zookeeper.ClientCnxn: EventThread shut down</code>

18. 格式化完成的检查

格式成功后,查看zookeeper中可以看到    &lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;命令没确认

<code>[zk: localhost:2181(CONNECTED) 1] ls /hadoop-ha</code>

19. 启动zkfc,这个就是为namenode使用的

<code>./hadoop-daemon.sh start zkfc</code>

<code>starting zkfc, logging </code><code>to</code> <code>/home/hdfs/hadoop-2.6.0-EDH-0u2/logs/hadoop-hdfs-zkfc-c6701.python279.org.</code><code>out</code>

<code>4272 DataNode</code>

<code>4402 JournalNode</code>

<code>6339 Jps</code>

<code>6277 DFSZKFailoverController</code>

<code>4952 NameNode</code>

20. 另一个节点启动zkfc,

<code>ssh  hdfs@c6702 </code>

<code>/home/hdfs/hadoop-2.6.0-EDH-0u2/sbin/hadoop-daemon.sh start zkfc</code>

<code>4981 Jps</code>

<code>4935 DFSZKFailoverController</code>

21. 注意:进行初始化的时候,必须保证zk集群已经启动了。

    1、在ZK中创建znode来存储automatic Failover的数据,任选一个NN执行完成即可:

        sh bin/hdfs zkfc -formatZK

    2、启动zkfs,在所有的NN节点中执行以下命令:

        sh sbin/hadoop-daemon.sh start zkfc

22. 启动datanode

最后启动集群

<code>    </code><code>sh sbin/start-dfs.sh</code>

HDFS安装过程中的重点,最后在软件启动过程中,一些初始化操作,很重要。

1. 启动全部的journalnode

2. 在namenode1上执行, hdfs namenode -format

3. 在namenode1上执行, 启动namenode1,命令hadoop-daemon.sh start namenode 

4. 在namenode2上执行, hdfs namenode -bootstrapstandby

5. 在namenode1上执行,格式化zkfc,在zookeeper中生成HA节点, hdfs zkfc -formatZK

6. 启动zkfc,hadoop-daemon.sh start zkfc。 有namenode运行的节点,都要启动ZKFC

7. 启动 datanode

HDFS只是Hadoop最基本的一个模块,这里已经安装完成,可以为后面的Hbase提供服务了。

本文转自 hsbxxl 51CTO博客,原文链接:http://blog.51cto.com/hsbxxl/1971475,如需转载请自行联系原作者