大数据_离线数据处理

  1. 流程介绍
  2. 安装搭建       
  3. 离线流程测试
  4. 可能遇见的问题
  5. 搭建及入门视频
  • 流程介绍

mysql和oracle处理数据太慢,着急想要处理结果,搭建个大数据环境处理吧,不使用快速搭建平台

环境

centos7.4

待处理的关系型数据库

mysql

目录结构

  |--bigdata

         |--install  :安装目录

         |--software   :软件包存放位置

         |--test  :测试目录

ip及主机名

192.168.126.128 master(单机版和集群安装区别不大)

用户

hadoop 

提前安装

jdk

  • 安装搭建

          hadoop的搭建,现在已经3.0了(很优秀),先安装个低版本的吧

         

2.hadoop 的安装:

    1>.配置环境变量

        HADOOP_HOME=/home/hadoop3/bigdata/install/hadoop-2.6.0-cdh5.7.0

        export PATH=$HADOOP_HOME/bin:$PATH

    2>.修改配置文件

 1>>.core-site.xml:

<property>

                    <name>fs.defaultFS</name>

                     <value>hdfs://master:9000</value>

          </property>

          <property>

                     <name>hadoop.tmp.dir</name>

                     <value>/home/hadoop/install/hadoop-2.7.6/data</value>

          </property>

       2>>.hadoop-env.sh

               JAVA_HOME=/home/hadoop3/bigdata/install/jdk1.8.0_102

   3>>.hdfs-site.xml

<property>

                 <name>dfs.replication</name>

                 <value>1</value>

              </property>

 4>>.mapred-site.xml
         

<property>

                 <name>mapreduce.framework.name</name>

                 <value>yarn</value>

             </property>

 5>>.yarn-site.xml

<property>

                     <name>yarn.resourcemanager.hostname</name>

                     <value>master</value>

             </property>

            <property>

                     <name>yarn.nodemanager.aux-services</name>

                     <value>mapreduce_shuffle</value>

             </property>

    3>.ssh 设置免密码登陆

        查看是否已经设置

        ssh master

        1>.生成密钥对

          ssh-keygen -t rsa

        2>.将公钥发送出去

          ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop3@master

        3>.测试

          ssh master

    4>.格式化namenode

        hdfs namenode -format

    5>.hadoop 启动 测试

        $HADOOP_HOME/sbin/start-all.sh

    6> jps查看进程

       jps 正常启动  5个3个hdfs2个yarn
      

 7>. 正常启动后测试命令:

   本地创建 person.txt

          1,zhangsan ,F

          2,lisi,M

          3,wangwu,F

        hadoop fs -ls /   :查看

        hadoop fs -mkdir /input  :创建文件夹

        hadoop fs -put person.txt /input  :推送文件

        hadoop fs -cat /input/person.txt  :查看文件

        hadoop fs -rmr /input/*   :删除

2.hive的安装及测试

1>.解压

  2>.配置环境变量

  3>.在mysql中创建用户hive和hive(database)

  4>.添加conf/hive-site.xml的配置文件

  hive的元数据存储支持derby数据库,公司常用mysql做hive元数据的存储

官网在哪里找?hive的配置?

  hive.apache.org-》Hive wiki.-》Administrator Documentation-》Setting Up Metastore-》搜索mysql

  修改hive-site.xml配置文件

<?xml version="1.0" encoding="UTF-8" standalone="no"?>

 <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

  <configuration>  

    <property>

           <name>javax.jdo.option.ConnectionURL</name>

            <value>jdbc:mysql://localhost:3306/hive?useSSL=false</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>Mysql_01</value>

    </property>

</configuration>

  5>. mysql连接的jar导入lib

  6>.数据初始化(mysql中存放的是hive的元数据)

    bin/schematool -dbType mysql -initSchema

  7>测试

  hive

    查看表

    show tables;

    show databases;

   hive的基本数据类型:在官网找:hive.apache.org--> Hive wiki.==>UserDocumentation==>Data Types

hive的测试:

  1.创建表(外部表和内部表)

    create table stu(id int,username string) row format delimited fields terminated by ','

    location '/input/person'

    create external table person_w (id int,username string,sex Char(1)) row format delimited fields terminated by ',' location '/input/person_w'

 1.1.查看表的结构

      desc person

      desc formatted person

1.2.表数据的存储位置:

hdfs://master:9000/user/hive/warehouse/person

hdfs://master:9000/user/hive/warehouse/person_w

1.3.查看区别:

     drop table person;

     drop table person_w;

1.4.查看数据文件是否还在

     hadoop fs -ls /user/hive/warehouse

      

  2.数据的导入(本地数据和hdfs上的数据)(本地加local)

     load data local inpath '/home/hadoop3/bigdata/test/person.txt' into table person_w

  3.分区

     create external table person_p (id int,username string,sex Char(1)) partitioned by (dt String) row format delimited fields terminated by ',' location '/input/person_w'

     3.1查看结构

     desc person_p;

     (X) load data local inpath '/home/hadoop3/bigdata/test/person.txt' into table person_p

     (v) load data local inpath '/home/hadoop3/bigdata/test/person.txt' into table person_p partition (dt="20180727");

     3.2写入两份数据

     load data local inpath '/home/hadoop3/bigdata/test/person.txt' into table person_p partition (t="20180726");

    3.3 查询:

     select * from person_p where t=20180727

     3.4查看存储

     desc formatted person_p

     hadoop fs -ls /input/person_w

    3.5 存储方式

     /input/person_w/t=20180726

     /input/person_w/t=20180727

     3.6查看分区数:

     show partitions person_p;

    分区的好处:不用扫描整个表,减少时间消耗

  hive的存储:

    hive=====hdfs

    表=======目录

    分区=====目录

    数据======文件

    分区如果是多级呢?

    hive> create table par_tab_muilt (name string, nation string) partitioned by (sex string,dt string) row format delimited fields terminated by ',' ;

    hive> load data local inpath '/home/hadoop/files/par_tab.txt' into table par_tab_muilt partition (sex='man',dt='2017-03-29');

   hdfs上查看多级分区的结构:

   hadoop dfs -lsr /user/hive/warehouse/par_tab_muilt

    /user/hive/warehouse/par_tab_muilt/sex=man

    /user/hive/warehouse/par_tab_muilt/sex=man/dt=2017-03-29

    /user/hive/warehouse/par_tab_muilt/sex=man/dt=2017-03-29/par_tab.txt

    可见,新建表的时候定义的分区顺序,决定了文件目录顺序(谁是父目录谁是子目录),正因为有了这个层级关系,当我们查询所有man的时候,man以下的所有日期下的数据都会被查出来。如果只查询日期分区,但父目录sex=man和sex=woman都有该日期的数据,那么Hive会对输入路径进行修剪,从而只扫描日期分区,性别分区不作过滤(即查询结果包含了所有性别)。

    动态分区:

    启动动态分区功能

      set hive.exec.dynamic.partition=true;  --启用动态分区

      set hive.exec.dynamic.partition.mode=nonstrict;  --可以全部为动态分区

       1.创建普通表

       create external table usertable(id int,username string,birdata string,sex char(1)) row format delimited fields terminated by ',' location '/input/user' ;

        1    zhangsan    2018-01-01    M

        2    lisi        2018-02-01    F

        3    wangwu        2018-01-01    F

        4    zhaoli        2018-03-01    F

       2.插入数据

       load data local inpath '/home/hadoop3/bigdata/test/student_dp.txt' into table usertable;

        创建动态分区表

       create external table user_p (id int,username string) partitioned by (birdata String,sex string) row format delimited fields terminated by ',' location '/input/user_p'

       3.表中数据插入到动态分区

       insert overwrite table user_p partition(birdata,sex) select * from usertable;

4.sqoop的安装

  1>.解压

  2>.配置环境变量

  3>.修改配置文件

   修改conf/sqoop-env.sh

      export HADOOP_COMMON_HOME=/home/hadoop3/bigdata/install/hadoop-2.6.0-cdh5.7.0

      export HADOOP_MAPRED_HOME=/home/hadoop3/bigdata/install/hadoop-2.6.0-cdh5.7.0

      export HIVE_HOME=/home/hadoop3/bigdata/install/apache-hive-2.3.3-bin

 4>.lib下添加连接mysql的jar

  5>.测试

 1>>.在mysql上创建两个表

      user表

          id   username

          ---------------

           1, 'zhangsan'

           2, 'lisi'

           3, 'wangwu'

       food表

           id  foodname, price

           -------------------

           1, 'apple', '11'

           2, 'banana', '12'

           3, 'orange', '13'

           4, 'mango', '14'

     shopping 表

            id,fid,uid

          --------------

            1, 1, 1

            2, 2, 1

            3, 3, 1

            4, 1, 2

            5, 4, 2

            6, 2, 3

      查询:每个用户的消费情况

select c.username,m.money from user c

                LEFT JOIN (

                select a.uid,sum(price) money from shopping a

                left JOIN

                food b

                on

                a.fid=b.id

                GROUP BY uid

                )m

                ON

                m.uid=c.id

  

  2>>sqoop 数据导入hdfs:

    导入:

    sqoop import --connect jdbc:mysql://localhost:3306/hive_test --username root --password Mysql_01 --table food --target-dir /input/food

参数不会写可以用help命令

    --target-dir    指定上传的路径 /20180702/student

    --append 追加

    --delete-target-dir 删除再添加

    -m 1   :map的任务个数,默认四个map,数据量少耗时,所以一般会指定文件存hdfs的位置及map数

  3>>.sqoop 数据导入到hive:

      sqoop import --connect jdbc:mysql://localhost:3306/hive_test --username root --password Mysql_01 --table food -m 1 --hive-import  --target-dir  /input/food

      等价于,数据导入hdfs,在hive中创建表,在删除hdfs上的数据

      一些参数:

      --target-dir参数来指定临时目录

      --hive-overwrite:覆盖原先的数据

      --fields-terminated-by:改变导入数据的分隔符

      mysql中的数据导入到hdfs中,默认使用的分隔符是逗号

  4>>.将三个表全部导入hive

     sqoop import --connect jdbc:mysql://localhost:3306/hive_test --username root --password Mysql_01 --table food -m 1 --hive-import  --target-dir  /input/food

     sqoop import --connect jdbc:mysql://localhost:3306/hive_test --username root --password Mysql_01 --table user -m 1 --hive-import  --target-dir  /input/user

     sqoop import --connect jdbc:mysql://localhost:3306/hive_test --username root --password Mysql_01 --table shopping -m 1 --hive-import  --target-dir  /input/shopping

5>>.测试在mysql中写的语句,hive中也可测试,hive中可用整个流程成功
 

select c.username,m.money from user c

        LEFT JOIN (

        select a.uid,sum(price) money from shopping a

        left JOIN

        food b

        on

        a.fid=b.id

        GROUP BY uid

        )m

        ON

        m.uid=c.id

最后一步要设置定时任务使用crontab,当然你可以使用azkaban或者oozie

crontab -e

编写一下,设置执行时间,当然执行时间一般设置一天执行一次

"0 0 1 * * ?" /data/test/testall

  • 可能遇见的问题

hive的问题:

       sqoop能导数据到hdfs,hive单独使用也不报错,但是sqoop不能直接导mysql的数据到hive(不提前创建表)

也不能用sqoop在hive中创建表,所以怀疑sqoop和hive的版本不对应,换了n个版本的sqoop和hive问题依旧

       原因:hive连接mysql的的jar(在lib下)sqoop中的版本和hive中的版本一致

       原先用:mysql-connector-java-5.1.36.jar

       更换:mysql-connector-java-5.1.41-bin.jar  提升了连接的版本

权限不够的问题:

离线算法使用MapReduce_离线算法使用MapReduce

我原先用过hadoop用户又强制删除了

离线算法使用MapReduce_hadoop_02

Caused by: java.net.BindException: 地址已在使用

解决方法:

   可以查看自己端口的使用情况 
   netstat -alnp | grep 50010

然后清掉对应的进程即可

    kill -9 1252

hadoop进程启动不完全问题:

    

        修改数据文件

        $HADOOP_HOME/data/dfs/name/VERSION

        将name/current下的VERSION中的clusterID复制到data/current下的VERSION中,覆盖掉原来的clusterID

        2.如果hdfs或者yarn启动不起来,要去查看日志,日志的位置$HADOOP_HOME/logs下查看,那个没起起来就去查看对应的.log结尾的日志

sqoop的导数据制表符问题:

文件是以制表符"/t"分开的还是以”/001“,制表符是tab键分割

sqoop缺主键问题:

Error during import: No primary key could be found for tablescore. Please specify one with --split-by or perform a sequential import with'-m 1'.  缺主键造成的。

  • 搭建及入门视频