centos7下hadoop环境搭建
实验目的:
为5台主机搭建hadoop平台,为之后hbase做准备。
实验步骤:
0x01硬件条件:
5台centos7主机,IP地址:x.x.x.46~50。机器的名称分别为lk,node1,node2,node3,node4。
实验条件默认使用root账户,有需要切回普通用户的情况我会提到。
0x02材料准备
- hadoop安装包
官网下载地址:http://www.apache.org/dyn/closer.cgi/hadoop/common/hadoop-2.7.3/hadoop-2.7.3-src.tar.gz - JAVA环境
由于centos7自带java环境,所以只需要配置JAVA_HOME即可。
- 首先输入命令
[root@lk ~]# which java
返回:/usr/bin/java
- 之后输入
[root@lk ~]# ls -lrt /usr/bin/java
返回:lrwxrwxrwx. 1 root root 22 4月 29 2015 /usr/bin/java -> /etc/alternatives/java
- 之后输入:
[root@lk ~]# ls -lrt /etc/alternatives/java
返回lrwxrwxrwx. 1 root root 74 4月 29 2015 /etc/alternatives/java -> /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.79-2.5.5.1.el7_1.x86_64/jre/bin/java
- 之后编辑:
[root@lk ~]# vim /etc/profile
添加如下内容:
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/bin
export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.79-2.5.5.1.el7_1.x86_64
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH:$HADOOP_HOME/bin
- 使之生效:
[root@lk ~]# source /etc/profile
- 以后可以验证一下:
[root@lk ~]# echo $JAVA_HOME
返回:/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.79-2.5.5.1.el7_1.x86_64
代表成功生效
以上配置对本实验失效了。。。原因是openjdk的结构和普通的jdk包结构不太一样,导致有些hadoop有些地方找不到路径
正确配置如下:
- 在jdk的官网上找一款下载:http://www.oracle.com/technetwork/java/javase/downloads/index.html
- 解压到/usr/jdk-9.0.1。
- 配置环境变量:
vim /etc/profile
add:
export JAVA_HOME=/usr/jdk-9.0.1/
export CLASSPATH=$JAVA_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$PATH:$HADOOP_HOME/bin
- 使之生效:
source /etc/profile
0x03环境搭建
- 将下载的hadoop包解压缩在
/usr/hadoop-2.7.3
目录下。
解压后目录为/usr/hadoop-2.7.3/hadoop/
- 创建如下文件夹
mkdir /usr/hadoop-2.7.3/tmp
mkdir /usr/hadoop-2.7.3/var
mkdir /usr/hadoop-2.7.3/dfs
mkdir /usr/hadoop-2.7.3/dfs/name
mkdir /usr/hadoop-2.7.3/dfs/data
- 设置环境变量:
vim /etc/profile
- 写入:
export HADOOP_HOME=/usr/hadoop-2.7.3/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
- 使之生效:
source /etc/profile
- hadoop配置
- 进入$HADOOP_HOME/etc/hadoop目录,配置 hadoop-env.sh等。涉及的配置文件如下:
hadoop/etc/hadoop/hadoop-env.sh
hadoop/etc/hadoop/yarn-env.sh
hadoop/etc/hadoop/core-site.xml
hadoop/etc/hadoop/hdfs-site.xml
hadoop/etc/hadoop/mapred-site.xml
hadoop/etc/hadoop/yarn-site.xml
hadoop/etc/hadoop/slaves
具体修改如下: 配置hadoop-env.sh
# The java implementation to use.
#export JAVA_HOME=/home/graph/Desktop/java
export JAVA_HOME=${JAVA_HOME}
-
配置yarn-env.sh
需要修改JAVA_HOME的路径不能直接用$JAVA_HOME
需要把具体路径敲上去。
# some Java parameters
# export JAVA_HOME=/home/y/libexec/jdk1.6.0/
export JAVA_HOME=/usr/jdk-9.0.1/
-
配置core-site.xml
add:
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/hadoop-2.7.3/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
<property>
<name>fs.default.name</name>
<value>hdfs://lk:9000</value>
</property>
</configuration>
注意修改路径和地址。
-
配置hdfs-site.xml
add:
<property>
<name>dfs.name.dir</name>
<value>/usr/hadoop-2.7.3/dfs/name</value>
<description>Path on the local filesystem where theNameNode stores the namespace and transactions logs persistently.</description>
</property>
<property>
<name>dfs.data.dir</name>
<value>/usr/hadoop-2.7.3/dfs/data</value>
<description>Comma separated list of paths on the localfilesystem of a DataNode where it should store its blocks.</description>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
<description>need not permissions</description>
</property>
</configuration>
-
配置mapred-site.xml
add:
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>lk:49001</value>
</property>
<property>
<name>mapred.local.dir</name>
<value>/usr/hadoop-2.7.3/var</value>
</property>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
-
配置yarn-site.xml
add:
<configuration>
<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>10.113.10.46:8099</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>lk</value>
</property>
<property>
<description>The https adddress of the RM web application.</description>
<name>yarn.resourcemanager.webapp.https.address</name>
<value>${yarn.resourcemanager.hostname}:8090</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>${yarn.resourcemanager.hostname}:8031</value>
</property>
<property>
<description>The address of the RM admin interface.</description>
<name>yarn.resourcemanager.admin.address</name>
<value>${yarn.resourcemanager.hostname}:8033</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>1537</value>
<discription>每个节点可用内存,单位MB,默认8182MB</discription>
</property>
<property>
<name>yarn.nodemanager.vmem-pmem-ratio</name>
<value>2.1</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
</configuration>
- 配置slaves文件:
vim slaves
node1
node2
node3
node4
- 配置其他所有节点机器:由于lk是namenode,其余4台为datanode,所以除了最后一步配置slaves,其余完全相同,可以使用
scp -r /usr/hadoop-2.7.3/ xxx@x.x.x.x:~/
完全复制过来。注意台机器还需要配置java环境。 - 最后调整权限,我们是在root权限下进行修改操作,之后需要退回到普通用户权限,但是普通用户默认是不可以修改usr文件夹内容的,所以将
hadoop-2.7.3
文件夹整体提权.
具体权限如下:sudo chown xxx:xxx -R hadoop-2.7.3/
对每台机器都操作一次。
0x04 Hadoop 启动测试
x.x.x.47~50的机器是datanode,不需要进行其他操作,以下在namenode下进行:
- 进入bin目录,初始化:
./hadoop namenode -format
如果如图所示,没有报错,就说明初始化成功 - 退出bin目录,进入sbin,执行:
./start-all.sh
- 如果是首次启动,系统会问yes/no,回答yes即可。
- 之后输入jps查看,主节点:
24816 ResourceManager
24387 NameNode
27619 Jps
24635 SecondaryNameNode
slaves节点:
27955 NodeManager
30564 Jps
27816 DataNode
- 如果结果如上所示,说明成功。
- 进入网页:
x.x.x.46:8088
查看工作节点 - 进入网页:
x.x.x.46:50070
查看概述
0x05错误提示:
- 首先如果jps 其他节点发现没有datanode的话说明配置有问题,可以去子节点的目录下logs文件夹里
hadoop-qsb-datanode-xxx.log
查看出错原因。我这里出现过2次错误,如果有相同问题的话可以直接参照修改。
首先是复制过去的时候新建的那几个文件夹里要空的,如果有东西的话需要手动删除。
其次是权限问题,如果遇到如无法访问的报错的话试着重新执行一遍指令:sudo chown xxx:xxx -R hadoop-2.7.3/
- 诶还有实例需要跑呀,那随便跑一下吧,然后boom,,,运行一个search的实例,具体命令如下:
hadoop dfs -mkdir input //创建input文件夹有的童鞋可能需要加上-p
hadoop dfs -put /usr/hadoop-2.7.3/hadoop/etc/hadoop/*.xml input //倒入一些文件进去
hadoop dfs -ls input //查看一下文件
hadoop jar ../share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar grep input output 'dfs[a-z.]+' //筛选出格式为dfs*的字符串
hadoop dfs -ls output
hadoop dfs -cat output/part-r-00000 //查看输出文件
然后第一次报这个错误:
17/11/17 09:10:24 INFO mapreduce.Job: map 0% reduce 0%
17/11/17 09:10:35 INFO mapreduce.Job: map 20% reduce 0%
17/11/17 09:10:36 INFO mapreduce.Job: map 60% reduce 0%
17/11/17 09:10:38 INFO mapreduce.Job: map 80% reduce 0%
17/11/17 09:10:43 INFO mapreduce.Job: map 100% reduce 0%
17/11/17 09:10:48 INFO mapreduce.Job: map 100% reduce 7%
17/11/17 09:13:40 INFO mapreduce.Job: Task Id : attempt_1510879394295_0002_r_000000_0, Status : FAILED
Error: org.apache.hadoop.mapreduce.task.reduce.Shuffle$ShuffleError: error in shuffle in fetcher#2
可以看到啊,哪个map应该是没啥毛病,然后reduce在7%卡住了,然后过一会报下面的错误,百度一下发现是内存爆炸,结合我当时在yarn-site.xml
里的配置:
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>2048</value>
<discription>每个节点可用内存,单位MB,默认8182MB</discription>
</property>
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>2048</value>
</property>
好吧是我的虚拟机太渣了,把第一段去掉,第二段的2048改成1537(最小1536),再试一次成功。
输出应该如下:
17/11/17 20:58:37 INFO mapreduce.Job: map 0% reduce 0%
17/11/17 20:59:15 INFO mapreduce.Job: map 67% reduce 0%
17/11/17 20:59:37 INFO mapreduce.Job: map 100% reduce 0%
17/11/17 20:59:40 INFO mapreduce.Job: map 100% reduce 100%
17/11/17 20:59:42 INFO mapreduce.Job: Job job_1510923270204_0002 completed successfully
17/11/17 20:59:43 INFO mapreduce.Job: Counters: 50
...
下面是一些统计信息
...
实例跑起来应该没什么问题了吧,之后又问题再改。
对输出如下:
2 dfs.replication
1 dfsadmin
1 dfs.permissions
1 dfs.name.dir
1 dfs.data.dir