2,Hadoop环境搭建之本地模式
二次JDK配置的原因:
Ssh命令远程调用其它结点的时候,不会加载/etc/profile文件。我们一般部署JDK的时候将JAVA_HOME写在profile文件中,hadoop需要jdk,远程脚本启动其它结点的时候会失败。需要在hadoop中再做二次jdk配置。(就是因为远程调用对方的时候不会加载对方的etc/profile文件导致拿不到JAVA_HOME)
集群配置步骤分析:
分三步1,操作系统环境的配置。2,hadoop配置文件的配置。3,格式化启动hadoop角色。
1,操作系统环境配置
(1)JDK配置
export JAVA_HOME=/usr/java/jdk1.7.0_45
export PATH=$PATH:$JAVA_HOME/bin
(2)ssh安装
yum -y install openssh-clients
(3)免秘钥配置
[[email protected] .ssh]# ssh-****** -t dsa -P '' -f ./id_dsa (生成公钥**文件)
[[email protected] .ssh]# cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys (读取自己的公钥追加记录到authorized_keys认证文件中) 当我们ssh localhost的时候,会拿着id_dsa.pub去找本机的authorized_keys认证
2,hadoop本地模式部署配置
(1)创建目录文件,将hadoop安装包解压到指定目录
[[email protected] hadoop-2.6.5]# mkdir /opt/sxt
[[email protected] hadoop-2.6.5]# tar -zxvf hadoop-2.6.5.tar.gz -C /opt/sxt/
解压后目录结构为:
drwxr-xr-x. 2 root root 4096 5月 24 2017 bin hadoop项目中的功能
drwxr-xr-x. 3 root root 4096 5月 24 2017 etc hadoop配置文件
drwxr-xr-x. 2 root root 4096 5月 24 2017 include
drwxr-xr-x. 3 root root 4096 5月 24 2017 lib
drwxr-xr-x. 2 root root 4096 5月 24 2017 libexec
-rw-r--r--. 1 root root 84853 5月 24 2017 LICENSE.txt
-rw-r--r--. 1 root root 14978 5月 24 2017 NOTICE.txt
-rw-r--r--. 1 root root 1366 5月 24 2017 README.txt
drwxr-xr-x. 2 root root 4096 5月 24 2017 sbin 操作系统启停服务管理脚本
drwxr-xr-x. 4 root root 4096 5月 24 2017 share jar包
(2)配置hadoop的环境变量,以便可以在任何目录执行hadoop命令
export HADOOP_PREFIX=/opt/sxt/hadoop-2.6.5
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_PREFIX/bin:$HADOOP_PREFIX/sbin
(3)Hadoop中做jdk二次配置(由于ssh远程调用的时候/etc/profile文件不会被加载)
[[email protected] hadoop]# pwd
/opt/sxt/hadoop-2.6.5/etc/hadoop
[[email protected] hadoop]# echo $JAVA_HOME
/usr/java/jdk1.7.0_45
配置 hadoop-env.sh,yarn-env.sh,mapred-env.sh 中JAVA_HOME
(4)调整配置文件规划hadoop角色
1),规划NameNode位置
etc/hadoop/core-site.xml(规划NameNode在哪里): 默认文件系统入口,服务脚本启动集群的时候读到这里就知道NameNode在哪里启动了,启动时候占用9000端口通信。DataNode和NameNode通信的时候也能找到。
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://node01:9000</value>
</property>
</configuration>
2),etc/hadoop/hdfs-site.xml(副本数量):
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
3),DataNode 通过slaves规划
4),SecondaryNameNode的规划 hdfs-site.xml
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>node01:50090</value>
</property>
5),由于Hadoop的临时文件存储目录在系统的tmp目录下,随时有可能被系统自己删掉,需要自己单独设置位置。core-site.xml
<property>
<name>hadoop.tmp.dir</name>
<value>/var/sxt/hadoop/local</value>
</property>
到目前为止,NameNode在node01,DataNode在node01,SecondaryNameNode也在node01,角色都规划好了,磁盘存放文件的目录也规划好了。
3,格式化NameNode启动集群
Hdfs namenode -format 执行格式化NameNode操作
[[email protected] current]# cat VERSION
#Fri Sep 28 01:46:39 CST 2018
namespaceID=1211221902
clusterID=CID-76a23f89-3eff-45a5-97cd-a43ac1bb125f
cTime=0
storageType=NAME_NODE
blockpoolID=BP-1418018278-192.168.25.201-1538070399463
layoutVersion=-60
当我们搭建完全分布式,不是在一个进程中的多线程时,或者一个大的局域网中可以搭建两套甚至多套hadoop集群,那么如何能保证这套的NameNode不会和另一套的DataNode通信呢?需要有一个标志,就是clusterID集群ID,其实格式化的时候是先创建了一个集群id,clusterID,DataNode启动的时候,空的DataNode会寻找NameNode将clusterID获取回去,只要一开始通信,就会先验证clusterID。
只能格式化一次:格式化完DataNode将clusterID拿走了,如果下次再格式化clusterID就会发生变化,DataNode将无法和NameNode通信。即DataNode的VERSION中的clusterID与NameNode的VERISON中的clusterID不同。
格式化完,启动文件系统
Start-dfs.sh
[[email protected] dfs]# jps
2049 DataNode
1968 NameNode
2325 Jps
2183 SecondaryNameNode
[[email protected] dfs]# ll
总用量 12
drwx------. 3 root root 4096 9月 28 02:00 data
drwxr-xr-x. 3 root root 4096 9月 28 02:00 name
drwxr-xr-x. 2 root root 4096 9月 28 02:01 namesecondary
启动成功可以通过50070端口访问
NameNode会维护一个虚拟的根目录树,与我们操作系统的目录上没有任何关系。
hdfs dfs -mkdir -p
Hdfs文件系统用户的家目录的父母目录是user,hdfs只是文件系统,没有用户管理模块,由什么用户创建的文件就属于这个用户的。