xiaoxiong's Blog

Happy coding

让配置hadoop2.4.1 集群不在那么难!

xiaoxiong posted @ 2014年11月18日 12:11 in 云计算hadoop , 1534 阅读

路漫漫其修远兮,吾将上下而求索 -----  天道真的会酬勤?

 Hadoop2.4.1的搭建完全过程

《《《《《《《《《《《《《《《《《《《《《《《1》》》》》》》

准备4台机子, 都装上linux的系统,我推荐安装的是 cenos,看硬件吧,有条件的话装centos7,因为这个是64位的,我在实验室所以差一点,装的是centos6.5的,用u盘制作工具将系统做成u盘启动的

《《《《《《《《《《《《《《《《《《《《《《《《《《《《2》》》

装完机子后,用户名统一一下,我用的是root,但在实际环境中,需要自己创建用户,然后在/root下建立hjava文件夹,这样,我的jdk jre hadoop全是放在这里面的

《《《《《《《《《《《《《《《《《《《《《《3》》》》》

  Java的配置,hadoop是java的,在装完centos6.5后,用java –version查看一下,就会发现是openjdk,不想用这个,想用自己的jdk,所以去下载jdk和jre,我下载的是jdk7 和 jre7 版本的,所以先解压, tar  -xvzf  jdk-XXX.tar.gz  ,   tar –xzvf  jre-XXX.tar.gz 运行完着两条命令后,接着变一下文件夹的名字吧,jdk-XXX总觉着太长,用 mv jdk-XXX jdk7  , mv  jre-XXX  jre7 来改变文件夹的名字。改完后就要删除系统中的openjdk了。用  rpm –qa |grep java 查出openjdk的java rpm包,然后用 rpm –e –nodeps @@ 逐渐一一删除,其中@@ 就是刚才pm –qa |grep java 这条命令查出的结果,一般有两条或3条,都删了就可以了,然后 运行 java  -version会发现是空白,这样openjdk就删除干净了。接下来配置自己账户下的jdk。在自己的家目录下,我这里是/root目录,或者直接敲入命令 cd ~ 即可进入自己的家目录,然后 运行 vi  .bashrc ,在文件底部加入 export JAVA_HOME=/root/hjava/jdk7

export JRE_HOME=/root/hjava/jdk7

export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JRE_HOME/lib

export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin   即可,这样 配置后保存,然后敲入source .bashrc使之立即生效。完成后,在命令行敲入java –version来查看自己设置的jdk环境

《《《《《《《《《《《《《《 《《《《《《《4   》》》

配置好java环境后,开始为hadoop做准备了,即联网的准备哦。怎么联网呢? 首先说明,我有四台机子,一台master,叫做xiaoxiong1三台slave,叫做xiaoxiong2 xiaoxiong3 xiaoxiong4。这样,想给他们分配的ipv4是 192.168.8.1  192.168.8.2  192.168.8.3  192.168.8.4这4个ip地址,在vi  /etc/sysconfig/network-scripts/ifcfg-eth0 ,在打开的文件中,注意,DEVICE  TYPE  UUID  HWADDR是不用变的,而且千万别变,然后在这基础上加入或者修改 ONBOOT=yes   BOOTPROTO=static  IPADDR=你想写的IP地址,也就是刚才的ip地址, NETMASK=255.255.255.0弄完这些后保存退出,然后敲入命令 /etc/init.d/network reload使这些改变生效,然后你在运行 ifconfig 查看一下,看变成自己想要的ip没。做完这些后,在 敲入 vi /etc/hosts , 在文件尾部加入

               192.168.8.1  xiaoxiong1

               192.168.8.2  xiaoxiong2

               192.168.8.3   xiaoxiong3

               192.168.8.4  xiaoxiong4

这些是为了在你ssh的时候机器之间能互相认识,这些操作是要在你所有的机子上运行一遍的  切记 , 做完这些           后,可以ping一下主机名,看通了吧,然后关闭你的master也就是xiaoxiong1上的防火墙, 用命令 chkconfig             iptables off,不然从节点上的 nodemanager无法启动

《《《《《《《《《《《《《《《《5》》》》》》》》》》 

 网络弄好后,接下来是ssh的配置,我们使用ssh登录。随便选一台机子,比如我选的是xiaoxiong1,然后敲入 ssh-keygen –t dsa ,然后一路按回车,完后,在你的家目录下的 .ssh 文件夹下,会有生成idXX  和 idXX.pub文件,这个便是传说中的秘钥和公钥。然后运行 ssh-copy-id  -i  idXX.pub  root@主机名,注意是在 .ssh 目录下的,这里的主机名是所有的主机名xiaoxiong1 2 3 4 都要运行一遍刚才的命令,这样,刚才选的xiaoxiong1才可以跟 xiaoxiong1 2 3 4进行ssh免密码登录,在这个过程中,会写 yes 和你要登录主机的密码,写上去回车即可。这样,xiaoxiong1 和4台机子ssh做好的,接着是xiaoxiong2 和其他机子的,以此类推,做完所有机子的ssh,这样,所有机子便可以免密码ssh互通了

《《《《《《《《《《《《《《《《《6》》》》》》》》》》》

做ssh后,便是配置hadoop2.4.1的配置文件了,首先在下hadoop2.4.1,用tar命令解压,解压完后,我的目录用A表示,然后开始进行配置。首先是A/etc/hadoop/salves的配置,就是说这个文件中写入你的salves节点名字即可,我的是 xiaoxiong2  xiaoxiong3  xiaoxiong4 。然后是 hadoop-env.sh文件, 在尾部加入  JAVA_HOME=$JAVA_HOME, 然后是各种hadoop的配置文件,如文件尾,文件有  hdfs-site.xml    core-site.xml  mapred-site.xml   yarn-site.xml 四个

<!--core-site.xml -->

<configuration>
        <property>
        <name>fs.defaultFS</name>
        <value>hdfs://xiaoxiong1:9000</value>
        </property>

        <property>
        <name>io.file.buffer.size</name>
        <value>131072</value>
        </property>

        <property>
        <name>hadoop.tmp.dir</name>
        <value>file:/home/xiaoxiong1/hjava/hadoop-2.4.1/tmp</value>
        <description>Abase for other temporary directories.</description>
        </property>

        <property>
        <name>hadoop.proxyuser.hduser.hosts</name>
        <value>*</value>
        </property>

        <property>
<name>hadoop.proxyuser.hduser.groups</name>
        <value>*</value>
        </property>


</configuration>

<!---- hdfs-site.xml ------------------------------------------->
<configuration>

        <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>xiaoxiong1:9001</value>
        </property>
        <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:/home/xiaoxiong1/hjava/hadoop-2.4.1/name</value>
        </property>
        <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:/home/xiaoxiong1/hjava/hadoop-2.4.1/data</value>
        </property>
        <property>
        <name>dfs.replication</name>
        <value>3</value>
        </property>
        <property>
        <name>dfs.webhdfs.enabled</name>
        <value>true</value>
        </property>

</configuration>
<!-------- mapred-site.xml -------------------------------------------------------->
<configuration>
        <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
        </property>
        <property>
        <name>mapreduce.jobhistory.address</name>
        <value>xiaoxiong1:10020</value>
        </property>
        <property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>xiaoxiong1.19888</value>
        </property>
        </configuration>

<!------ yarn-site.xml --------------------------------->
<configuration>

<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>

<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>

<property>
<name>yarn.resourcemanager.address</name>
<value>xiaoxiong1:8032</value>
</property>

<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>xiaoxiong1:8030</value>
</property>

<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>xiaoxiong1:8031</value>
</property>

<property>
<name>yarn.resourcemanager.admin.address</name>
<value>xiaoxiong1:8033</value>
</property>

<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>xiaoxiong1:8088</value>
</property>

</configuration>





《《《《《《《《《《《《《《《《《《《《《《《《7》  》》》》》》》》》 

 

 配置完这些文件后,把hadoop这个文件的家目录,就刚才解压hadoop-2.4.1.tar.gz的A,复制到其他的节点上去,用scp命令即可,都复制完后,进去master的A目录,进去后执行./bin/hdfs namenode –format , 然后看到INFO common.Storage: Storage   directory /home/wukong/a_usr/hadoop-2.4.1/name has been successfully formatted.说明成功啦,切记不可多次格式化,不然会出现一个 nameID和 dataID 不一样而冲突导致 datanode 无法启动的问题,若出现,就需要看log然后解决了

《《《《《《《《《《《《《《《《《《《《《《《《8》》》》》

启动dfs     在A目录下, 执行 ./sbin/start-dfs.sh,看到一系列的.out说明成功了

启动yarn    A下,./sbin/start-yarn.sh(master节点)   然后敲入jps


master节点:

  1. 8783 NameNode
  2. 8981 SecondaryNameNode
  3. 9759 Jps
  4. 9132 ResourceManager

 

slave节点:

 

  1. 6911 DataNode
  2. 7035 NodeManager
  3. 7281 Jps

说明差不多啦

《《《《《《《《《《《《《《《《《《《《《《9》》》》》》》  

(可以省略这一步)》用eclipse来开发hadoop程序。 首先要明白,eclipse是telnet来连接hadoop的,所以先看一下你的计算机能不telnet master节点。一般的话先去 控制面板----》打开或关闭windows功能,将win7 的telnet功能开启,一般win7作为客户端只要开启telnet的客户端组件功能就ok啦,不需要开启服务端的。在linux下,要开启telnet的服务端,因为telnet是明文发送的,所以centos默认是不安装这个服务的,可以去安装光盘的 packages下找到telnet-server这个rpm文件,然后再找一个xinetd-2.3.14-39.el6_4.i686.rpm的文件,然后在linux中先安装xinetd,用 rpm –i xinetd-2.3.14-39.el6_4.i686.rpm 安装,然后就是telnet-server的安装。装好后,去/etc/xinetd.d/telnet 中修改一下, 将 disable=yes 改成 disable=no, 这样, 重启xinted的服务, 即 service xinetd restart 后, 用Netstat –ntl | grep 23 来查看linux的23号端口开了没,查到了的话就代表开启23的端口了。 一般而言, linux是禁止root通过telnet来登录的,可以去/etc/securetty 末尾加上 pts/0     pts/1 ,然后保存,这样的话可用 root登录了。然后回到 win7中, ping一下,可以ping通的,但是telnet就是没反应,死活通不了,后来才想到,是ip的问题。是的,win7下去给 本地连接 设置一个 ip去吧, 是 192.168.8.5,跟你的linux要在同一个网段上的, 掩码 255.255.255.0,其他的不填,这样的话再去 dos中跑一下telnet命令,就会出现可以登录的情况,至此,断断续续的高了一礼拜才弄完了,但是这时候,我已经将hadoop从集群点上删除了,因为手贱,点错了,导致hadoop的datanode节点无法启动,需要重装了,诶,晕死了,慢不慢来

《《《《《《《《《《《《《10》》》》

通过上面的,telnet应该能与linux连接了,主要就是将win7的ip放到集群的ip网段中就好了。然后就开始制作eclipse-hadoop的插件了,网上教程很多的。

@首先是 从  github上面下载eclipse-hadoop2.x 的源码,然后在eclipse中通过ant反编译成 jar插件。Github的网址是

https://github.com/winghc/hadoop2x-eclipse-plugin, 这上面右边导航树点击 download zip 就能下载 到hadoop2x-eclipse-plugin 了,下载完后,解压,然后在

eclipse新建一个普通的java project,将刚才下载的eclipse-hadoop2.x 包的 hadoop-eclipse2X-pulin\hadoop2x-eclipse-plugin-master\src\contrib\eclipse-plugin

中的

META-INF(文件夹)

Resources(文件夹)

src(文件夹)

build.properties

plugin.xml

build.xml  

6个文件往项目里复制,build.xml会出错,粘贴下面的代码改掉build.xml中的前5个属性,这里build。Xml中已经修改过了,

Build.xml代码如下

<?xml version="1.0"?>

<project name="eclipse-plugin" default="jar">



    <property name="jdk.home" value="G:/jdk/jdk1.6.0" />

    <property name="hadoop.version" value="2.4.1" />

    <property name="hadoop.home" value="G:/hadoop/hadoop-2.4.1" />

    <property name="eclipse.version" value="3.7" />

    <property name="eclipse.home" value="G:/MyEclipse10/Common" />



    <property name="root" value="${basedir}" />

    <property file="${root}/build.properties" />



    <property name="name" value="${ant.project.name}" />

    <property name="src.dir" location="${root}/src/java" />



    <property name="build.contrib.dir" location="${root}/build/contrib" />

    <property name="build.dir" location="${build.contrib.dir}/${name}" />

    <property name="build.classes" location="${build.dir}/classes" />



    <!-- all jars together -->

    <property name="javac.deprecation" value="off" />

    <property name="javac.debug" value="on" />



    <property name="build.encoding" value="ISO-8859-1" />



    <path id="eclipse-sdk-jars">

        <fileset dir="${eclipse.home}/plugins/">

            <include name="org.eclipse.ui*.jar" />

            <include name="org.eclipse.jdt*.jar" />

            <include name="org.eclipse.core*.jar" />

            <include name="org.eclipse.equinox*.jar" />

            <include name="org.eclipse.debug*.jar" />

            <include name="org.eclipse.osgi*.jar" />

            <include name="org.eclipse.swt*.jar" />

            <include name="org.eclipse.jface*.jar" />

            <include name="org.eclipse.team.cvs.ssh2*.jar" />

            <include name="com.jcraft.jsch*.jar" />

        </fileset>

    </path>



    <path id="project-jars">

        <fileset file="${build.dir}/lib/*.jar" />

    </path>



    <target name="init" unless="skip.contrib">

        <echo message="contrib: ${name}" />

        <mkdir dir="${build.dir}" />

        <mkdir dir="${build.classes}" />

        <mkdir dir="${build.dir}/lib" />

        <copy todir="${build.dir}/lib/" verbose="true">

            <fileset dir="${hadoop.home}/share/hadoop/mapreduce">

                <include name="hadoop*.jar" />

                <exclude name="*test*"/>

                <exclude name="*example*"/>

            </fileset>

            <fileset dir="${hadoop.home}/share/hadoop/common">

                <include name="hadoop*.jar" />

                <exclude name="*test*"/>

                <exclude name="*example*"/>

            </fileset>

            <fileset dir="${hadoop.home}/share/hadoop/hdfs">

                <include name="hadoop*.jar" />

                <exclude name="*test*"/>

                <exclude name="*example*"/>

            </fileset>

            <fileset dir="${hadoop.home}/share/hadoop/yarn">

                <include name="hadoop*.jar" />

                <exclude name="*test*"/>

                <exclude name="*example*"/>

            </fileset>

            <fileset dir="${hadoop.home}/share/hadoop/common/lib">

                <include name="protobuf-java-*.jar" />

                <include name="log4j-*.jar" />

                <include name="commons-cli-*.jar" />

                <include name="commons-collections-*.jar" />

                <include name="commons-configuration-*.jar" />

                <include name="commons-lang-*.jar" />

                <include name="jackson-core-asl-*.jar" />

                <include name="jackson-mapper-asl-*.jar" />

                <include name="slf4j-log4j12-*.jar" />

                <include name="slf4j-api-*.jar" />

                <include name="guava-*.jar" />

                <include name="hadoop-annotations-*.jar" />

                <include name="hadoop-auth-*.jar" />

                <include name="commons-cli-*.jar" />

                <include name="netty-*.jar" />

            </fileset>

        </copy>

    </target>



    <target name="compile" depends="init" unless="skip.contrib">

        <echo message="contrib: ${name}" />

        <javac fork="true"  executable="${jdk.home}/bin/javac" encoding="${build.encoding}" srcdir="${src.dir}" includes="**/*.java" destdir="${build.classes}" debug="${javac.debug}" deprecation="${javac.deprecation}" includeantruntime="on">

            <classpath refid="eclipse-sdk-jars" />

            <classpath refid="project-jars" />

        </javac>

    </target>



    <target name="jar" depends="compile" unless="skip.contrib">



        <pathconvert property="mf.classpath" pathsep=",lib/">

            <path refid="project-jars" />

            <flattenmapper />

        </pathconvert>



        <jar jarfile="${build.dir}/hadoop-${hadoop.version}-eclipse-${eclipse.version}-plugin.jar" manifest="${root}/META-INF/MANIFEST.MF">

            <manifest>

                <attribute name="Bundle-ClassPath" value="classes/,lib/${mf.classpath}" />

            </manifest>

            <fileset dir="${build.dir}" includes="classes/ lib/" />

            <fileset dir="${root}" includes="resources/ plugin.xml" />

        </jar>

    </target>





    <target name="clean">

        <echo message="contrib: ${name}" />

        <delete dir="${build.dir}" />

    </target>



</project>

具体代码见http://www.cnblogs.com/zxub/p/3884030.html

里面描述的。改完后 在build.xml上右击 ,然后ant运行,生成插件,刷新项目,就可以看见生成的插件了。将 生成的插件放到eclipse 的 puilgn 中,重启eclipse,这时候若没有看到map/reduce插件,说明eclipse在偷懒,没有进行刷新,这时候删去eeclipse工作区里面的.metadata 文件夹,然后重启eclipse,这样就会看到了。

@@然后在 eclipse 的 window ---》 preference 中,找到右面功能树的hadoop map/reduce ,添加hadoop的目录,这里hadoop的目录就是你在linux中集群hadoop家目录的一个备份,把它弄到这里来,我用的是 psftp(属于putty的一种,putty可以去http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html 下载) 的 get功能

@@@然后去eclipse的视图里面打开 map/reduce 视图,新建一个连接,这里面,Location name可任意填写,Mapreduce Master中Host为resourcemanager机器ip,Port为resourcemanager接受任务的端口号,即yarn-site.xml文件中yarn.resourcemanager.scheduler.address配置项中端口号。DFS Master中的Host为namenode机器ip,Port为core-site.xml文件中fs.defaultFS配置项中端口号。配置好后,在eclipse 中还看不到节的话, 看看你的hdfs系统中有没上传文件,一般在集群点上传几个文件,在eclipse中就会看到的。这样,eclipse已经远程连接到hadoop了,接下来就是开始第一个 wordCount程序了,待续。。。。

 

Avatar_small
Maharashtra 11th Que 说:
2022年8月16日 21:51

Every year, this board administers the 11th grade test, and the Maha 11th Important Question Paper for this examination will soon be available on the Maharashtra Board's official website. Around 15 lakh students took part in the Maharashtra Board Class 11th examinations, which were likewise held in the month of February starting in March 2023. Maharashtra 11th Question Paper 2023 The Maharashtra Board Class 11th Important Question Paper 2023 was released in the month of May 2023. According to a poll, Maharashtra 11th Important Question Paper 2023 is expected to be released in May of this year as well. We advise all students to be patient and wait for the release of the Important Question Paper 2023.

Avatar_small
Emma 说:
2023年1月23日 19:55

Accidentally I have come across this website and little bit confused about the details you have shared here. This post deals real estate marketing Anoka with the details regarding how to make it easier to configure hadoop2.4.1 clusters! I am looking here to more updates regarding that and keep sharing more details here.


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter