电商日志分析项目 – 04 日志的抽取(Sqoop)

Sqoop 安装

参考SQOOP安装配置

编写Sqoop脚本

点击UI界面Sqoop导出时需要输入导出的源路径,存储位置:

/tmp/project-mapred-result.txt

然后编写Sqoop脚本如下:

#!/bin/bash
/opt/pkg/sqoop/bin/sqoop export \
--connect jdbc:mysql://192.168.186.100:3306/shop \
--username root \
--password niit1234 \
--input-fields-terminated-by '\t' \
--table t_mr_result \
--export-dir $(cat /tmp/project-mapred-result.txt) \
--class-name UpsertMrResult \
--update-key goodsId --update-mode allowinsert

等待一段时间执行完成,查看mysql数据是否发生更新

Views: 96

电商日志分析项目 – 03 日志的分析(MapReduce)

MapReduce工程代码

  1. 创建maven工程
    在项目根目录下创建input文件夹,创建一个文本文件access.log用来模拟nginx日志

    hadoop100,192.168.186.100 - - [21/Apr/2021:01:36:19 +0800] "GET /shop/detail.html?id=4028f00176e1aa620176e6aca6890003 HTTP/1.0" 200 4366 "-" "ApacheBench/2.3" "-"
    hadoop100,192.168.186.100 - - [21/Apr/2021:01:36:19 +0800] "GET /shop/detail.html?id=4028f00176e1aa620176e6aca6890003 HTTP/1.0" 200 4366 "-" "ApacheBench/2.3" "-"
    hadoop100,192.168.186.100 - - [21/Apr/2021:01:36:19 +0800] "GET /shop/detail.html?id=4028f00176e1aa620176e6aca6890003 HTTP/1.0" 200 4366 "-" "ApacheBench/2.3" "-"
    hadoop100,192.168.186.100 - - [21/Apr/2021:01:36:19 +0800] "GET /shop/detail.html?id=4028f00176e1aa620176e6aca6890003 HTTP/1.0" 200 4366 "-" "ApacheBench/2.3" "-"
    hadoop100,192.168.186.100 - - [21/Apr/2021:01:36:19 +0800] "GET /shop/detail.html?id=4028f00176e1aa620176e6aca6890003 HTTP/1.0" 200 4366 "-" "ApacheBench/2.3" "-"
  2. 引入maven依赖

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>org.example</groupId>
        <artifactId>log</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <properties>
            <!--定义Hadoop版本-->
            <hadoop.version>3.1.4</hadoop.version>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <maven.compiler.source>1.8</maven.compiler.source>
            <maven.compiler.target>1.8</maven.compiler.target>
        </properties>
    
        <!---引入cdh的仓库-->
        <repositories>
            <repository>
                <id>cloudera</id>
                <url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
            </repository>
        </repositories>
    
        <dependencies>
            <!--添加Hadoop依赖包-->
            <dependency>
                <groupId>org.apache.hadoop</groupId>
                <artifactId>hadoop-client</artifactId>
                <version>${hadoop.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.hadoop</groupId>
                <artifactId>hadoop-common</artifactId>
                <version>${hadoop.version}</version>
            </dependency>
    
            <dependency>
                <groupId>org.apache.hadoop</groupId>
                <artifactId>hadoop-hdfs</artifactId>
                <version>${hadoop.version}</version>
            </dependency>
    
            <dependency>
                <groupId>org.apache.hadoop</groupId>
                <artifactId>hadoop-mapreduce-client-core</artifactId>
                <version>${hadoop.version}</version>
            </dependency>
            <!--添加JUnit4依赖包-->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.11</version>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
    </project>
  3. 添加log4j.properties文件在资源目录下即resources,文件内容如下
    ### 配置根 ###
    log4j.rootLogger = debug,console,fileAppender
    ## 配置输出到控制台 ###
    log4j.appender.console = org.apache.log4j.ConsoleAppender
    log4j.appender.console.Target = System.out
    log4j.appender.console.layout = org.apache.log4j.PatternLayout
    log4j.appender.console.layout.ConversionPattern = %d{ABSOLUTE} %5p %c:%L - %m%n
    ### 配置输出到文件 ###
    log4j.appender.fileAppender = org.apache.log4j.FileAppender
    log4j.appender.fileAppender.File = /tmp/logs/log.log
    log4j.appender.fileAppender.Append = false
    log4j.appender.fileAppender.Threshold = DEBUG,INFO,WARN,ERROR
    log4j.appender.fileAppender.layout = org.apache.log4j.PatternLayout
    log4j.appender.fileAppender.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
  4. 编写MR程序之Mapper:LogMapper.java

    package com.niit.log;
    
    import org.apache.hadoop.io.IntWritable;
    import org.apache.hadoop.io.LongWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.Mapper;
    
    import java.io.IOException;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class LogMapper extends Mapper<LongWritable, Text,Text, IntWritable> {
        // 按指定模式在字符串查找
        String pattern = "\\?id=[0-9a-z]*";
        // 创建 Pattern 对象
        Pattern r = Pattern.compile(pattern);
        @Override
        protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
            String data = value.toString();
            // 现在创建 matcher 对象
            Matcher m = r.matcher(data);
            if (m.find()) {
                String idStr = m.group(0);
                String id = idStr.substring(4);
                context.write(new Text(id),new IntWritable(1));
            }
        }
    }   
  5. 编写MR程序之Mapper:LogReducer.java

    package com.niit.log;
    
    import org.apache.hadoop.io.IntWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.Reducer;
    
    import java.io.IOException;
    
    public class LogReducer extends Reducer<Text, IntWritable,Text, IntWritable> {
    
        @Override
        protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
            int sum = 0;
            for (IntWritable v: values) {
                sum += v.get();
            }
            context.write(key,new IntWritable(sum));
        }
    }
  6. 编写MR程序之Job:LogJob.java

    package com.niit.log;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.fs.Path;
    import org.apache.hadoop.io.IntWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.Job;
    import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
    import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
    
    public class LogJob {
        public static void main(String[] args) throws Exception {
    
            // Windows
            System.setProperty("HADOOP_USER_NAME", "hadoop");
    
            // Linux
            // if (args.length < 2) {
            //     System.out.println("Usage:hadoop jar Log.jar " + LogJob.class.getName() + " input ouput");
            //     System.exit(0);
            // }
    
            Configuration configuration = new Configuration();
            Job job = Job.getInstance(configuration);
            job.setJarByClass(LogJob.class);
    
            job.setMapperClass(LogMapper.class);
            job.setMapOutputKeyClass(Text.class);
            job.setMapOutputValueClass(IntWritable.class);
    
            job.setReducerClass(LogReducer.class);
            job.setOutputKeyClass(Text.class);
            job.setOutputValueClass(IntWritable.class);
    
            FileSystem fileSystem = FileSystem.get(configuration);
    
            // Windows
            Path inputPath = new Path("./input/access.log");
            Path outputPath = new Path("./output/");
    
            // Linux
            // Path inputPath = new Path(args[0]);
            // Path outputPath = new Path(args[1]);
    
            if (fileSystem.exists(outputPath)) {
                fileSystem.delete(outputPath, true);
            }
    
            // Windwos
            FileInputFormat.setInputPaths(job, inputPath);
            FileOutputFormat.setOutputPath(job, outputPath);
    
            // Linux
            // FileInputFormat.setInputPaths(job, new Path(args[0]));
            // FileOutputFormat.setOutputPath(job, new Path(args[1]));
    
            boolean completion = job.waitForCompletion(true);
            System.exit(completion ? 0 : -1);
        }
    }
  7. 本地运行代码,测试下结果正确与否
  8. 本地运行测试结果正确后,需要对Driver类输入输出部分代码进行修改,具体修改如下:

    // Windows
    // System.setProperty("HADOOP_USER_NAME", "hadoop");
    
    // Linux
    if (args.length < 2) {
        System.out.println("Usage:hadoop jar Log.jar " + LogJob.class.getName() + " input ouput");
        System.exit(0);
    }
    
    // Windows
    // Path inputPath = new Path("./input/access.log");
    // Path outputPath = new Path("./output/");
    
    // Linux
    Path inputPath = new Path(args[0]);
    Path outputPath = new Path(args[1]);
    
    // Windwos
    // FileInputFormat.setInputPaths(job, inputPath);
    // FileOutputFormat.setOutputPath(job, outputPath);
    
    // Linux
    FileInputFormat.setInputPaths(job, new Path(args[0]));
    FileOutputFormat.setOutputPath(job, new Path(args[1]));
  9. 打jar包,提交集群运行
    直接使用maven的生命周期的package工具构建jar包,并上传到服务器的/opt/data目录下,改名为Log.jar
  10. 为方便操作,编写脚本/opt/bin/project/exec-mapred-task.sh来执行MR程序

    
    #!/bin/bash
    
    input_path=$(cat /tmp/project-mapred-input-path.txt)
    
    #执行MapReduce程序
    dataformat=`date +%y-%m-%d`
    echo "/opt/pkg/hadoop/bin/hadoop jar /opt/data/log.jar com.niit.log.LogJob $input_path /output/result/$dataformat"
    /opt/pkg/hadoop/bin/hadoop jar /opt/data/log.jar com.niit.log.LogJob $input_path /output/result/$dataformat
    /opt/pkg/hadoop/bin/hdfs dfs -cat /output/result/$dataformat/part-r-00000 > /tmp/project_mr_result.txt
    
    echo "======== mapred task result ========"
    echo $(cat /tmp/project_mr_result.txt)

Views: 249

Superset的基本介绍与安装

superset是由Airbnb(知名在线短租赁公司)开源的数据分析与可视化平台(曾用名Caravel、Panoramix),该工具主要特点是可自助分析、自定义仪表盘、分析结果可视化(导出)、用户/角色权限控制,还集成了一个SQL编辑器,可以进行SQL编辑查询对结果集进行保存可视化等。

1、superset基本介绍

我们已经了解到了superset是一款数据展示的工具,接下来 一起来了解一下superset的基本介绍。

核心功能:

1.快速创建数据可视化互动仪表盘

2.丰富的可视化图表模板,灵活可扩展

3.细粒度高可扩展性的安全访问模型,支持主要的认证供应商(数据库、OpenID、LDAP、OAuth 等)

4.简洁的语义层,可以控制数据资源在 UI 的展现方式

5.与 Druid(其实它貌似就是为了druid而生的)深度集成,可以快速解析大规模数据集

6.快速的通过配置装载仪表盘等

2、superset的安装

前面我们已经了解到superset的作用,接下来我们来进行superset的安装

第一步:linux验证python的环境

superset的安装运行需要依赖于python3的环境,我们这里安装使用的是centos7的linux操作系统,但是centos7的操作系统自带的python版本是2.x的版本

使用python命令来进行验证python版本

$ python
Python 2.7.5 (default, Nov 16 2020, 22:23:17) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> quit()

第二步:centos7.x安装python3.6版本

前面已经验证了centos7.x当中python的环境是2.x的版本,那么我们可以来给centos7.x安装python3.6的版本。

$ sudo  yum install wget
$ cd /usr/local/src/
$ wget https://www.python.org/ftp/python/3.6.0/Python-3.6.0.tgz
$ tar -zxf Python-3.6.0.tgz
$ cd Python-3.6.0

如果没有C编译环境则需要先安装, 执行:

sudo yum groupinstall -y "Development Tools"
$  ./configure --prefix=/usr/local/python
$ make
$ sudo make install

添加python环境变量

$ sudo  vim /etc/profile
#末尾添加以下内容
export PYTHON_HOME=/usr/local/python
export PATH=:$PYTHON_HOME/bin:$PATH

# 使修改生效
$ source /etc/profile

检查python是否安装成功

$ python3.6
Python 3.6.0 (default, Feb 15 2021, 18:19:33) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> quit()

修改系统Python的环境变量

$ sudo  mv /usr/bin/python /usr/bin/python-2.7.5
$ sudo ln -s /usr/local/python/bin/python3.6 /usr/bin/python

因为yum是依赖python的,所以这里我们修改了默认的python,就要修改yum,让其运行指向旧的版本

修改第一个文件

$ sudo vi /usr/bin/yum
# 第一行修改成如下配置
#!/usr/bin/python2.7

修改第二个文件

$ sudo vi /usr/libexec/urlgrabber-ext-down
#第一行修改成如下配置
#!/usr/bin/python2.7

至此centos7上面的python3.x的环境已经安装成功

第三步:安装容器和密码验证工具

使用yum源在centos7上面安装容器以及密码验证工具

安装必要的依赖

$ sudo yum install -y libffi-devel python-devel python-wheel cyrus-sasl-devel openldap-devel
$ sudo yum -y install gcc-c++
$ sudo yum -y install deltarpm
$ sudo yum -y install pcre pcre-devel
$ sudo yum -y install zlib zlib-devel
$ sudo yum -y install openssl openssl--devel

安装pip3

$ sudo yum install python3-setuptools
$ sudo ln -s /usr/bin/pip3 /usr/bin/pip

查看已安装的第三方库

$ pip3 list
...
pip (9.0.3)
setuptools (39.2.0)

查看具体某第三方库的安装位置

$ pip3 show pip
Name: pip
Version: 9.0.3
Summary: The PyPA recommended tool for installing Python packages.
Home-page: https://pip.pypa.io/
Author: The pip developers
Author-email: python-virtualenv@groups.google.com
License: MIT
Location: /usr/lib/python3.6/site-packages
Requires:

为了避免继续安装第三方库的时候显示没有权限,设置本地第三方库安装目录的所有者为当前用户

sudo chown hadoop:hadoop -R /usr/lib/python3.6/site-packages
sudo chown hadoop:hadoop -R /usr/local

继续升级和安装第三方库

$ pip install --upgrade setuptools_rust
$ pip install --upgrade pip
$ pip install cryptography

python3-pip包含在python3-setuptools里面

网络原因下载失败可以多重试几次,如果还不行则考虑更换DNS、yum源或epel源。

第四步:安装Miniconda

miniconda是一个集成化的工具,可以给我们提供各种版本的python运行环境,我们这里通过miniconda来进行安装superset

下载miniconda安装的脚本,然后通过脚本来进行安装

$ cd /opt/download
$ wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
$ bash Miniconda3-latest-Linux-x86_64.sh 
# 通过以下命令开始执行脚本
$ bash Miniconda3-latest-Linux-x86_64.sh
Please, press ENTER to continue
>>> 按下enter回车键
#license证书说明,一路一直按enter回车键
Do you accept the license terms? [yes|no]
[no] >>> yes
Miniconda3 will now be installed into this location:
/root/miniconda3

  - Press ENTER to confirm the location
  - Press CTRL-C to abort the installation
  - Or specify a different location below
# 设置miniconda安装路径
[/home/hadoop/miniconda3] >>> /opt/pkg/miniconda3
Do you wish the installer to initialize Miniconda3
by running conda init? [yes|no]
[no] >>> yes

安装过程会自动修改家目录下的bashrc文件,如下:

...
# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$('/opt/pkg/miniconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; then
    eval "$__conda_setup"
else
    if [ -f "/opt/pkg/miniconda3/etc/profile.d/conda.sh" ]; then
        . "/opt/pkg/miniconda3/etc/profile.d/conda.sh"
    else
        export PATH="/opt/pkg/miniconda3/bin:$PATH"
    fi
fi
unset __conda_setup
# <<< conda initialize <<<

但是要使之生效还需要手动输入命令:

$ source ~/.bashrc 

miniconda安装成功之后,在我们的shell前面会有一个base这样的提示,表示我们目前出在miniconda的基础环境当中,我们可以通过以下命令来取消激活base环境

$ conda config --set auto_activate_base false

第五步:创建python3.8的虚拟环境

前面我们已经安装好了miniconda的基础环境,接下来我们来通过conda创建Python3.8的虚拟环境

1、配置conda国内镜像

$ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
$ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
$ conda config --set show_channel_urls yes 

2、创建Python3.8的虚拟环境

$ conda create --name superset  python=3.8

Proceed ([y]/n)? y

3、激活superset环境

(base) [hadoop@ opt]# conda activate superset
(superset) [hadoop@hadoop100 opt]#

4、安装superset依赖

(superset)$ sudo yum install -y python-setuptools
(superset)$ sudo yum install -y gcc gcc-c++ libffi-devel python-devel python-pip python-wheel openssl-devel cyrus-sasl-devel openldap-devel

5、安装或者更新setuptools和pip

(superset)$ pip install --upgrade setuptools pip -i https://pypi.douban.com/simple

6、安装superset

# 创建管理员用户
(superset) $ export FLASK_APP=superset
# 安装superset
(superset) $ pip install apache-superset -i https://pypi.tuna.tsinghua.edu.cn/simple/

7、连接mysql的设置安装

(superset)$ pip install mysqlclient -i https://pypi.tuna.tsinghua.edu.cn/simple/
(superset)$ pip install pymssql -i https://pypi.tuna.tsinghua.edu.cn/simple/
(superset)$ pip install pillow -i https://pypi.tuna.tsinghua.edu.cn/simple/
异常处理

注意:如果在执行命令 pip install mysqlclient -i https://pypi.tuna.tsinghua.edu.cn/simple/ 产生错误,错误如下的话

错误如下:
OSError: mysql_config not found

解决:
安装依赖:

(superset)$ sudo yum install gcc gcc-devel python-devel

(superset)$ sudo rpm -ivh https://mirrors.tuna.tsinghua.edu.cn/epel/epel-release-latest-7.noarch.rpm
(superset)$ sudo yum install mysql-devel

(superset)$ pip install mysqlclient -i https://pypi.tuna.tsinghua.edu.cn/simple/

如果安装mysql-devel过程中提示缺少mariadb-devel.x86_64或者其他依赖,使用yum install安装即可。

但如果你的虚拟机的mariadb相关包已经被卸载并且替换成了mysql,也可以利用mysql的源来安装mysql-devel,需要注意的是安装的包名很可能不再是mysql-devel而要改成mysql-community-devel.下面是使用mysql源安装mysql-devel的例子

$ sudo rpm -ivh http://repo.mysql.com/mysql57-community-release-el7-8.noarch.rpm
$ sudo yum install mysql-community-devel -y

报错:

GPG 密钥已安装,但是不适用于此软件包。请检查源的公钥 URL 是否配置正确。

解决方法:

在mysql官网搜关键字GPG,找到了解决方案,大意是如果使用的4.1以上版本的rpm的话,除了import mysql的公钥到个人用户的配置中,还需要import mysql的公钥到RPM的配置中。

$ gpg --export -a 3a79bd29 > 3a79bd29.asc
$ rpm --import 3a79bd29.asc
$ rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022

再次执行:

sudo yum install mysql-community-devel -y

8、初始化数据库

(superset)$  superset db upgrade

如果出现错误如下

ModuleNotFoundError: No module named 'dataclasses'

解决:

#安装dataclasses
(superset) $ pip install dataclasses

问题2:

ImportError: cannot import name ‘soft_unicode’ from ‘markupsafe’

这个错误好像是新版本的markupsafe代码变动问题产生的,需要退回到2.0.1

解决办法:

python -m pip install markupsafe==2.0.1
#或者
pip3 install --force-reinstall MarkupSafe==2.0.1

问题3:

ImportError: cannot import name ‘TypedDict’ from ‘typing’ (/opt/module/miniconda3/envs/superset/lib/python3.7/typing.py)

出现这个问题的原因是虚拟环境中的python版本低了,因为python3.7缺少TypedDict 这个类型。

解决办法:
删除原环境, 重新创建一个python3.8的环境就行。

以上问题都修改好后, 最后重启初始化数据库:

(superset) $  superset db upgrade

8、创建管理员用户

(superset) $ export FLASK_APP=superset

(superset) $ flask fab create-admin
Username [admin]: admin
User first name [admin]: admin
User last name [user]: admin
Email [admin@fab.org]: admin
Password: admin
Repeat for confirmation: admin

注意: 如果 flask fab create-admin 不可用使用, 可以换成如下命令创建用户:

(superset) $ superset fab create-admin

第六步:启动superset

以上步骤完成之后,准备启动superset

1、初始化superset

(superset) $ superset init

2、安装gunicorn

(superset) $ pip install gunicorn -i https://pypi.douban.com/simple/

2、启动superset

(superset) $ superset run -p 8288 -h hadoop100 --with-threads  --reload --debugger

或者使用以下命令启动

(superset) $ gunicorn --workers 5 --timeout 120 --bind hadoop100:8288  "superset.app:create_app()" --daemon

第七步:superset的停止与退出conda环境

如果需要停止superset可以使用以下命令来停止superset

1、停止superset

(superset) [root@node03 opt]#  ps -ef | awk '/superset/ && !/awk/{print $2}' | xargs kill -9

2、退出superset环境

(superset) [root@node03 opt]# conda deactivate

第八步:浏览器访问superset

使用浏览器访问地址

http://hadoop100:8288/

输入用户名:admin
密码:admin

第九步:开发superset的启动与停止脚本

vim superset-service.sh
#!/bin/bash

superset_status(){
  result=<code>ps -ef | awk '/gunicorn/ && !/awk/{print $2}' | wc -l
  if [[ $result -eq 0 ]]; then
    return 0
  else
    return 1
  fi
}

superset_start(){
  # 该段内容取自~/.bashrc,进行conda初始化
  # >>> conda initialize >>>
  # !! Contents within this block are managed by 'conda init' !!
  __conda_setup="$('/opt/pkg/miniconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
  if [ $? -eq 0 ]; then
    eval "$__conda_setup"
  else
    if [ -f "/opt/pkg/miniconda3/etc/profile.d/conda.sh" ]; then
      . "/opt/pkg/miniconda3/etc/profile.d/conda.sh"
    else
      export PATH="/opt/pkg/miniconda3/bin:$PATH"
    fi
  fi

  unset __conda_setup
  # <<< conda initialize <<<
  superset_status >/dev/null 2>&1
  if [[ $? -eq 0 ]]; then
    conda activate superset ; gunicorn --workers 5 --timeout 120 --bind hadoop100:8787 --daemon 'superset.app:create_app()'
  echo "启动superset,浏览器访问 http://hadoop100:8787"
  else
    echo "superset正在运行"
  fi
  }

superset_stop(){
  superset_status >/dev/null 2>&1
  if [[ $? -eq 0 ]]; then
    echo "superset未在运行"
  else
    ps -ef | awk '/gunicorn/ && !/awk/{print $2}' | xargs kill -9
  fi
}

case $1 in
start )
  echo "启动Superset"
  superset_start
;;
stop )
  echo "停止Superset"
  superset_stop
;;
restart )
  echo "重启Superset"
  superset_stop
  superset_start
;;
status )
  superset_status >/dev/null 2>&1
  if [[ $? -eq 0 ]]; then
    echo "superset未在运行"
  else
    echo "superset正在运行, 浏览器访问 http://hadoop100:8787"
  fi
esac

然后就可以使用命令 superset-service.sh (start|status|stop)来启动superset、查看superset状态、关闭superset了。

启动superset后,打开浏览器访问http://hadoop100:8787

Superset的基础使用

创建数据库连接

file
具体配置为
file

创建数据集

file

创建图表

根据数据集创建需要展示的图标(Chart)

表1

爬取的总岗位数
file

表2

不同城市提供的大数据相关岗位数量比较

file

表3

不同城市提供的大数据相关岗位的薪资倒序排列 - 取TopN
file

表4

岗位标签做成词云统计

file

创建仪表盘

仪表盘可以将需要展示的所有图标布局到一起。

file
布局后

file

将仪表盘设置为实时更新

如果是需要实时更新数据的表,可以设置同步间隔时间

file

输入用户名(admin)和密码(admin)登陆即可使用superset进行数据可视化展示。

加载官方示例数据集

superset load-examples

由于原因是example数据是存放在github的,可能导致无法直接下载或者下载超时,可提前到官方手动下载文件到本地:

$ wget --no-check-certificate  https://github.com/apache-superset/examples-data/archive/refs/heads/master.zip

$ unzip master.zip

$ cd examples-data-master

$ $ python3 -m http.server 7887
Serving HTTP on 0.0.0.0 port 7887 (http://0.0.0.0:7887/) ...

第三步,在网址栏输入http://(自己电脑的IP):【端口号】,就可以看到你当时的目录,http服务搭建完成

查找superset安装位置

pip3 list -v | grep apache-superset
cd /opt/pkg/miniconda3/envs/superset/lib/python3.8/site-packages/superset/

sed -i 's/BASE_URL = .*"/BASE_URL = "http:\/\/hadoop100:7887\/"/g' ./examples/helpers.py

sed -i 's/https:\/\/github.com\/apache-superset\/examples-data\/raw\/master\//http:\/\/hadoop100\//g' ./examples/configs/datasets/examples/*.yaml

sed -i 's/https:\/\/github.com\/apache-superset\/examples-data\/raw\/lowercase_columns_examples\//http:\/\/hadoop100:7887\//g' ./examples/configs/datasets/examples/*.yaml

sed -i 's/https:\/\/raw.githubusercontent.com\/apache-superset\/examples-data\/master\//http:\/\/hadoop100\//g' ./examples/configs/datasets/examples/*.yaml

保存好

再回到最开始尝试:

superset load-examples

最后重新初始化superset

superset init

登录superset网站,查看示例数据集和示例图标:

Views: 80

Hive的概念

1 Hive的概念

Hive是基于Hadoop的一个数据仓库工具

  • 可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。

  • 其本质是将SQL转换为MapReduce的任务进行运算,底层由HDFS来提供数据的存储支持,说白了hive可以理解为一个将SQL转换为MapReduce任务的工具,甚至更进一步可以说hive就是一个MapReduce的客户端

2 Hive与数据库的区别

Hive 具有 SQL 数据库的外表,但应用场景完全不同。

Hive 只适合用来做海量离线数据统计分析,也就是数据仓库。

3 Hive的优缺点

优点

  • 操作接口采用类SQL语法,提供快速开发的能力(简单、容易上手)。

    • 避免了去写MapReduce,减少开发人员的学习成本。

    • Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。

缺点

  • Hive 的查询延迟很严重

  • hadoop jar xxxx.jar xxx.class /input /output

    • 进行任务的划分,然后进行计算资源的申请

    • map 0% reduce 0%

    • map 10% reduce 0%

  • Hive 不支持事务

4 Hive架构原理

1、用户接口:Client

- CLI(hive shell)
  • JDBC/ODBC(java访问hive)

  • WEBUI(浏览器访问hive)

2、元数据:Metastore

  • 元数据包括:表名、表所属的数据库(默认是default)、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等;
  • 默认存储在自带的derby数据库中,推荐使用MySQL存储Metastore

3、Hadoop集群

  • 使用HDFS进行存储,使用MapReduce进行计算。

4、Driver:驱动器

  • 解析器(SQL Parser)
    将SQL字符串转换成抽象语法树AST
    对AST进行语法分析,比如表是否存在、字段是否存在、SQL语义是否有误

  • 编译器(Physical Plan):将AST编译生成逻辑执行计划

  • 优化器(Query Optimizer):对逻辑执行计划进行优化

  • 执行器(Execution):把逻辑执行计划转换成可以运行的物理计划。对于Hive来说默认就是mapreduce任务

hive1

Views: 45

数据仓库概念

1.1 数据仓库的基本概念

  • 数据仓库的英文名称为Data Warehouse,可简写为DW或DWH。

  • 数据仓库的目的是构建面向分析的集成化数据环境,为企业提供决策支持(Decision Support)。它出于分析性报告和决策支持的目的而创建。

  • 数据仓库本身并不“生产”任何数据,同时自身也不需要“消费”任何的数据,数据来源于外部,并且开放给外部应用,这也是为什么叫“仓库”,而不叫“工厂”的原因。

1.2 数据仓库的主要特征

  • 数据仓库是面向主题的(Subject-Oriented)、集成的(Integrated)、非易失的(Non-Volatile)和时变的(Time-Variant )数据集合,用以支持管理决策。

image-20201012101029922

1.3 数据仓库与数据库区别

  • 数据库与数据仓库的区别实际讲的是OLTP 与 OLAP 的区别。
  • 操作型处理,叫联机事务处理 OLTP(On-Line Transaction Processing),也可以称面向交易的处理系统,它是针对具体业务在数据库联机的日常操作,通常对少数记录进行查询、修改。用户较为关心操作的响应时间、数据的安全性、完整性和并发支持的用户数等问题。传统的数据库系统作为数据管理的主要手段,主要用于操作型处理OLTP。
  • 分析型处理,叫联机分析处理 OLAP(On-Line Analytical Processing),一般针对某些主题的历史数据进行分析,支持管理决策。
  • 首先要明白,数据仓库的出现,并不是要取代数据库。
  • 数据库是面向事务的设计,数据仓库是面向主题设计的。

    • 数据库一般存储业务数据,数据仓库存储的一般是历史数据。

    • 数据库设计是尽量避免冗余,一般针对某一业务应用进行设计;比如一张简单的User表,记录用户名、密码等简单数据即可,符合业务应用,但是不符合分析;数据仓库在设计是有意引入冗余,依照分析需求,分析维度、分析指标进行设计。

    • 数据库是为捕获数据而设计,数据仓库是为分析数据而设计。

    • 以银行业务为例。数据库是事务系统的数据平台,客户在银行做的每笔交易都会写入数据库,被记录下来,这里,可以简单地理解为用数据库记账。数据仓库是分析系统的数据平台,它从事务系统获取数据,并做汇总、加工,为决策者提供决策的依据。比如,某银行某分行一个月发生多少交易,该分行当前存款余额是多少。如果存款又多,消费交易又多,那么该地区就有必要设立ATM了。

    • 显然,银行的交易量是巨大的,通常以百万甚至千万次来计算。事务系统是实时的,这就要求时效性,客户存一笔钱需要几十秒是无法忍受的,这就要求数据库只能存储很短一段时间的数据。而分析系统是事后的,它要提供关注时间段内所有的有效数据。这些数据是海量的,汇总计算起来也要慢一些,但是,只要能够提供有效的分析数据就达到目的了。

    • 数据仓库,是在数据库已经大量存在的情况下,为了进一步挖掘数据资源、为了决策需要而产生的,它决不是所谓的“大型数据库”。

1.4 数据仓库分层架构

  • 按照数据流入流出的过程,数据仓库架构可分为三层——源数据层数据仓库层数据应用层。

  • 数据仓库的数据来源于不同的源数据,并提供多样的数据应用,数据自下而上流入数据仓库后向上层开放应用,而数据仓库只是中间集成化数据管理的一个平台。

  • 源数据层(ODS):此层数据无任何更改,直接沿用外围系统数据结构和数据,不对外开放;为临时存储层,是接口数据的临时存储区域,为后一步的数据处理做准备。

  • 数据仓库层(DW):也称为细节层,DW层的数据应该是一致的、准确的、干净的数据,即对源系统数据进行了清洗(去除了杂质)后的数据。

  • 数据应用层(DA或APP):前端应用直接读取的数据源;根据报表、专题分析需求而计算生成的数据。

  • 数据仓库从各数据源获取数据及在数据仓库内的数据转换和流动都可以认为是ETL(抽取Extra, 转化Transfer, 装载Load)的过程,ETL是数据仓库的流水线,也可以认为是数据仓库的血液,它维系着数据仓库中数据的新陈代谢,而数据仓库日常的管理和维护工作的大部分精力就是保持ETL的正常和稳定。

  • 为什么要对数据仓库分层?

    • 用空间换时间,通过大量的预处理来提升应用系统的用户体验(效率),因此数据仓库会存在大量冗余的数据;
    • 不分层的话,如果源业务系统的业务规则发生变化将会影响整个数据清洗过程,工作量巨大。
    • 通过数据分层管理可以简化数据清洗的过程,因为把原来一步的工作分到了多个步骤去完成,相当于把一个复杂的工作拆成了多个简单的工作,把一个大的黑盒变成了一个白盒,每一层的处理逻辑都相对简单和容易理解,这样我们比较容易保证每一个步骤的正确性,当数据发生错误的时候,往往我们只需要局部调整某个步骤即可。

    image-20201012101134818

Views: 48