hadoop 2.7.3 源码分析(一):环境搭建

回头想想自己学习大数据相关的技术已经有很长的时间了,在这段时间里主要学习了hadoop、zookeeper、hbase、kafka、flume、spark、storm等等,有一些在工作当中使用到了(比如zookeeper、hadoop)就比较熟悉但大部分都是浅尝辄止没有做深入的研究学习。
hadoop作为时下流行的大数据处理框架,其使用范围广,开发社区活跃。在国内很多大型公司如京东、百度、阿里等都使用hadoop处理其离线数据。很多大型公司都会根据其业务需求修改hadoop源码完成一些定制化的功能,所以作为开发人员深入的学习hadoop源码还是非常有价值的。
那么怎么学习源码呢?关于这个问题我先讲讲我工作当中遇到的一件事情,前段时间公司有一个需求是使用zookeepe监控hadoop的所有节点(NameNode、DateNode),当时我的想法是相应节点启动的时候去zookeepe相关目录下注册一个临时节点,这就需要去研究一下他的源代码。首先查看它的启动脚本start-dfs.sh 在它的第63行看到他启动另外一个脚本bin/hdfs 传入了一些参数(start namenode $nomeStartOpt)。然后我们打开bin/hdfs,在第135行我们可以看到其定义一个CLASS=’org.apache.hadoop.hdfs.server.namenode.NameNode’,最后我在hadoop-hdfs-project这个工程下找到这个类定位其main函数(1552行),在main函数中调用createNameNode创建namenode节点,所以如果需zookeeper中注册该节点的话只需要createNameNode调用成功后创建节点就OK。至此我就突然明白,其实学习源代码的方法很简单,你只需要顺着程序流程进行学习就可以。你从函数的入口读到其出口那么你就读懂了,查看你的修改是否生效,你可以简单的System.out.println(“hello world”)然后重新编译,执行,查看其是否正确输出 “hello world”以印证自己的想法。
通过这件事情我就对自己如何学习源码有了一些思路,在一个最小、最简单的环境下(对hadoop来说就是搭建伪分布式)学习其各个模块的源码,最后再拓展到复杂环境。
自己的博客内容根据自己学习的进度进行更新,有时候有人会问为什么要写博客呢?我觉得得主要是出于以下几个方面的考虑

  • 知识积累,加深印象。回头想想我从高中毕业开始,在编程方面学了很多东西,语言方面很早之前学的c、c++、汇编,以及现在工作中使用的java、python。技术方法,很早之前学的windows MFC,驱动程序编程,rootkit,单片机程序开发,JSP,Spring,hibernate,总之就是五花八门,但是现在回头想想,我都学了些什么呢?如果工作当中需要其中某一方面的知识应该在哪里去找呢?对于这些问题如果当时可以根据自己学到的内容整理一些文章出来的话就好了,如果用到就可以快速上手,而不需要重新学习。
  • 梳理思路。作为知识积累的方式不仅仅可以写博客还可以做笔记,但是大部分情况下笔记记录的信息较为零碎,没有一个整体的思路(你记笔记不会写一些自已为什么要学习这个、学习这个有什么好处这些信息吧?),但写博客不同,写博客需要有一个整体的思路,你要让别人看懂,你就必须把你学习背景、学习细节交待清楚,这样不仅仅是方便别人阅读,同时也方便自己以后快速查阅。
  • 锻炼表达书写能力。这点毋庸质疑了,如果你一篇博客都没写过。你可以写一个试试,你就会发现自已真的会感觉到词穷。
  • 分享自己的知识。当然也许自己的知识不是那么准确或者仅适用于自己,但那也没关系啊,又不会吃亏(-_-!)

环境搭建

接下来进入正题,首先要准备开发环境。

1、软件环境

以下为我本地的环境
- 操作系统:Ubuntu Desktop 16.04
- JDK:1.8
- ssh
- hadoop版本:2.7.3
- mvn

2、安装过程

安装jdk

将下载到的jdk-8u111-linux-x64.tar.gz 解压并复制到/opt/local目录下,在/etc/profile中添加以下内容

export JAVA_HOME=/opt/local/jdk1.8.0_111
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

执行命令使其生效

$source /etc/profile

安装配置mvn

同样将下载到的apache-mvn-3.3.9-bin.tar.gz解压后复制到/opt/local目录下,在/etc/profile中添加

export PATH=$PATH:/opt/local/apache-maven-3.3.9/bin

执行source命令,使其生效
修改其配置文件,在其conf目录下修改settings.xml
可以在第55行下添加

<localRepository>/home/alven/Workspace/Maven/repository</localRepository>

(上述目录是我自己本地的目录大家可以根据自己需要随便更改,但是要注意运行mvn的用户必须要对其具有读写权限)

编译hadoop源码

在编译hadoop源码之前我们需要先安装protobuf-2.5.0(2.7.3版本的hadoop要求是protobuf的版本必须是2.5.0),所以我们解压下载到的protobuf-2.5.0.tar.gz,进入其根目录执行

$./configure --prefix=/opt/local/protobuf
$make
$make install

我们可以在/opt/local/protobuf目录下看看是否正确生成,如果正确修改环境变量,在/etc/profile中添加

export PATH=$PATH:/opt/local/protobuf/bin

执行source命令,使其生效
通过以下命令查看其版本以及是否生效

$protoc --version
libprotoc 2.5.0

接下来就可以对hadoop的源码进行编译了。
解压下载到的hadoop-2.7.3.-src.tar.gz 进入其要目录执行

$mvn package -Pdist -DskipTests -Dtar

在经过一段时间后如果不报错就说明编译好了。

搭建伪分布式hadoop集群并运行简单测试

1、创建相应用户

$addgroup hadoop#添加hadoop组
$adduser --ingroup hadoop hadoop #将用记hadoop添加到组hadoop中
$passwd hadoop  #修改密码

修改/etc/sudoers 在root ALL=(ALL) ALL下添加一行
hadoop ALL=(ALL) ALL
强制保存并推出(使用w!)

2、安装ssh并配置免密登录

$apt-get install openssh-server #安装ssh
$su hadoop #切换当前用户
$ssh-keygen -t rsa -P '' #注意执行此命令时当前用户需要是hadoop
$cat /home/hadoop/.ssh/id_rsa.pub >> /home/hadoop/.ssh/authorized_keys
$/etc/init.d/ssh reload

使用命令

$ssh localhost

看是免密登录是否生效

3、配置hadoop

解压我们在下载的hadoop-2.7.3.tar.gz,修改配置文件
1)配置hadoop-env.sh

# The java implementation to use.
#export JAVA_HOME=${JAVA_HOME}
export JAVA_HOME=/usr/java/jdk1.7.0_79
2)配置yarn-env.sh

#export JAVA_HOME=/home/y/libexec/jdk1.7.0/
export JAVA_HOME=/usr/java/jdk1.7.0_79
3)配置core-site.xml
添加如下

<configuration>
 <property>
    <name>fs.default.name</name>
    <value>hdfs://localhost:9000</value> 
</property>

<property>
    <name>hadoop.tmp.dir</name>
    <value>/data/data/hadoop</value>

</property>
</configuration>

配置hdfs-site.xml
添加如下配置

<configuration>
<property>
    <name>dfs.name.dir</name>
    <value>/data/data/hadoop/hdfs/name</value>
  </property>

<property>
    <name>dfs.data.dir</name>
    <value>/data/data/hadoop/hdfs/data</value>
</property>

<property>
    <name>dfs.replication</name>
    <value>1</value>    
</property>
</configuration>

5),配置mapred-site.xml
添加如下配置:

<configuration>
<property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
</property>
</configuration>

6),配置yarn-site.xml
添加如下配置:

<configuration>
<property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
</property>
<property>
        <name>yarn.resourcemanager.webapp.address</name>
        <value>localhost:8099</value>
</property>
</configuration>

最后我们将配置好的hadoop放到/home/hadoop/local/hadoop目录下并且修改/etc/profile 在其后添加

export PATH=$PATH:/home/hadoop/local/hadoop-2.7.3/bin:/home/hadoop/local/hadoop-2.7.3/sbin

执行source命令使其生效

4、运行测试

格式化namenode


$hadoop namenode -format #格式化namenode

$start-dfs.sh  #启动hdfs

运行简单mapreduce 测试

$mkdir input   #创建一个目录
$cd input
$echo "hello world" >test1.txt  #新建一个文件test1.txt 内容为hello world
$echo "hello hadoop">test2.txt #新建一个文件test2.txt 内容为 hello hadoop


$hdfs dfs -put ../input /in  # 将input 目录上传到hdfs中的/in目录


$cd /home/hadoop/local/hadoop-2.7.3/share/hadoop/mapreduce #切换到包含我们要执行的jar文件的目录 
$hadoop jar hadoop-mapreduce-examples-2.7.3.jar wordcount /in /out #执行单词统计mapreduce

$hdfs dfs -cat /out/* #查看输出结果 以下为输出结果 可以看出总共有两个单词hello 1个单词hadop 1个单词world

hadoop 1
hello 2
world 1

到这里我们整个的伪分布式的搭建就完成了。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

iblks

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值