• Hadoop数据分析平台项目实战(基于CDH版本集群部署与安装)


    1、Hadoop的主要应用场景:
      a、数据分析平台。
      b、推荐系统。
      c、业务系统的底层存储系统。
      d、业务监控系统。

    2、开发环境:Linux集群(Centos64位)+Window开发模式(window10,64位操作系统)。
       使用技术:hadoop,hbase,hive,flume,oozie,sqoop,nginx,tomcat,spring,mybatis,springmvc,mysql等等。Hdfs为海量的数据提供存储,MapReduce为海量的数据提供计算。
         此项目使用CDH(Cloudera Distribution Hadoop)版本,是Cloudera公司对其商业化改进和更新,CDH官网:http://cloudera.com

    3、开发版本:

      a、hadoop2.5.0-cdh5.3.6版本;

      (之前cdh版本下载地址:http://archive.cloudera.com/cdh5/cdh/5/或者http://archive.cloudera.com/cdh4/cdh/4/),cdh版本的文档:http://archive.cloudera.com/cdh5/cdh/5/hadoop-2.5.0-cdh5.3.6/

      如果是在apache的官网下载之前的版本,地址如下所示:http://archive.apache.org/dist/hadoop/common/,文档查看如:http://hadoop.apache.org/docs/

      b、hbase-0.98.6-cdh5.3.6版本。

      c、zookeeper-3.4.5-cdh5.3.6版本。

    4、Hadoop集群分布式(完全分布式模式)环境搭建:

    安装步骤:
        a、创建用户,使用hadoop用户,注意自己配置好自己的网络,这点很重要。
            步骤(注意root用户密码):
                1)、使用useradd hadoop添加用户。
                2)、使用passwd hadoop设置用户密码,密码为hadoop;
                3)、给用户赋予使用sudo命令的权限。
                4)、chmod u+w /etc/sudoers。
                5)、vim /etc/sudoers。由于root用户对此文件也没有修改权限,所以先赋予权限,修改完毕再删除权限。
                6)、在root ALL=(ALL)ALL下面加上一行如下所示:
                    hadoop ALL=(ALL)ALL。注意,分隔的是制表符。
                7)、chmod u-w /etc/sudoers。
        b、修改主机名以及ssh免密码登陆。
            注意:由于以后操作都是使用hadoop用户,所以必须使用hadoop用户登陆进行免密码配置,但是使用root还不是免密码登陆的。
            步骤(使用hadoop用户登陆):
                1)、使用sudo hostname slaver1修改主机名,当前生效,重启后失效。
                2)、使用sudo vim /etc/sysconfig/network修改主机名,重启生效。
                3)、在sudo vim /etc/hosts文件中添加主机名称对应的ip地址。
                    注意,将其他集群的主机名称和对应的Ip地址都添加到三台机器,不然无法ping通。
                    192.168.19.131 slaver1
                    192.168.19.132 slaver2
                    192.168.19.133 slaver3
                4)、使用ssh-keygen -t rsa生成ssh密钥。
                    注意:普通用户生成的密钥对是在~/.ssh目录下面,root用户是在/root/.ssh目录下面,一定区分清楚。
                5)、进入.ssh文件夹,创建authorized_keys文件,并且将id_rsa.pub的内容添加到文件中去,修改文件权限为600(必须)
                    注意:普通用户是在~/.ssh目录下。root用户是在/root/.ssh目录下面。
                    [hadoop@slaver1 .ssh]$ scp authorized_keys slaver2:~/.ssh/
                    [hadoop@slaver1 .ssh]$ scp authorized_keys slaver3:~/.ssh/
                6)、ssh slaver1验证是否配置免密码登陆成功。
                    ssh slaver2
                    ssh slaver3
        c、jdk的安装。
            1)、复制jdk的tar压缩包到/home/hadoop/package文件夹中。
            2)、解压缩操作:
                [hadoop@slaver1 package]$ tar -zxvf jdk-7u79-linux-x64.tar.gz -C /home/hadoop/soft/
            3)、创建软连接(可创建或者不创建,创建软连接,方便记忆):
                [hadoop@slaver1 package]$ sudo ln -s /home/hadoop/soft/jdk1.7.0_79/ /usr/local/jdk
            4)、配置相关的环境变量:
                针对用户生效:[hadoop@slaver1 package]$ vim ~/.bash_profile
                全局生效(此处使用这个):[hadoop@slaver1 package]$ sudo vim /etc/profile
                    在文件最下面添加如下所示内容:
                    export JAVA_HOME=/home/hadoop/soft/jdk1.7.0_79
                    export PATH=$PATH:$JAVA_HOME/bin
            5)、保存文件,使环境变量生效:
                [hadoop@slaver1 package]$ source /etc/profile
            6)、验证jdk是否安装成功:
                [hadoop@slaver1 package]$ java
                [hadoop@slaver1 package]$ javac
                [hadoop@slaver1 package]$ java -version
                [hadoop@slaver1 package]$ javac -version
        d、hadoop的安装。
            步骤:
                1)、下载hadoop安装包并复制到/home/hadoop/package文件夹中。
                2)、解压缩操作。并创建数据保存文件hdfs。
                    [hadoop@slaver1 package]$ tar -zxvf hadoop-2.5.0-cdh5.3.6.tar.gz -C /home/hadoop/soft/
                    [hadoop@slaver1 hadoop-2.5.0-cdh5.3.6]$ mkdir hdfs
                3)、配置hadoop-env.sh,mapred-env.sh,yarn-env.sh文件。
                    hadoop-env.sh文件修改如下所示:
                        export JAVA_HOME=/home/hadoop/soft/jdk1.7.0_79
                        完全分布式需要指定hadoop的pid路径:
                        export HADOOP_PID_DIR=/home/hadoop/soft/hadoop-2.5.0-cdh5.3.6/hdfs/tmp
                    yarn-env.sh文件修改如下所示:    
                        export JAVA_HOME=/home/hadoop/soft/jdk1.7.0_79
                        由于没有默认的,所以手动创建:
                        export YARN_PID_DIR=export HADOOP_MAPRED_PID_DIR=/home/hadoop/soft/hadoop-2.5.0-cdh5.3.6/hdfs/tmp
                    mapred-env.sh。
                        export HADOOP_MAPRED_PID_DIR=/home/hadoop/soft/hadoop-2.5.0-cdh5.3.6/hdfs/tmp
                4)、配置基本环境变量core-site.xml文件。
                    <configuration>
                    <!-- 指定HADOOP所使用的文件系统schema(URI),HDFS的老大(NameNode)的地址,master即是namenode所在的节点机器,9000是端口号,NameNode是为客户提供服务的,NameNode知道每一个文件存在哪一个datanode上面 -->
                            <property>
                                    <name>fs.defaultFS</name>
                                    <value>hdfs://slaver1:9000</value>
                                    <--<value>hdfs://slaver1:8020</value>-->
                            </property>
                            <!-- 指定hadoop运行时产生文件的存储目录 -->
                            <property>
                                    <name>hadoop.tmp.dir</name>
                                    <value>/home/hadoop/soft/hadoop-2.5.0-cdh5.3.6/hdfs/tmp</value>
                            </property>
                    </configuration>
                5)、配置hdfs相关变量hdfs-site.xml文件。
                    <configuration>
                        <!-- 指定HDFS副本的数量,副本的数量,避免一个机器宕掉了,数据丢失,默认是3个副本 -->
                        <property>
                            <name>dfs.replication</name>
                            <value>2</value>
                        </property>
                        <property>
                            <name>dfs.namenode.name.dir</name>
                            <value>/home/hadoop/soft/hadoop-2.5.0-cdh5.3.6/hdfs/name</value>
                        </property>
                        <property>
                        <name>dfs.namenode.data.dir</name>
                        <value>/home/hadoop/soft/hadoop-2.5.0-cdh5.3.6/hdfs/data</value>
                        </property>
                        <!-- 指定SecondNameNode在那台机器上面启动 -->
                        <property>
                            <name>dfs.secondary.http.address</name>
                            <value>slaver1:50090</value>
                        </property>
                    </configuration>
    
                6)、配置mapred相关环境变量mapred-site.xml文件。
                    复制操作:
                        [hadoop@slaver1 hadoop]$ cp mapred-site.xml.template mapred-site.xml;
                    修改内容如下所示:    
                        <configuration>
                        <!-- 指定mr运行在yarn上,即mapreduce运行在yarn上面 -->
                            <property>
                                 <name>mapreduce.framework.name</name>
                                 <value>yarn</value>
                            </property>
    
                        </configuration>    
                7)、配置yarn相关环境变量yarn-site.xml文件。
                    <configuration>
                        <!-- Site specific YARN configuration properties -->
                        <!-- 指定YARN的老大(ResourceManager)的地址,这个地方主要看自己的机器分配情况,如果是四台机器,这个value值就>是第四台的主机名称哦, -->
                        <property>
                            <name>yarn.resourcemanager.hostname</name>
                            <value>slaver1</value>
                        </property>
                        <!-- reducer获取数据的方式 -->
                        <property>
                            <name>yarn.nodemanager.aux-services</name>
                            <value>mapreduce_shuffle</value>
                        </property>
                    </configuration>
    
                8)、配置datanode相关变量slaves文件。
                    slaver2
                    slaver3
                9)、配置hadoop相关环境变量。
                    export JAVA_HOME=/home/hadoop/soft/jdk1.7.0_79
                    export HADOOP_HOME=/home/hadoop/soft/hadoop-2.5.0-cdh5.3.6
                    export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
                    刷新配置文件:
                        [hadoop@slaver1 hadoop]$ source /etc/profile
                    验证是否配置成功:
                        [hadoop@slaver1 hadoop]$ hadoop version
                10)、将slaver1机器上面的hadoop复制到slaver2机器和slaver3机器:
                    [hadoop@slaver1 soft]$ scp -r hadoop-2.5.0-cdh5.3.6/ slaver2:/home/hadoop/soft/
                    [hadoop@slaver1 soft]$ scp -r hadoop-2.5.0-cdh5.3.6/ slaver3:/home/hadoop/soft/
                11)、hadoop的启动步骤:
                    a、第一次启动hadoop之前需要格式化namenode节点,命令为hadoop namenode -format:
                        [hadoop@slaver1 soft]$ hadoop namenode -format
                    b、两个方式启动start-all.sh或者start-dfs.sh,start-yarn.sh。
                        [hadoop@slaver1 soft]$ start-all.sh
                        或者:
                        [hadoop@slaver1 soft]$ start-dfs.sh
                        [hadoop@slaver1 soft]$ start-yarn.sh
                    c、查看是否启动成功。
                        注意:启动过程中出现slaver1主节点的ResourceManager未启动异常情况,解决方法是在yarn-site.xml文件中修改如下所示,注意,slaver1是主节点的主机名称:
                            <property>
                                <name>yarn.resourcemanager.hostname</name>
                                <value>slaver1</value>
                            </property>
                        验证如下所示,然后查看节点的启动情况,通过jps命令查看hadoop的进程是否启动:
                            [hadoop@slaver1 hadoop]$ jps
                            [hadoop@slaver2 hadoop]$ jps
                            [hadoop@slaver3 hadoop]$ jps
                        网页查看如下所示,查看web界面是否显示正常信息内容:
                            查看分布式文件系统,http://slaver1:50070/
                            查看MapReduce,http://slaver1:8088/
                验证hadoop对应的yarn(mapreduce)框架是否启动成功,直接运行hadoop自带的example程序即可;
                  [hadoop@slaver1 hadoop]$ echo "i like learn bigdata!" >> /home/hadoop/data_hadoop/test.txt
                  [hadoop@slaver1 hadoop]$ hadoop dfs -put /home/hadoop/data_hadoop/test.txt /
                  [hadoop@slaver1 hadoop]$ hadoop dfs -ls /
                  [hadoop@slaver1 mapreduce]$ hadoop jar hadoop-mapreduce-examples-2.5.0-cdh5.3.6.jar wordcount /test.txt /output
                  注意:如果上面执行失败或者卡着不动,检查是否是进程宕掉了。
                  [hadoop@slaver1 mapreduce]$ hadoop fs -cat /user/hadoop/output/part-r-00000查看统计的内容;

     5、Hadoop Shell命令简单描述:

    hadoop的shell命令主要分为两类,一类是启动命令,一类是控制和操作命令(hdfs/mapred/yarn)。其中启动命令位于sbin目录下面,控制和操作命令主要位于bin目录下面。其实最终的启动命令也是调用控制命令来进行集群服务的启动,区别在于启动命令中需要使用ssh的相关命令来控制其他机器启动服务,而控制和操作命令主要是直接调用hadoop提供的服务类接口。
    1)、查看hdfs可以跟的命令,查看hadoop可以跟的命令:
        [hadoop@slaver1 mapreduce]$ hdfs    
        [hadoop@slaver1 mapreduce]$ hadoop
    2)、hdfs命令(hdfs dfs),和hadoop命令,显示文件夹的内容:
        [hadoop@slaver1 mapreduce]$ hadoop fs -ls /
        如果递归显示文件夹的内容如下所示-lsr是递归显示:
        [hadoop@slaver1 mapreduce]$ hadoop fs -lsr /
        [hadoop@slaver1 mapreduce]$ hdfs dfs -ls /
        如果递归显示文件夹的内容如下所示-lsr是递归显示:
        [hadoop@slaver1 mapreduce]$ hdfs dfs -ls -R /
        [hadoop@slaver1 mapreduce]$ hdfs dfs -lsr /    
    3)、hdfs命令查看命令帮助:
        [hadoop@slaver1 mapreduce]$ hdfs dfs -help ls
    4)、hdfs命令,创建文件夹:
        [hadoop@slaver1 mapreduce]$ hdfs dfs -mkdir -p /201804/20180405
        -p参数指定当需要创建文件夹存储,那么不报错,默认情况会报错。另外一个作用就是递归创建文件夹。如果我们给定的路径不是以/开始的,那么表示在当前用户目录下创建文件夹。(默认情况下是没有当前用户目录的,那么就会报错)
    5)、hdfs命令,上传文件到HDFS。-put,-copyFromLocal,-moveFromLocal。
        [hadoop@slaver1 data_hadoop]$ hdfs dfs -put test.txt /201804/20180405
        本地路径可以指定文件夹或者多个文件,hdfs上的路径必须是根据上传东西的不同,有不同的要求:
            a、本地指定的是文件夹,那么hdfs如果目录不存在,就新建目录然后将本地文件夹内容copy过去。hdfs目录存在,则将文件夹copy过去。
            b、本地指定的是单个文件,那么要求hdfs上指定的文件不存在。
            c、本地指定的多个文件,那么要求hdfs上指定的文件夹存在。
    6)、hdfs命令,下载文件。-get,-copyToLocal,-moveToLocal。
        [hadoop@slaver1 data_hadoop]$ hdfs dfs -get /201804
    7)、hdfs命令,查看文件内容:
        [hadoop@slaver1 data_hadoop]$ hdfs dfs -cat /test.txt
        [hadoop@slaver1 data_hadoop]$ hdfs dfs -text /test.txt
        cat命令和text命令都可以查看文件内容,但是他们的内置机制不一样,cat是copy文件内容,然后显示。text是通过hadoop解析将文件内容转换为文本内容,然后再显示。cat命令只适合看一半的文本文件,而text命令可以看出所有文件。
    8)、hdfs命令删除文件。
        [hadoop@slaver1 data_hadoop]$ hdfs dfs -rm -R /201804
        [hadoop@slaver1 data_hadoop]$ hdfs dfs -rmdir /201804/20180405
        区别:rm和rmdir的区别主要是,rm可以删除任何文件/文件夹。rmdir只能删除空的文件夹。
    9)、hdfs命令,fsck命令。
        fsck命令是检测hdfs磁盘文件是否有丢失备份异常等信息,可以查看到具体的文件是否处于健康情况,执行命令为hdfs -fsck 文件路径。
        [hadoop@slaver1 data_hadoop]$ hdfs fsck /201804
        [hadoop@slaver1 data_hadoop]$ hdfs fsck -help    
    10)、hdfs命令,dfsadmin命令汇报集群信息。
        a、参数-report
            可以通过该命令查看集群的基本信息,包括总磁盘大小,剩余磁盘大小,丢失块个数等总的集群信息。
            [hadoop@slaver1 data_hadoop]$ hdfs dfsadmin -report
        b、参数-safemode<enter | leave | get | wait>
            当集群中的文件备份出现丢失的时候,可能会进行安全模式。安全模式是指当集群处于该状态下,hdfs解决文件IO操作。我们可以通过该命令强制离开安全模式。
            [hadoop@slaver1 data_hadoop]$ hdfs dfsadmin -safemode get
    11)、hdfs命令,-namenode命令
        namenode命令是hadoop提供的操作NN节点的shell命令入口,包括NN节点的格式化,NN节点升级,NN节点回滚,NN节点启动等操作。查看帮助信息:hdfs namenode -h;
        [hadoop@slaver1 data_hadoop]$ hdfs namenode -h    
    12)、hadoop命令
        hadoop命令主要是将hdfs,yarn,mapred全部命令进行一个整合,实际生活中一般情况下主要使用hadoop命令来进行job的管理到多个集群之间的数据复制文件。常用命令主要有:
            a、job,job声明周期管理,包括提交,查看状态,kill等等。
                [hadoop@slaver1 data_hadoop]$ hadoop job
                该命令主要是根据我们控制job声明周期的接口。我们可以通过该命令提交job,查看我们提交job的运行情况,杀死我们提交的job,也可以删除job运行中的某个具体task;
                
            b、distcp,多集群间数据复制。
            c、version,查看hadoop版本信息。

     6、Hdfs结构介绍和YARN的介绍:

    a、hdfs是hadoop提供的基于分布式的文件存储系统。全称为hadoop distributed file system。主要是由namenode,datanode两类节点构成,其中namenode节点的主要功能是管理系统的元数据,负责管理文件系统的命令空间,记录文件数据块在datanode节点上面的位置和副本信息,协调客户端对文件系统的访问,以及记录命名空间的改动和本身属性的变动。datanode节点的主要功能就是负责节点所在物理节点上的存储管理。
    b、MapReduce(YARN)是hadoop提供的一种处理海量数据的并行编程模型和计算框架,用于对大规模的数据进行并行计算。主要由resourcemanager和nodemanager两类节点构成。其中resourcemanager主要负责集群资源管理,nodemanager负责节点的资源管理。初次之外,当运行mapreduce任务的时候,会产生ApplicationMaster和Container,其中ApplicationMaster负责向resourcemanager节点进行资源的申请并控制任务的执行,Container是最基本的资源单位。MapReduce的map和reduce均是其之上进行的。

     7:Hbase的巩固与学习:

    a、Hbase是建立在hdfs之上的一个提供可靠性,高性能,列存储,可伸缩,实时读写的数据库系统。是一种介于nosql和RDBMS之间的一种数据库系统,仅支持通过rowkey和range进行数据的检索,主要存储非结构化数据和半结构化数据。Hbase的目标是通过横向扩展,添加普通机器来增加存储性能和计算性能。Hbase的特点,大(一个表可以有上亿行以及百万级的行),面向列存储,稀疏(由于null不占用存储空间,所有表结构可以设计的非常稀疏)
    b、Hbase使用zookeeper进行集群的节点管理,当然hbase自身集成了一个zk系统,不过一般情况下在实际成产环境中不使用。Hbase由master,进程是hmaster和regionserver,进程是hregionserver两类节点(如果使用hbase自带的zk服务,那么还有HQuorumPeer进程)。Hbase支持提供backup master进行master备份。其中节点负责和zk进行通信以及存储regionserver的相关位置信息,regionserver节点实现具体对数据的操作,最终数据存储在hdfs上。
    c、Hbase的安装:
      1)、hbase存在三种安装方式,一种是独立模式,基本不用,第二种是分布式模式(继承zookeeper),第三种是分布式模式(独立zookeeper)。
    2)、hbase的下载地址如下所示:http://archive.cloudera.com/cdh5/cdh/5/。
      3)、hbase的安装参考如下所示:http://www.cnblogs.com/biehongli/p/7729135.html。
      4)、在hbase的根目录下创建一个文件夹hbase来存储临时文件和pid等等。默认是tmp目录。
    5)、创建到hdfs-site.xml的软连接或者配置连接hdfs的配置信息。然后将hbase的相关信息添加到环境变量中。
    6)、可以查看hbase是否安装成功:[hadoop@slaver1 bin]$ hbase version。
    7)、验证hbase的三种方式:第一种,jps查看是否有Hbase的进程启动,HMaster,HRegionServer。第二种,web界面查看是否启动http://192.168.19.131:60010/。第三种,shell命令客户端查看是否启动成功。[hadoop@slaver1 conf]$ hbase shell
      8)、hbase shell的命令参数忘记,可以使用如下查看:hbase(main):006:0> help 'status',hbase(main):009:0> help 'alter'等等
    9)、hbase命名空间相关命令:命名空间的作用是类似关系型数据中的database,作用就是将hbase的表按照业务作用分隔开,有益于维护。Hbase默认有两个命名空间,分别是hbase和default。其中hbase命名空间存储hbase自身的表信息,default存储用户创建的表。
        命名:create_namespace(创建命名空间),alert_namespace(命名空间修改),describe_namespace(显示命名空间描述信息),drop_namespace(删除命名空间)。list_namespace(显示所有命名空间),list_namespace_tables(显示对于命名空间中的table名称)。
    d、zookeeper的安装和部署:
      1)、将zookeeper-3.4.5-cdh5.3.6.tar.gz上传到虚拟机,进行解压缩操作,具体类比参考:http://www.cnblogs.com/biehongli/p/7650570.html
        也可以在线下载,如果网络可以的话。命令如下所示:
        [hadoop@slaver1 script_hadoop]$ wget http://archive.cloudera.com/cdh5/cdh/5/zookeeper-3.4.5-cdh5.3.6.tar.gz
    e、mapreduce与hbase的整合,搭建步骤:
      1)、在hadoop目录中创建hbase-site.xml的软连接。在真正的集群环境中的时候,hadoop运行mapreduce会通过该文件查找具体的hbase环境信息。
        [hadoop@slaver1 ~]$ ln -s /home/hadoop/soft/hbase-0.98.6-cdh5.3.6/conf/hbase-site.xml /home/hadoop/soft/hadoop-2.5.0-cdh5.3.6/etc/hadoop/hbase-site.xml
      2)、将hbase需要的jar包添加到hadoop运行环境中,其中hbase需要的jar就是lib文件夹下面的所有*.jar文件。
        在hadoop中提娜佳其他第三方的jar有很多方式,比如添加hbase的jar到hadoop环境中。这里介绍三种:
        第一种:在hadoop-env.sh中添加HADOOP_CLASS环境变量,value为hbase的lib文件夹下的所有jar文件。
          if [ "$HADOOP_CLASSPATH" ]; then
              export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:/home/hadoop/soft/hbase-0.98.6-cdh5.3.6/lib/*
          else
             export HADOOP_CLASSPATH=/home/hadoop/soft/hbase-0.98.6-cdh5.3.6/lib/*
          fi
        第二种:在系统级或者用户级修改*profile文件内容,在文件中添加HADOOP_CLASSPATH。
        第三种:直接将hbase的lib文件夹中所有jar文件复制到hadoop的share/hadoop/common/lib或者share/hadoop/mapreduce或者share/hadoop/marreudce2等文件夹中。
         
      3)、使用hbase自带的server jar测试是否安装成功。
        直接使用hbase自带的命令进行环境的测试,命令为:。该命令可以查看我们指定table的行数。
        [hadoop@slaver1 lib]$ cd /home/hadoop/soft/hbase-0.98.6-cdh5.3.6/lib
        [hadoop@slaver1 lib]$ hadoop jar hbase-server-0.98.6-cdh5.3.6.jar rowcounter student 

     8、Hive的学习与巩固:

    1、Hive是构建在hadoop之上的数据仓库平台,设计目标就是将hadoop上的数据操作同sql结合,让熟悉sql编程的开发人员能轻松的向hadoop平台上转移。hive可以在hdfs上构建数据仓库存储结构化数据,这些数据来源就是Hdfs上,Hive提供了一个类似sq的查询语言Hivesql来进行查询,变换数据等操作。当然hivesql语句的底层是转换为相应的mapreduce代码进行执行的。
    2、hive包含用户接口,元数据库,解析器,数据仓库等组件组成,其中用户接口包含shell客户端,jdbc,odbc,web接口等等。元数据库主要是指定义在hive中的表结构信息,一般保存到关系型数据库中,默认是derby,一般使用mysql进行保存。解析器主要功能是将hql转换为mapreduce代码。数据仓库就是由hdfs组成的数据存储容器。
    3、hive根据metastore的存储位置不同,分为三种安装模式,内嵌模式,本地模式,远程模式。内嵌模式就是使用derdy存储元数据。本地模式是将hive.metastore.local设置为true,就是说metastore和hive客户端安装在同一台机器上。远程模式指的是我们明确指定metastore安装的机器位置,而且可以指定多个,需要给定参数hive.metastore.uris并且hive.metastore.local必须设置为false。
      hive远程模式安装,使用mysql进行元数据的存储,安装步骤:
      a、安装mysql数据库。安装操作如下所示:
        安装步骤:
          1)使用root用户安装mysql。
            [hadoop@slaver1 ~]$ su root
            安装mysql:
            [root@slaver1 hadoop]# yum install mysql
            安装mysql的服务端:
            [root@slaver1 hadoop]# yum install mysql-server
            安装mysql的devel,可选:
            [root@slaver1 hadoop]# yum install mysql-devel
          2)修改/etc/my.cnf文件中的配置信息。
            [root@slaver1 hadoop]# vim /etc/my.cnf
            添加:
            [mysql]
            default-character-set=utf8
            [mysqld]
            character-set-server=utf8
            lower_case_table_names=1
          3)启动Mysql,设置root用户密码,使用root用户登陆。启动mysql服务,停止mysql服务,重启mysql服务。注意在linux的普通用户操作下,关闭mysql是无法关闭的,Stopping mysqld:[FAILED]
            [root@slaver1 hadoop]# service mysqld start
            [root@slaver1 hadoop]# service mysqld stop
            [root@slaver1 hadoop]# service mysqld restart
            mysql开机启动:[root@slaver1 soft]# chkconfig mysqld on
            查看mysql是否启动:[root@slaver1 hadoop]# ps -ef | grep mysql
            设置超级管理员密码:[root@slaver1 hadoop]# mysqladmin -u root password 123456
           使用超级管理员登陆系统:[root@slaver1 hadoop]# mysql -uroot -p123456
          4)创建Hive元数据的Mysql用户。创建用户,删除没有密码的用户,授权,刷新权限,最后重启mysql服务即可。
            mysql> show databases;
            mysql> use mysql;
         mysql> show tables;
    mysql> select user,host from user;
            mysql> create user 'hive' identified by 'hive';创建Hive的用户,密码也是hive.
    mysql> grant all privileges on *.* to 'hive'@'%' with grant option;授权
            mysql> FLUSH PRIVILEGES;刷新权限
            mysql> delete from user where password="";可以将没有密码的用户删除了,避免出现问题。ERROR 1045 (28000): Access denied for user 'hive'@'localhost' (using password: YES)
          5)使用新用户登陆,然后创建数据库,并修改数据库的连接方式。
            [root@slaver1 ~]# mysql -uhive -p
            mysql> create database hive;创建数据库
            mysql> alter database hive character set latin1;设置字符集
      b、hive模式安装。
        1)、下载hive,下载地址http://archive.cloudera.com/cdh5/cdh/5/。
        2)、解压下载的压缩包。
          [root@slaver1 package]$ tar -zxvf hive-0.13.1-cdh5.3.6.tar.gz -C /home/hadoop/soft/
        3)、配置环境变量hive.site.xml。
          [root@slaver1 conf]$ cp hive-default.xml.template hive-site.xml
          [hadoop@slaver1 conf]$ vim hive-site.xml
          由于复制的文件内容很多,删除起来很慢,所以可以自己创建一个hive-site.xml文件:
          <?xml version="1.0" encoding="UTF-8" standalone="no"?>
          <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
          <configuration>
          <!--
          <property>
            <name>hive.metastore.uris</name>
            <value>thrift://slaver1:9083</value>
          </property>
          <property>
            <name>hive.metastore.warehouse.dir</name>
            <value>/hive</value>
          </property>
          -->
          <property>
            <name>javax.jdo.option.ConnectionURL</name>
            <value>jdbc:mysql://slaver1:3306/hive?createDatabaseIfNotExist=true</value>
          </property>
          <property>
            <name>javax.jdo.option.ConnectionDriverName</name>
            <value>com.mysql.jdbc.Driver</value>
          </property>
          <property>
            <name>javax.jdo.option.ConnectionUserName</name>
            <value>hive</value>
          </property>
          <property>
            <name>javax.jdo.option.ConnectionPassword</name>
            <value>hive</value>
          </property>
          </configuration>
        4)、将mysql-connector-java-5.1.31.jar移动到Hive的lib文件夹下面。
          [hadoop@slaver1 lib]$ cp /home/hadoop/package/mysql-connector-java-5.1.31.jar ./
        5)、将bin目录添加到$PATH环境变量中去。
          [hadoop@slaver1 ~]$ sudo vim /etc/profile
          export HIVE_HOME=/home/hadoop/soft/hive-0.13.1-cdh5.3.6
          export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin:$SCRIPT:$HBASE_HOME/bin:$HIVE_HOME/bin
          [hadoop@slaver1 ~]$ source /etc/profile
        6)、启动metastore服务。hive --service metastore &(首先要启动hdfs和Yarn服务的哦):
           [hadoop@slaver1 conf]$ hive --service metastore &。可以去创建的hive的数据库里面已经创建了很多数据表。mysql> show databases;mysql> use hive;mysql> show tables;
        7)、进入hive的shell客户端,验证是否安装成功。
          [hadoop@slaver1 soft]$ hive
          然后就可以使用hive了:hive> show databases;
          hive> create table user(id int,name string);创建第一个数据表以后就可以在hdfs查看hive文件了,里面已经存在创建的数据表。
        8)、hive web安装。hive提供一个web的操作客户端,一般我们通过该页面查看Hive的信息,配置信息包括:hive.hwi.listen.host指定监听ip,默认为0.0.0.0。hive.hwi.listen.port监听端口,默认为9999,hive.hwi.war.file=xxx。另外需要将java的tool.jar文件移动到hive的lib文件夹中。启动命令为:hive --service hwi &。
        9)、hive默认提供的cli(shell)服务,如果需要启动其他服务,那么需要service参数来启动其他服务,比如thrift服务,metastore服务等等。可以通过命令hive --service help查看支持的命令。
      c、hive命令的复习和巩固:
        1)、hive shell命令介绍,hive的shell命令是通过hive目录下面的bin目录的hive来控制的,通过该文件可以进行hive当前回话的环境管理,也可以进行hive的表管理操作。hive命令必须使用";"进行结束标示。通过hive -H查看帮助信息。[hadoop@slaver1 ~]$ hive -H
        2)、hive的shell基本常用命令主要包含退出客户端,添加文件,修改/查看环境变量,执行linux命令,执行dfs命令等等。命令包括:quit,exit,set(无参是查看,有参是设置值,只在当前回话有效),add JAR[S] <filepath> <filepath>*,list JAR[S],delete JAR[S] <filepath>*, !<linux-command>(hive> !ls -ls;),dfs<dfs command>(hive> dfs -ls /;)等等。除了hive的基本命令外,其他的命令主要是ddl和dml等操作数据表的命令。
        3)、hiveql简称hql,是一种类似sql的查询语言,绝大多数语法和sql类似。hql支持基本类型和复杂类型两大数据类型。基本类型包括TINYINT(1 byte),SMALLINT(2 byte),INT(4 byte),BIGINT(8 byte),FLOAT(4 byte),DOUBLE(8 byte),BOOLEAN(-),string(2G)。复杂类型包括ARRAY(一组有序数组,类型必须一致),MAP(无序键值对,键值内部字段类型必须相同,而且要求key的类型为基本数据类型),STRUCT(一组字段,类型任意)。
        4)、show 命令的主要作用是查看database,table,function等组件的名称信息,也就是通过show命令我们可以知道我们的hive中有那些数据库,或者数据表。describe命令主要作用是获取databse,table,partition的具体描述信息,包括存储位置,字段类型等信息。explain命令的主要作用是获取Hql语句的执行计划,我们可以通过分析这些执行计划来优化hql语句。
          


     9、Nginx的安装巩固复习:

    1、使用root用户登陆。
    2、查看nginx信息,命令yum info nginx.
      [root@slaver1 ~]# yum info nginx
    3、如果查看nginx信息提示nginx找不到,可以通过修改rpm源来进行后续步骤,执行命令:rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm   [root@slaver1 ~]# rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
    4、再查看nginx信息。
      [root@slaver1 ~]# yum info nginx
    5、安装,命令,yum install nginx,在安装过程中直接输入y.
      [root@slaver1 ~]# yum install nginx
    6、启动nginx,命令service nginx start.
      [root@slaver1 ~]# service nginx start
    7、访问http://slaver1查看nginx的web页面。

    10、Flume介绍:

      Flume是Apache基金会组织的一个提供的高可用的,高可靠的,分布式的海量日志采集,聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集日志。同时,flume提供对数据进行简单处理,并写到各种数据接收方(可以定制)的能力。当前flume有两个版本,flume0.9x版本之前的统称为flume-og,flume1.x版本统称为flume-ng。

    a、主要区别如下所示:
      1)、flume-og中采用Master结构,为了保证数据的一致性,引入zookeeper进行管理。flume-ng中取消了集中master机制和zookeeper管理机制,变成了一个纯粹的传输工具。
      2)、flume-ng中采用不同的线程进行数据的读写操作,在flume-og中,读数据和写数据是由同一个线程操作的,如果写出比较慢的话,可能会阻塞flume的接受数据的能力。
    b、flume的结构:
      flume中以agent为基本单位,一个agent可以包括source,channel,sink,三种组件都可以有多个。其中source组件主要功能是接受外部数据,并将数据传输到channel中。sink组件的主要功能是发送flume接受到的数据为目的的。channel的主要作用就是数据传输和保存的一个作用。fulme主要分为三类结构,单agent结构,多agent链式结构和多路复用agent结构。
    c、flume的安装操作:
      1)、将压缩包上传到虚拟机。过程省略。
        http://archive.cloudera.com/cdh5/cdh/5/flume-ng-1.5.0-cdh5.3.6.tar.gz
      2)、解压缩操作。命令如下所示:
        [hadoop@slaver1 package]$ tar -zxvf flume-ng-1.5.0-cdh5.3.6.tar.gz -C /home/hadoop/soft/
      3)、进入到flume的conf目录,复制flume-env.sh.template为flume-env.sh:
        [hadoop@slaver1 conf]$ cp flume-env.sh.template flume-env.sh
      4)、修改flume-env.sh,添加如下jdk的路径信息:
        export JAVA_HOME=/home/hadoop/soft/jdk1.7.0_79
      5)、将flume的bin目录添加到环境变量中去。
      6)详细配置见http://www.cnblogs.com/biehongli/p/8031403.html。
      7)、验证是否安装成功。[hadoop@slaver1 conf]$ flume-ng version
    d、flume的案例(案例详细步骤可参考http://www.cnblogs.com/biehongli/p/8031403.html):
      使用netcat source监听客户端的请求,使用memory channel作为数据的传输通道,使用logger sink打印监听到的信息。步骤:
        1)、在conf文件夹中建立test.conf,里面是agent的配置。
        2)、启动flume-ng agent --conf ./conf/ --conf-file ./conf/test.conf --name a1 -Dflume.root.logger=INFO,console。
        3)、使用telenet命令连接机器,命令:telenet slaver1 4444
        4)、输入信息查看是否成功

     11、Sqoop的巩固与学习:

    a、sqoop是一款开源的工具,主要用于在hadoop(hive)与传统的数据库(mysql,oracle)之间进行数据的传递,可以将一个关系型数据库中的数据导入到hadoop的hdfs中,也可以将hdfs的数据导入到关系型数据库中。一般情况下,是将数据分析的结果导出到关系型数据库中,供其他部门使用。sqoop专门为大数据设计,可以通过分割数据集来启动多个mapreduce程序来处理每个数据块。
    b、sqoop的安装和部署:详细步骤见http://www.cnblogs.com/biehongli/p/8039128.html
      1)、sqoop的下载:wget http://archive.cloudera.com/cdh5/cdh/5/sqoop-1.4.5-cdh5.3.6.tar.gz
      2)、解压缩操作。
        [hadoop@slaver1 package]$ tar -zxvf sqoop-1.4.5-cdh5.3.6.tar.gz -C /home/hadoop/soft/
      3)、复制相关的依赖包到lib文件夹中。
        [hadoop@slaver1 lib]$ cp /home/hadoop/package/mysql-connector-java-5.1.31.jar ./
        [hadoop@slaver1 lib]$ cp /home/hadoop/soft/hadoop-2.5.0-cdh5.3.6/share/hadoop/common/hadoop-common-2.5.0-cdh5.3.6.jar ./
        [hadoop@slaver1 lib]$ cp /home/hadoop/soft/hadoop-2.5.0-cdh5.3.6/share/hadoop/hdfs//hadoop-hdfs-2.5.0-cdh5.3.6.jar ./
        [hadoop@slaver1 lib]$ cp /home/hadoop/soft/hadoop-2.5.0-cdh5.3.6/share/hadoop/mapreduce/hadoop-mapreduce-client-core-2.5.0-cdh5.3.6.jar ./
      4)、修改conf/sqoop-env.sh文件。
        #Set path to where bin/hadoop is available
        export HADOOP_COMMON_HOME=/home/hadoop/soft/hadoop-2.5.0-cdh5.3.6
        #Set path to where hadoop-*-core.jar is available
        export HADOOP_MAPRED_HOME=/home/hadoop/soft/hadoop-2.5.0-cdh5.3.6
        #set the path to where bin/hbase is available
        export HBASE_HOME=/home/hadoop/soft/hbase-0.98.6-cdh5.3.6
        #Set the path to where bin/hive is available
        export HIVE_HOME=/home/hadoop/soft/hive-0.13.1-cdh5.3.6
      5)、添加sqoop常量到用户环境变量中去。
        sudo vim /etc/profile
        export SQOOP_HOME=/home/hadoop/soft/sqoop-1.4.5-cdh5.3.6
        export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin:$SCRIPT:$HBASE_HOME/bin:$HIVE_HOME/bin:$FLUME_HOME/bin:$SQOOP_HOME/bin
      6)、测试是否安装成功。[hadoop@slaver1 conf]$ sqoop version
    c、sqoop命令介绍:
      1)、sqoop总共有14个命令,包括:codegen,create-hive-table,eval,export,help,import,import-all-tables,import-mainframe,job,list-databases,list-tables,merger,metastore,version。其中常用命令为create-hive-table,export,import,help等等。
      2)、sqoop命令格式:sqoop <command> <generic-options> <command-options>。也就是说sqoop的所有命令有公用的参数列表,除此之外每个命令都有自己特定的执行参数。
      3)、help命令主要作用是查看sqoop提供的帮助信息,命令格式:sqop help[<command>]。help后面的参数为sqoop支持的命令格式。如果不给定help后面的参数,那么表示显示sqoop命令的帮助信息,如果给定后面的参数,那么显示具体sqoop命令的帮助信息。
        [hadoop@slaver1 lib]$ sqoop help
        [hadoop@slaver1 lib]$ sqoop help import
      4)、list-tables和list-databases两个命令都是针对关系型数据库(可以通过jdbc连接的数据库/数据仓库)而言的,我们一般可以通过该命令查看对应数据库中的table&database的列表。基本命令格式为:sqoop (list-tables|list-databases) --connect jdbc_url --username db_name --password db_pwd;
        [hadoop@slaver1 lib]$ sqoop list-tables --connect jdbc:mysql://slaver1:3306/hive --username hive --password hive
        [hadoop@slaver1 lib]$ sqoop list-databases --connect jdbc:mysql://slaver1:3306/hive --username hive --password hive
      5) 、create-hive-table命令根据关系型数据库中的表创建hive表,不进行数据的copy,只进行表结构的copy。如果hive中存在要创建的表,默认情况下不进行任何操作。命令格式sqoop create-hive-table --connect jdbc_url --username db_name --password db_pwd --table db_table_name --hive-table hive_table_name。
        [hadoop@slaver1 lib]$ sqoop create-hive-table --connect jdbc:mysql://slaver1:3306/hive --username hive --password hive --table version --hive-table hivetest
      6)、import命令的主要作用是将关系型数据库中的数据导入到hdfs文件系统中(或者hbase/hive)中,不管是导入到hbase还是导入到hive中,都需要先导入到hdfs中,然后再导入到最终的位置。一般情况下,只会采用将关系型数据库的数据导入到hdfs或者hive中,不会导入到hbase中。import命令导入到hdfs中默认采用','进行分割字段值,导入到hive中默认采用'u0001'来进行分割字段值,如果有特殊的分割方式,我们可以通过参数指定。import命令导入到hive的时候,会先在/user/$(user.name)/文件夹下创建一个同关系型数据库表名的一个文件夹作中转文件夹,如果该文件夹存在,则报错。可以通过命令sqoop help import 查看帮助命令。
        a、import命令,将mysql表tb_user中的数据导入hive的user表,hive的user表不存在。
          [hadoop@slaver1 sqoop-1.4.5-cdh5.3.6]$ sqoop import --connect jdbc:mysql://slaver1:3306/test --username hive --password hive --table tb_user --hive-table user --hive-import -m 1
        b、在a的基础上,分别进行overwrite(覆盖),导入和into(直接加入)导入。
          into直接导入命令同a的实例。
          overwrite如下所示(由于数据表相同,记得删除hdfs上面的数据表):
            [hadoop@slaver1 sqoop-1.4.5-cdh5.3.6]$ sqoop import --connect jdbc:mysql://slaver1:3306/test --username hive --password hive --table tb_user --hive-table user --hive-import -m 1 --hive-overwrite
        c、在b的基础上,通过增加mysql的tb_user表的数据,增量导入到hive表中。
          [hadoop@slaver1 sqoop-1.4.5-cdh5.3.6]$ sqoop import --connect jdbc:mysql://slaver1:3306/test --username hive --password hive --table tb_user --where  "id>=5" --hive-table user --hive-import -m 1
        d、将tb_user表中的数据导出到使用','分割字段的hive表中。
          hive> create table user2(id int,name string,phone string)
            > row format delimited                               
            > fields terminated by ',';
          [hadoop@slaver1 sqoop-1.4.5-cdh5.3.6]$  sqoop import --connect jdbc:mysql://slaver1:3306/test --username hive --password hive --table tb_user --hive-table user2 --hive-import -m 1 --fields-terminated-by ","
        e、将tb_user表的数据导入到hdfs中。
          [hadoop@slaver1 sqoop-1.4.5-cdh5.3.6]$ sqoop import --connect jdbc:mysql://slaver1:3306/test --username hive --password hive --table tb_user --target-dir /test --m 1
        f、在d的基础上,增量导出数据到hdfs中。
          [hadoop@slaver1 sqoop-1.4.5-cdh5.3.6]$ sqoop import --connect jdbc:mysql://slaver1:3306/test --username hive --password hive --table tb_user --target-dir /test --m 1 --check-column id --incremental append --last-value 8
      7)、export命令的主要作用是将hdfs文件数据导入到关系型数据库中,不支持从hive和Hbase中导出数据,但是由于hive的底层就是hdfs的一个基本文件,所以可以将hive导出数据转换为从hdfs导出数据。导出数据的时候,默认字段分割方式是',',所以如果hive的字段分割不是',',那么就需要设计成对应格式的分割符号。可以通过命令:sqoop hep export查看帮助文档。
        注意:前提条件,关系型数据库中目的表已经存在。
        a、将hdfs上的文件导出到关系型数据库数据表中。
          [hadoop@slaver1 ~]$ sqoop export --connect jdbc:mysql://slaver1:3306/test --username hive --password hive --table tb_user_copy --export-dir /test
        


     

    待续......

  • 相关阅读:
    【leetcode】Letter Combinations of a Phone Number
    【leetcode】_3sum_closest
    【leetcode】_3Sum
    【LeetCode】Longest Common Prefix
    入门:PHP:hello world!
    入门:HTML:hello world!
    入门:HTML表单与Java 后台交互(复选框提交)
    codeforces 712B. Memory and Trident
    codeforces 712A. Memory and Crow
    hdu 5878 I Count Two Three (2016 ACM/ICPC Asia Regional Qingdao Online 1001)
  • 原文地址:https://www.cnblogs.com/biehongli/p/8715968.html
Copyright © 2020-2023  润新知