zoukankan      html  css  js  c++  java
  • Hadoop

    =========================Hadoop目录==============================
    bin:一些普通执行脚本
    sbin:系统执行脚本,包含启动,停止的脚本
    included:跟本地库相关的一些文件
    etc:配置文件
    lib:老版本的hadoop的话放jar,新版的则用来放本地库。
    share:存放大量的java jar包,用来实现功能(用hadoop来写应用程序),share文件夹里面是doc 和 hadoop两个文件夹,doc里面是英文文档,可以删掉来加快速度,hadoop里面就是功能jar包。share/hadoop 里面是以工程分类的,包括如下工程:
    =========================Linux机器记录============================
    虚拟机(笔记本):
    [hadoop-0]:hostname:hadoop-0 password:hadoop
    [hadoop-1]:hostname:hadoop-1 password:hadoop
    公司电脑:
    [hadoop-0]:hostname:hadoop-0 password:hadoop

    ======================搭建虚拟机环境==========================
    1.配置网络:
    VMware在window中生成的那个虚拟网的网关和window是的真实网卡没有任何关系:

    VMware会在windows中提供两个虚拟网卡(VMnet1和VMnet8),如下图

    如果想让VMware中的虚拟机(Linux)和本地的windows通信,则必须保证虚拟机和虚拟网卡在同一网段。所以我们需要做如下设置:
    1.1在VMware中设置网关
    进入vmware的菜单,Edit->VirtualNetworkEditor
    GATEWAY:192.168.2.1
    Subnet IP:192.168.2.0     
    NETMASK:255.255.255.0
    修改成功后,可以查看本地系统的网络,VMware的虚拟网卡(VMnet8),应该已经同步到了。


    1.2设置虚拟网卡
    windows中的VMnet8网卡也要设置成同一网段(如下图)

    1.3设置Linux的网络
            如果是刚刚新建的Linux,则右键网络图标,选择Edit connections,选择IPv4,新建一个manual的静态IP
            如果不是新建的Linux,则可以直接通过setup 命令进行修改    //编辑ifcfg-eth0文件(vi /etc/sysconfig/network-scripts/ifcfg-eth0)
            192.168.2.100    255.255.255.0   192.168.2.1   8.8.8.8
            然后重启网络:service network restart
            ping {网关} ping {linux ip}    ping {百度},如果拼通了,则说明成功了!


    2.设置虚拟机
    2.1开启sshd service,切换到ScureCRT去操作Linux
            进入root:su
            开启sshd:service sshd start
            运行ScureCRT,连接linux,hostname填ip地址
    2.2给用户加sudo权限(让普通用户可以执行admin权限的任务):
            增加sudoers文件的写权限: su           chmod u+w /etc/sudoers
            在"root All=(ALL)ALL"下面加 {user name} All=(ALL)ALL: vi /etc/sudoers 
            去掉sudoers文件的写权限:sudo chmod u-w /etc/sudoers
    2.3禁用图形界面:
            sudo vi /etc/inittab 将id改成3.
    2.4设置sshd service为开机启动项
            检查自启动列表:chkconfig --list
            设置sshd开机启动:sudo chkconfig sshd on
    2.5修改hostname(有两种方式)(由于未来会有多个host,不能都叫locahost,所以要改成hadoop-0之类的名字)
            方式一:改配置文件,但是得重启之后才生效。
            修改network配置文件:sudo vi /etc/sysconfig/network  
            重新启动虚拟机之后:可以看到[hadoop@localhost ~]变成[hadoop@hadoop-0 ~]
            方式二:、
            命令修改 :sudo hostname {hostname}
            退出客户端:exit
            重新连接客户端(SecureCRT):可以看到效果
    2.6修改主机名和IP的映射关系(想要通过hostname访问这台机器,就得做IP映射)
            修改hosts文件:sudo vi /etc/hosts 192.1668.2.100 hadoop-0
            验证:ping {host name},如果ping通了,则成功了
       
        查看防火墙:
            查看 service iptables status    
            关闭 service iptables stop    
            查看防火墙开机启动状态:chkconfig iptables --list    
            关闭开机启动:chkconfig iptables off
        重启Linux:
            reboot 
        查看sshd service 状态:
            sudo service sshd status    启动sshd service:sudo service sshd start
        启动secureCRT,点击Quick connection。(hostname要写成ip)

    3.安装JDK
    3.1上传JDK:
        在SecureCRT中按 Alt+p,打开SFTP窗口,然后输入命令:put {文件路径/文件名}
    3.2创建app文件夹:
            mkdir app
    3.3解压JDK到app文件夹
            tar -zxvf jdk-7u65-linux-i586.tar.gz -C app/
            -z:解压编码
             x:解压
            v:打印
            f:文件
            -C:解压的目的地
    3.4配置环境变量:
            在profile文件(/etc/profile末尾加上以下变量,这个profile文件配置好了以后,对每个用户都生效而不仅仅是当前用户。
                export JAVA_HOME=/home/hadoop/app/jdk-7u_65-i585    (javahome 的路径可以先进到app文件里面的jdk文件,然后用命令 pwd 打印出完整路径,然后复制就行了)
                export PATH=$PATH:$JAVA_HOME/bin
            如果写变量时不记得jdk路径了,则按Esc键退出编辑模式,然后Shift+;,然后输入cd,然后输入文件夹开头字符,然后按Tab键智能提示。
    3.5刷新配置:
            source /etc/profile
    3.6检验配置成功:
            回到根目录:cd    验证:java

    4.安装Hadoop
        4.1上传:
            在SecureCRT中按 Alt+p,打开SFTP窗口,然后输入命令:put {文件路径/文件名}
        4.2解压:
            tar -zxvf {文件名} -C app/
        4.3修改Hadoop的配置
           进入/home/hadoop/app/hadoop-2.4.1/etc/hadoop。
           修改下面的几个文件:
                    第一个:hadoop-env.sh(环境变量)
    位置 : # The java implementation to use. 下面已经有一个缺省的JAVA_HOME变量
                            修改:export JAVA_HOME=/{JDK路径}/java/jdk1.6.0_45
                            如果不记得JDK的路径了,在SecureCRT的session tab上右键,选择克隆一个session,输入echo $JAVA_HOME,就可以查出来了,然后鼠标选中,转到原来的session tab 右键就可以复制了
    第二个:core-site.xml(启动时需要读这个配置文件)
    <configuration>
    <!-- 指定HDFS的namenode的通信地址 -->
    <property>
    <name>fs.defaultFS</name>
    <value>hdfs://{主机名}:9000/</value>
    </property>
    <!-- 指定hadoop运行时产生文件的存放目录,如果不记得路径了,输入pwd可以查看完整路径-->
    <property>
    <name>hadoop.tmp.dir</name>
    <value>/home/hadoop/app/hadoop-2.4.1/data/</value>
    </property>
    </configuration>
    第三个:hdfs-site.xml(启动时需要读这个配置文件)
    <configuration>
    <!-- 配置HDFS副本的数量 -->
    <property>
    <name>dfs.replication</name>
    <value>1</value>
    </property>
    </configuration>
    第四个:mapred-site.xml(启动时需要读这个配置文件)(需要改文件名,mapred-site.xml 原始名加了template,需要去掉,如果不去掉,hadoop将不会读取。命令:mv mapred-site.xml.template mapred-site.xml)
    <configuration>
    <!-- 指定你的mapreduce程序,应该放到哪个资源调度集群上面去跑。资源调度负责把你的程序的jar,分发,分配给你运行的虚拟机。如果不指定为yarn,则程序只会在本地跑,那么将变成单机版程序,则变得无意义 -->
    <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
    </property>
    </configuration>        
                     第五个:yarn-site.xml(启动时需要读这个配置文件)
    <configuration>
    <!-- 指定yarn的老大resourcemanager的地址-->
    <property>
    <name>yarn.resourcemanager.hostname</name>
    <value>{主机名}</value>
    </property>
    <!--reduce获取数据的方式,map出的中间结果怎么传递给reduce,采用哪种机制传,目前只有shuffle这种机制-->
    <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
    </property>
    </configuration>        
                    第6个:slaves(datanode的hostname)
                            cd /home/hadoop/app/hadoop-2.4.1/etc/hadoop
                            vi slaves

    4.4将hadoop添加到环境变量
    vim /etc/profile
    export JAVA_HOME=/home/hadoop/app/jdk1.7.0_65
    export HADOOP_HOME=/home/hadoop/app/hadoop-2.4.1
    export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
    source /etc/profile
    4.5格式化HDFS
    hadoop namenode -format
            验证:log的倒数第5行:Storage directory /tmp/hadoop-hadoop/dfs/name has been successfully formatted.             
                              文件夹 /home/hadoop/app/hadoop-2.4.1/data/dfs/name/current 将生成,并且包含如下文件(name 文件夹就是namenode,namenode将去读这个name文件夹):
                                   
    文件名描述
     fsimage_0000000000000000000
    fsimage就是“元数据”:hdfs里面的某一个目录,某一个文件对应的有哪些切块,那些切块分别存放在哪些datanode主机上面?这些东西就是元数据,namenode管理着这些信息,namenode将这些信息就存在namenode自己运行的那台主机的data/dfs/name/current文件夹下面的这个fsimage文件里面。
    fsimage_0000000000000000000.md5

    seen_txid

    VERSION

                                                                              
    4.6启动hadoop
        (进入sbin文件夹,如果你已经将sbin加入到了环境变量,则可以不用进去)
        不用启动 start-all.sh,因为all太大了
        我们可以只需要启动dfsyarn就可以:
        4.6.1 启动dfs(可以修改slaves文件来指定datanode的地址):
            4.6.1.1 启动namenode,登录到namenode的主机(这里我们是伪分布式,所以它会登陆自己)去启动namenode。由于namenode是在配置文件里面配置的,所以程序自己namenode主机的地址。
            4.6.1.2 启动datanode,(Q: 我们没有在配置文件里面配置datanode主机的地址,它是怎么知道地址的呢?A:在/home/hadoop/app/hadoop-2.4.1/etc/hadoop/salves文件中定义了需要启动datanode的hostname,默认为localhost,我们可以将其改成真实的hostname,当有多台机器时,可以配置多个hostname
            4.6.1.3 启动second namenode

        4.6.2 启动yarn
            4.6.2.1 启动daemons
            启动resourcemanager
            启动nodemanager(读取salves文件里面的hostname 列表去登陆host,然后启动每一个host上面的nodemanager,这样的启动有个好处就是,只要在一个主机配置好了机群里面的机器,就可以通过ss登陆去启动集群里面的机器上的进程,不必再去一个一个的登陆host再启动,但是这种方式也有一个缺点,那就是你得不断的输入密码,如果集群里面有大量的机器,那么这样手动的输入密码不但麻烦,而且如果程序等不及,有可能已经timeout了,集群将不能协作了)。

    4.7验证集群是否启动成功
    用jps命令查看进程(不包括jps应该有5个):
    NameNode
    SecondaryNameNode
    DataNode
    JobTracker
    TaskTracker
    还可以通过浏览器的方式验证
    http://192.168.1.110:50070 (hdfs管理界面)
    http://192.168.1.110:50030 (mr管理界面)
    在这个文件中添加linux主机名和IP的映射关系
    C:WindowsSystem32driversetc
    3.配置ssh免登陆
    生成ssh免登陆密钥
    ssh-keygen -t rsa
    执行完这个命令后,会生成两个文件id_rsa(私钥)、id_rsa.pub(公钥)
    将公钥拷贝到要免登陆的机器上
    cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
        
    虚拟机的虚拟网络图.png


    =======================hdfs和mapreduce测试=======================
    hadoop内置了一个jetty 的文本容器,所以有个web 服务可供我们访问。
    1. 在本地访问hadoop的web服务
        1.1 配置window的hosts(C:WindowsSystem32driversetc
            1.1.1 加入{ip} {hostname}。例如:192.168.2.100 hadoop-0
        1.2 访问http://{hostname}:50070
        1.3 上传文件:hadoop fs -put {file name} hdfs://hadoop-0:9000/
        1.4 下载文件:hadoop fs -get hdfs://hadoop-0:9000/{file name}    
        1.5 运行demo程序:
              cd /home/hadoop/app/hadoop-2.4.1/share/hadoop/mapreduce
              hadoop jar hadoop-mapreduce-examples-2.4.1.jar pi 5 5
    =======================hdfs实现机制=======================

    1.hdfs是通过分布式集群来储存文件,不过hadoop为使用者提供了一个便捷的虚拟目录,即:hdfs://{host name}:9000/ ,客户端只需要访问这个虚拟目录就可以访问文件了,不需要知道文件的block文件具体存放在哪里。这些查数据和拿数据的工作,已经被hadoop封装好了
    2.文件存储到hdfs集群中时会切成小块(block)存放到若干个datanode节点上
    3.hdfs文件系统中的文件与真实的block文件之间的映射关系由namenode管理
    4.每个block在集群中会存储多个副本,这样可以提高数据的可靠性和访问的吞吐量






















  • 相关阅读:
    7-41 PAT排名汇总 (25分)--排序
    7-40 奥运排行榜 (25分)--sort()排序,结构体,前驱
    7-39 魔法优惠券 (25分)--sort()
    7-38 寻找大富翁 (25分)--sort()
    7-37 模拟EXCEL排序 (25分)--优先队列
    python网络编程--socketserver 和 ftp功能简单说明
    python网络编程--FTP上传文件示例
    python网络编程--粘包解决方案 和 subprocess模块
    python网络编程--socket,网络协议,TCP
    python -- 模块和包
  • 原文地址:https://www.cnblogs.com/tonyzeng/p/7596630.html
Copyright © 2011-2022 走看看