hadoop运行环境搭建
森哥/洋哥hadoop系列,非常适合初学者:
1 Hadoop运行环境搭建
1.1 单机伪分布式环境
1.1.1 系统信息
Linux版本:
1.1.2 准备工作
1.1.2.1 安装jdk7.0
1.1.2.2 配置/etc/profile
增加以下配置项,然后执行source /etc/profile
#set java environment
export JAVA_HOME=/opt/java/
exportCLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
exportPATH=$JAVA_HOME/bin:$PATH
#for hadoop
exportHADOOP_HOME=/home/hadoop-2.7.1
exportPATH=$PATH:$HADOOP_HOME/bin
exportPATH=$PATH:$HADOOP_HOME/sbin
1.1.2.3 修改Linux机器名
- 执行hostname master命令,其中master是要修改的机器名
- 修改/etc/sysconfig/network文件,如下所示:
- 修改/etc/hosts,如下所示
1.1.2.4 ssh无密码验证配置
- 在本地主机生成密钥对
ssh-keygen -t rsa
执行以上命令并一直回车,生成一个密钥对:id_rsa(私钥文件和id_rsa.pub(公钥文件。默认被保存在~/.ssh/目录下。
- 将公钥追加到 authorized_keys 文件中
cat ~/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys (自己与自己交换密钥)
1.1.2.5 关闭系统防火墙
通过以下方式查看防火墙是否关闭,如果出现以下结果,则说明防火墙没关闭:
如果结果如下:
则说明防火墙已经关闭了。
注:还有一种查看防火墙是否关闭的方式,即使用命令:chkconfig--list | grep iptables
如下所示则说明防火墙已经关闭:
以下场景则说明防火墙没有关闭:
以下提供三种方式关闭防火墙:
(1) chkconfig --level 2345 iptablesoff 或 chkconfig iptables off
(2) service iptables stop
(3) 关闭方式如下图:
这三种方式,只有第一种是永久关闭,(2)与(3)只要机器重启,则又需要重新去关闭。
关闭防火墙之后的场景如下图:
搭建Hadoop时一定要记得关闭防火墙,不然会出现一些很诡异的问题。
1.1.2.6 分区【非必要操作,除非搭环境时用到分区】
parted -s /dev/sdb mkpartdata 0 898G(修改为实际的大小)
如此会报下面的警告:
Warning: The resultingpartition is not properly aligned for best performance.
但用下面的语句来分区时,并不会报上面的警告了
parted -s /dev/sdb mkpartdata 2048s 100%
知识点扩展-->>
如果要把/dev/sdb划分为四个相等大小的分区,可如下操作:
parted /dev/sdc
mkpart primary 2048s 25%
mkpart primary 25% 50%
mkpart primary 50% 75%
mkpart primary 75% 100%
备注:执行parted /dev/sdb后 print(显示分区信息),rm(删除分区)
1.1.2.7 创建文件系统【非必要操作】
mkfs.ext4 /dev/sdb1
1.1.2.8 创建并挂载目录【非必要操作】
mkdir /data
mount /dev/sdb1 /data [临时挂载]
echo "/dev/sdb1 /srv/smartcare ext4 defaults 1 2">> /etc/fstab [永久挂载]
1.1.2.9 下载并解压hadoop安装包
tar -xvf hadoop-2.7.1.tar.gz
1.1.3 修改配置文件
1.1.3.1 hadoop-env.sh
vim hadoop-env.sh增加以下配置项:
exportJAVA_HOME=/usr/java/jdk1.7.0_21
1.1.3.2 core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://169.10.35.123:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/hadoop-2.7.1/tmp</value>
</property>
</configuration>
1.1.3.3 hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/hadoop-2.7.1/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/data/data1</value>
</property>
</configuration>
1.1.3.4 mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
1.1.3.5 yarn-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
1.1.4 启动Hadoop
- 格式化Hadoop
在命令行执行 hdfs namenode -format
- 启动Hadoop
在命令行执行 tart-all.sh
1.1.5 查看Hadoop安装
- Jps命令
[root@lsn hadoop-2.6.0]# jps
6215 Jps
6037 ResourceManager
5623 NameNode
5743 DataNode
5898 SecondaryNameNode
6132 NodeManager
- hdfs dfsadmin –report
- hdfs web界面
通过master_IP:50070访问hdfs的web界面,如下所示:
通过该web界面能获取到很多的hdfs集群信息,平时多用用,大有帮助。
1.1.6 常见问题
原因是hadoop-2.6.0.tar.gz安装包是在32位机器上编译的,64位的机器加载本地库.so文件时出错,不影响使用。
可用如下方式解决:
1、重新编译源码后将新的lib/native
替换到集群中原来的lib/native
2、修改hadoop-env.sh ,增加
export HADOOP_OPTS="-Djava.library.path=$HADOOP_PREFIX/lib:$HADOOP_PREFIX/lib/native"
1.2 分布式集群环境
1.2.1 操作系统安装
1.2.1.1 系统盘做raid1
重启系统,按提示按按Ctrl+H,进入WebBIOS,给系统盘做raid1 (
参数项 参数值
RAID Level 1
Strip Size 64KB
Access RW
Read Normal
Default Write Write Through
Current Write Write Through
Disable BGI No
Disk Cache Disable
I/O Direct
),之后重启;
1.2.1.2 安装Linux操作系统
在系统盘上安装操作系统【略】
1.2.1.3 启用硬盘jbod模式
重启系统,当提示按ctrl+H或者ctrl+y进行选择时,按crtl+y 进入输入命令的界面,启用硬盘位jbod模式-adpsetprop -enablejbod -1 -a0(附:禁用jbod模式命令 -adpsetprop -enablejbod -0 -a0),之后再重启。
1.2.1.4 硬盘分区、创建文件系统
parted -s /dev/sdb mklabelgpt //gpt,对大于2T的硬盘分区
parted -s /dev/sdb mkpartdata 2048s 100%
mkfs.ext4 /dev/sdb1 //格式化,创建文件系统
mount /dev/sdb1 /data1 //挂载硬盘
echo "/dev/sdb1 /srv/smartcare ext4 defaults 1 2">> /etc/fstab //设置永久挂载
1.2.2 系统环境配置
1.2.2.1 配置/etc/hosts
修改/etc/hosts文件,配置子节点ip
1.2.2.2 配置SSH
1) 在本地主机生成密钥对
ssh-keygen -t rsa
这个命令生成一个密钥对:id_rsa(私钥文件和id_rsa.pub(公钥文件。默认被保存在~/.ssh/目录下。
2) 将公钥添加到远程主机的 authorized_keys 文件中
将文件上传到远程主机中
scp ~/.ssh/id_rsa.pubroot@192.168.21.8:/root/
SSH到登陆到远程主机,将公钥追加到 authorized_keys 文件中
cat /root/id_rsa.pub>> /root/.ssh/authorized_keys
注:cat ~/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys (自己与自己交换密钥)
1.2.2.3 关闭系统防火墙
编写并执行以下脚本,可批量关闭集群防火墙:
#! /bin/bash
ALL_CLIENTS=`cat /etc/hosts| grep "193.168.1" | awk '{print $2}'`
CLIENTS=""
for client in $ALL_CLIENTS
do
echo "==================close iptablesat $client=================="
ssh $client " chkconfig --level 2345iptables off "
ssh $client " service iptables stop"
done
1.2.2.4 关闭selinux
编写并执行以下脚本,可批量关闭集群selinux:
#! /bin/bash
ALL_CLIENTS=`cat /etc/hosts| grep "193.168.1" | awk '{print $2}'`
CLIENTS=""
for client in $ALL_CLIENTS
do
echo "=====set close selinux at$client,need restart server======"
ssh $client " sed -i"s/SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config "
echo "=====close selinux at $client,noneed restart server======"
ssh $client " setenforce 0 "
done
1.2.2.5 调整最大文件句柄数
编写并执行以下脚本,可批量调整集群最大文件句柄数群:
#! /bin/bash
ALL_CLIENTS=`cat /etc/hosts| grep "169.10.35" | awk '{print $2}'`
CLIENTS=""
for client in $ALL_CLIENTS
do
echo "======set/etc/security/limits.conf at $client ======="
ssh $client " echo '* soft nofile65536' >> /etc/security/limits.conf "
ssh $client " echo '* hardnofile 65536' >> /etc/security/limits.conf "
ssh $client " echo '* soft nproc131072' >> /etc/security/limits.conf "
ssh $client " echo '* hard nproc131072' >> /etc/security/limits.conf "
echo "=====set /etc/security/limits.d/90-nproc.confat $client ======"
ssh $client " echo '* soft nproc131072' >> /etc/security/limits.d/90-nproc.conf "
ssh $client " echo '* hard nproc131072' >> /etc/security/limits.d/90-nproc.conf "
done
1.2.2.6 打开磁盘预读
重启系统,按提示按按Ctrl+H,进入WebBIOS,给系统盘做raid1 (
编写并执行以下脚本,可批量打开集群磁盘预读:
#! /bin/bash
ALL_CLIENTS=`cat /etc/hosts| grep "169.10.35" | awk '{print $2}'`
CLIENTS=""
for client in $ALL_CLIENTS
do
echo "=====set disk ahead read in/etc/rc.local file at $client ====="
ssh $client " echo '/sbin/blockdev--setra 16384 /dev/sd*' >> /etc/rc.local "
done
1.2.2.7 关闭大页内存(THP)
RedHat6操作系统中需关闭大页内存(THP):
echo never >/sys/kernel/mm/redhat_transparent_hugepage/enabled
1.2.2.8 配置nmon【非必要操作】
在命令行执行crontab –e,然后配置:
0 */1 * * * nmon -f -m/opt/nmonResult/ -t -r test -s 3 -c 1200
1.2.3 集群环境配置
1.2.3.1 安装jdk
在集群的各个节点上安装jdk,如下所示:
1.2.3.2 修改Hadoop配置文件
在Hadoop主节点上修改Hadoop集群配置文件hadoop-env.sh、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml与slaves
在hadoop-env.sh配置文件中,只需修改jdk的路径配置就行了,如下所示:
exportJAVA_HOME=/usr/java/jdk1.7.0_25
core-site.xml参考配置如下:
yarn-site.xml参考配置如下:
mapred-site.xml参考配置如下:
hdfs-site.xml参考配置如下:
slaves参考配置如下(集群节点名称):
这些配置文件中需要修改<configuration>标签内的一些属性配置,特别提醒一下的是IP以及一些目录需要按照实际安装环境做相应修改。
最后将主节点上的Hadoop安装包以及hadoop的各配置文件拷贝到各slave节点,需要注意的是slave节点的jdk版本以及各种目录配置最好与主节点保持一致,要不然则需要在slave节点上修改以上各个配置文件。
1.2.3.3 配置Hadoop集群节点
修改slaves配置文件,如果主节点也作为从节点使用,则可以配置为:
如果主节点不作为从节点使用,则可以配置为:
1.2.3.4 设置ntp服务
- 先在Hadoop的主节点设置正确的时间:
date -s month/day/year (修改年月日,例如date -s 11/15/2012)
date -s hh:mm:ss (修改时分秒,例如date -s 10:10:10)
hwclock –w (将设置的时间固化,不受系统重启的影响)
- 在Hadoop主节点创建ntp服务器
根据需要考虑是否需修改/etc/ntp.conf文件
chkconfig ntpd on
service ntpd start
- 在各子节点上设置定时ntp同步
执行crontab –e然后配置定时ntp,如下为一个例子:
0 */1 * * * root ntpdate 169.10.35.32
1.2.3.5 启动Hadoop集群
- 在主节点上,格式化hdfs名字节点:
hdfs namenode –format
- 启动hadoop集群:
start-all.sh
1.2.4 集群环境清理
1、 关闭hadoop集群
2、 清理/tmp目录
3、 清理数据目录中的文件 /data*/
4、 清理内存:echo 3 >/proc/sys/vm/drop_caches
1.3 搭环境常见问题
1.3.1.1 主节点的datanode进程启动不了
解决方案:
- 清除主节点的元数据目录(name)内容、数据目录(data)内容、/tmp目录内容以及
日志目录内容。
- 清除从节点的数据目录(data)内容、日志目录内容以及/tmp目录内容。
- 重新格式化名字节点:hdfs namenode –format
- 启动hadoop集群
1.3.1.2 java.net.BindException
启动HDFS(start-dfs.sh)时,namenode与datanode的log日志报java.net.BindException,如下所示:
这往往是因为端口被占用导致的,可以采用Linux命令:lsof -i:50010 查看端口的占用情况,如下所示:
也可以使用netstat命令查看端口的占用情况:
然后关闭端口即可.
1.3.1.3 java.net.ConnectException
启动yarn时NodeManager日志报java.net.ConnectException,具体报错信息如下:
报以上重连日志一段时间后,最后报以下异常:
解决办法:在yarn的配置文件yarn-site.xml中增加以下配置项:
然后重启yarn进程就可以了。
1.3.1.4 运行mapreduce程序报错
报错信息如下所示:
hadoop日志文件hadoop-root-datanode-slave2.log
中还报以下异常:
报错原因是因为hadoop集群中有机器没有关闭防火墙,把之关闭就可以了。
备注:在此提供一个测试hadoop集群网络是否异常的java socket程序,client与server端代码如下所示:
Server.java
Client.java
将代码分别放在两台机器上运行则可以测试网络是否故障,先运行server端,再运行client端,都是比较简单的java代码,在此就不做解释了。
Javac Server.java javaServer
1.3.1.5 Yarn平台运行mapreduce程序导致虚拟内存溢出
问题现象1:=>运行mapreduce程序时直接卡死
查看hadoop日志文件hadoop-root-nodemanager-slave3.log报如下错误信息:
一种解决方案:修改yarn-site.xml配置文件,增加以下配置项:
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
该配置项的意思是:是否启动一个线程检查每个任务正使用的虚拟内存量,如果任务超出分配值,则直接将其杀掉,默认是true
网上解决方案参考:
http://stackoverflow.com/questions/21005643/container-is-running-beyond-memory-limits
http://blog.chinaunix.net/uid-28311809-id-4383551.html
- ASP.NET MVC如何实现自定义验证(服务端验证+客户端验证)
- .NET Core的文件系统[2]:FileProvider是个什么东西?
- Python多线程怎样优雅的响应中断异常
- .NET Core的文件系统[3]:由PhysicalFileProvider构建的物理文件系统
- .NET Core的文件系统[4]:由EmbeddedFileProvider构建的内嵌(资源)文件系统
- 学习July博文总结——支持向量机(SVM)的深入理解(下)
- 在gridview和datagrid里设置列宽
- ASP.NET MVC的Model元数据与Model模板:将”ListControl”引入ASP.NET MVC
- .NET Core的文件系统[5]:扩展文件系统构建一个简易版“云盘”
- 全球15%工作将被自动化,中国1亿人将面临失业
- ASP.NET MVC的Model元数据提供机制的实现
- 清官难断家务事,人工智能却来介入家庭伦理大戏
- 使用Symfony的Console组件构建命令行程序
- 微软编程教育都在搞什么?从code.org到makecode,从Minecraft到Micro:bit
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PHP fclose函数用法总结
- Python collections.defaultdict模块用法详解
- PHP crc32()函数讲解
- python读取图像矩阵文件并转换为向量实例
- PHP echo()函数讲解
- Python3开发环境搭建详细教程
- php使用QueryList轻松采集js动态渲染页面方法
- PHP convert_uudecode()函数讲解
- php实现在线考试系统【附源码】
- 实例介绍PHP中zip_open()函数用法
- php实现数字补零的方法总结
- PHP配置ZendOpcache插件加速
- 详解php用static方法的原因
- phpinfo无法显示的原因及解决办法
- 在php的yii2框架中整合hbase库的方法