因公司项目打算往Hadoop方向走,也打算正式的学习一下。第一次在工作中听到Hadoop还是在4年前,当时我们公司的一个技术大拿跟我说有时间可以考虑学习一下Hadoop。当时所在的是属于为国企提供软件服务的小公司,其所需的技术含量和处理的数据量感觉完全跟所谓的“大数据”挂不上勾.后面从该公司来到深圳之后进入现在的公司,才正式的接触到亿级以上的数据量的处理。也正是从接触这种亿级以上的数据量的处理时才真正的对所谓的性能优化有所了解和学习。采用的是传统的IOE架构,在日常工作中经常因程序运行性能问题而需分析和优化Oracle的执行计划、索引等问题。随着公司业务量增长和前端数据结构方式变更,数据量猛增,慢慢的Oracle已经表现得非常吃力。平时的运维成本也逐步增加(最主要是调优)。因此打算引入Hadoop来解决其中一部分非常耗时和重要的分析型计算。
本文采用RedHat Linux 6.5 32位操作系统安装最新版本的Hadoop 2.7.3.(这里一开始就隐藏了一个天坑,后续会介绍)
1、安装Redhat6.5
1、按照正常步骤安装好Redhat6.5(选择base server,mini后面需要手动安装的程序包太多,Desktop安装了太多无用的程序包)
2、安装完只有需要配置自动挂载安装镜像文件,然后配置yum本地库指向挂载目录。具体步骤:(可解决后面程序需要安装的软件包,此步骤不是hadoop安装成功的必要条件,可以在需要安装的时候手动挂载)
更多参考:
CentOS7搭建本地yum源服务器
2、安装JDK
1、JDK版本需要在1.7+,本文安装的是JDK1.7
安装步骤:
cd /usr
mkdir java
a)将jdk-8u60-linux-x64.tar.gz拷贝到java目录下
b)解压jdk到当前目录
tar -zxvf jdk-8u60-linux-x64.tar.gz
c)安装完毕为他建立一个链接以节省目录长度
ln -s /usr/java/jdk1.8.0_60/ /usr/jdk.7
d).编辑配置文件,配置环境变量
vim /etc/profile
添加如下内容:
JAVA_HOME=/usr/jdk
CLASSPATH=$JAVA_HOME/lib/
HADOOP_HAOME
PATH=$PATH:$JAVA_HOME/bin:$
export PATH JAVA_HOME CLASSPATH
e)执行source profile
f) 测试java安装是否成功 java -version
3、配置ssh
在hadoop分布式安装(包括伪分布式)过程中需要使用ssh免密码登录,因此需要配置ssh。这步骤如下:
#修改ssh配置
/etc/ssh/sshd_conf
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
$ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa--生成两个文件id_rsa和id_rsa.pub
$cat ~/.ssh/id_rsa.pub > ~/.ssh/authorized_keys--这个名字和配置文件中的名字一致
$chmod g-w authorized_keys-- 修改一下authorized_keys的权限
$ssh localhost-- 测试OK
4、配置环境变量
# JAVA_HOME SET
JAVA_HOME=/usr/jdk1.7
CLASSPATH=$JAVA_HOME/lib/
HADOOP_HOME=/app/hadoop-2.7.3
HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
HADOOP_OPTS='-Djava.library.path=$HADOOP_HOME/lib'
M2_HOME=/app/apache-maven-3.2.5
JRE_HOME=$JAVA_HOME/jre
CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME:/lib:$CLASSPATH
PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$M2_HOME/bin
MAVEN_OPTS='-Xms256m -Xmx512m'
export PATH JAVA_HOME MAVEN_OPTS CLASSPATH HADOOP_COMMON_LIB_NATIVE_DIR HADOOP_OPTS M2_HOME CLASSPATH JRE_HOME
--其中以下两句是为了解决安装过程中出现的Could not resolve hostname now.: Name or service not kn问题
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"
5、配置hadoop
hadoop有三种运行模式:
a)独立(或本地)模式:无需运行任何守护进程,所有程序都运行在同一个JVM上面。适用于MapReudce的测试和调试,在开发阶段比较适合.
b)伪分布式:Hadoop的守护进程会运行在本地机器上,模拟一个小型集群。
c)全分布式: Hadoop守护进程运行在一个集群上面,此模式属于生产环境配置。
本文采用的是伪分布式配置,需要配置以下三个文件($hadoopHome/etc/hadoop):
core-site.xml:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost/</value>
</property>
</configuration>
mapred-site.xml
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>localhost:8021</value>
</property>
</configuration>
hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
6、格式化HDFS文件系统
执行:hadoop namenode -format
7、启动HDFS和MapReduce
执行:start-dfs.sh
start-mapred.sh
此处执行start-dfs.sh的时候就会出现文章开头所说的天坑,警告信息如下:
WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
问题原因:因hadoop的2.7版本的动态链接库文件是64位的,而我的虚拟机装的是32位。查看动态链接库文件信息如下:
[hadoop@hadoop native]$ file libhadoop.so.1.0.0
libhadoop.so.1.0.0: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, not stripped
解决方法:
1、在本地编译hadoop,然后用本地编译的动态链接文件替换掉。或者有其他方法欢迎指教。本地编译方法见我另一篇文章介绍:
2、直接用本地编译的tar包解压,使用本地变异的包
3、但是仍有此警告,程序可以正常运行(重新编译之前不可用)
8、验证是否安装成功:
:8088/cluster
:50070/dfshealth.html#tab-overview
可以正常访问则,可以开始你的hadoop之旅了。
下面关于Hadoop的文章您也可能喜欢,不妨看看: