Hadoop部署,部署方式:集群、单机部署(Standalone)、伪分布式。伪分布式是服务进程存在的,通常是1个节点,通常用于本机开发。单机部署是没有服务进程的,通常用户调用,才用jar包进驻到用户进程中(不实用)。
1、解压Hadoop 到 /home/hadoop/software中
tar -zxvf hadoop-2.8.1.tar.gz
chown -R hadoop:hadoop ./hadoop-2.8.1
2、配置环境变量 ~/.bash_profile
#Hadoop
export HADOOP_HOME=/home/hadoop/software/hadoop-2.8.1
export PATH=$HADOOP_HOME/bin:$PATH
3、生效
source ~/.bash_profile
4、验证
hadoop version
hadoop执行包解压以后有以下文件夹,及主要作用
bin 执行命令的shell,其中.cmd是windows下的指令
etc 配置文件夹
lib 库
sbin 启动关闭集群
share jar包
修改/etc/hadoop/core-site.xml
1、添加HDFS对外提供服务的路径
<property>
<name>fs.defaultFSname>
<value>hdfs://localhost:9000value>
property>
这里用了localhost,如果想对外提供服务,那就配置本机的host那么或者ip。
修改etc/hadoop/hdfs-site.xml,因为是伪分布,所以副本数设置成1。
<property>
<name>dfs.replicationname>
<value>1value>
property>
修改etc/hadoop/hadoop-env.sh,添加Jdk的环境变量。
修改文档中的javahome路径
export JAVA_HOME=/usr/java/jdk1.8.0_45
如果这个不配,在如下启动的时候会 叫你填写0.0.0.0的ssh信任关系的yes,以确保本机对0.0.0.0的信任。如何才能避免,就是修改 etc/hadoop/hdfs-site.xml
<property>
<name>dfs.namenode.secondary.http-addressname>
<value>改成本地ip:50090value>
property>
<property>
<name>dfs.namenode.secondary.https-addressname>
<value>改成本地ip:50091value>
property>
echo "hadoop001" > slaves
修改文件 core-site.xml
<property>
<name>hadoop.tmp.dirname>
<value>/home/hadoop/app/tmpvalue>
property>
修改文件 hdfs-site.xml
<property>
<name>dfs.namenode.name.dirname>
<value>/home/hadoop/app/tmp/dfs/namevalue>
property>
<property>
<name>dfs.datanode.data.dirname>
<value>/home/hadoop/app/tmp/dfs/datavalue>
property>
如果是第一次启动,需要格式化整个文件系统。这里的第一次不是指系统启动后第一次,而是第一次用hdfs。
hdfs namenode -format
由于只讲/bin下的命令放置到全局,这个启动用到的是sbin文件夹下的指令,所以需要进入/sbin中去执行命令。
sbin/start-dfs.sh
1、输入jps 看到
DataNode
SecondaryNameNode
NameNode
2、测试是否hdfs正常
放一个文件到hdfs中
hdfs dfs -put LICENSE.txt /
查看是否在
hdfs dfs -ls /
3、观察HDFS网页
http://localhost:50070/
sbin/stop-dfs.sh
万一要重新部署,需要删掉之前的文件,然后再namenode格式化,然后再启动。
需要删除的文件路径 (${hadoop.tmp.dir}默认是在/tmp/hadoop-${user.name})
1、namenode目录
${hadoop.tmp.dir}/dfs/name
2、datanode目录
${hadoop.tmp.dir}/dfs/data
3、secondarynamenode目录
${hadoop.tmp.dir}/dfs/namesecondary
....
其实最终只要删除
${hadoop.tmp.dir}和/tmp/hsperfdata_${user.name}
mapreduce本身就是hadoop组件,可以在yarn上部署,同时也来验证后面的yarn运行情况。在etc/hadoop/mapred-site.xml 配置
<property>
<name>mapreduce.framework.namename>
<value>yarnvalue>
property>
在etc/hadoop/yarn-site.xml配置
<property>
<name>yarn.nodemanager.aux-servicesname>
<value>mapreduce_shufflevalue>
property>
sbin/start-yarn.sh
1、输入jps 看到
resourceManager
nodemanager
2、打开网址
http://localhost:8088/
···
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.1.jar pi 5 10
检测
1、命令输完后会显示 Running job: job_xxxx_0001 (扩展一下 xxx 其实是unix时间戳)
2、打开网页http://localhost:8088/ 看到有job在运行
···
vi /etc/rc.local
最后增加一行
#Hadoop
su - hadoop -c "/home/hadoop/app/hadoop-2.8.1/sbin/start-all.sh"
jps是JDK 1.5提供的一个显示当前所有java进程pid的命令,简单实用,非常适合在linux/unix平台上简单察看当前java JVM进程的一些简单情况。不是所有的java进程都能用jps显示pid,只有符合接口的才可以。大数据组件都可以。
jps有一个假死的问题,是出现 - process information unavailable问题后。
1、真的死了,进程真的死了,2、假死了,进程没有死,进程还在工作。这两种怎么区分呢。先 ps -ef | grep xxx(pid) 看是否存在,如果不存在,可以去该/tmp/hsperfdata_xxx下删除和进程号相同的文件夹。那怎么知道是哪个用户下,就是说哪个xxx下,先 ll /tmp/hsperfdata_*,然后挨个找呗。如果存在进程,当前用户查看就是不可用,怎么办,就 ps -ef | grep xxx(pid) 第一列下就是该切换的用户,切换用户jps。
生产上有一些场景比较特殊,比如你一台机器可能部署两个hadoop,那这个时候就有些问题了,当你要杀死某一个datanode,发现ps下有多个datanode进程,怎么区分呢。其实在默认的/tmp/下有对应的文件存储对应程序的pid。名字叫hadoop-xxx-datanode.pid。
生产上这个pid文件是不能放到/tmp里的,因为一个月后tmp会被清一次。需要更改环境变量${HADOOP_PID_DIR}。