ETL数据仓库技术


一、数据仓库

与 MySQL 等数据库区别

数据库:面向业务,增删改查。

数据仓库:面向分析,数据分析、报表等。

二、Kettle安装

KettlePDI 以前的名称,PDI 的全称是Pentaho Data Integeration,Kettle 本意是水壶的意思,表达了数据流的含义。Kettle是一款国外开源的ETL工具,纯java编写,可以在Window、Linux、Unix上运行,绿色无需安装,数据抽取高效稳定。

下载:https://sourceforge.net/projects/pentaho/files/Data%20Integration/

安装之前需要配置JDK

下载后运行Spoon.bat即可

连接MySQL是需要在 lib 文件夹中放入 mysql-connector-java-5.1.48.jar

下载:https://mvnrepository.com/artifact/mysql/mysql-connector-java/5.1.48

三、Kettle使用

1、txt -> Excel

(1)新建

文件 –> 新建 –> 转换

转换构建流程

(2)配置输入

双击工作区中的 文本文件输入

文本输入图1

文本输入图2

查看字段

文本输入图3

(3)配置输出

双击 Excel输出

Excel输出图1

可查看字段

Excel输出图2

(4)执行

执行

2、连接 MySQL

(1)配置数据库

在主对象的DB连接中配置,或双击表输入、表输出

连接MySQL配置

解决乱码问题

characterEncoding = utf8

解决乱码

(2)表输入、表输出

image-20210521213913591

(3)插入/更新

image-20210521214131061

(4)删除

根据条件删除目标库中所有满足条件的数据

以下为:删除目标表 id 与 源表一致的数据

image-20210521220213941

3、转换组件

(1)排序

相当于 order by 的字段

image-20210521221058578

(2)值映射

将指定的字段值,映射为另一个指定的值

image-20210524155639309

(3)字段选择

可匹配不同字段名

字段选择

(4)增加常量

可用于填充常量到某个字段

增加常量

(5)过滤记录

过滤记录

4、流程组件

(1)swich/case

连线时出现选择输出

1、2、与已有的输出结果相同的输出

3、默认输出,即未被匹配到的都输出到此处

4、创建一个输出分支

image-20210521232123360

image-20210521233433686

5、脚本

(1)sql脚本

image-20210522001839578

(2)Java代码

双击Main生成代码模板

image-20210524154604263

public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException {
  if (first) {
    first = false;

    /* TODO: Your code here. (Using info fields)

    FieldHelper infoField = get(Fields.Info, "info_field_name");
    RowSet infoStream = findInfoRowSet("info_stream_tag");
    Object[] infoRow = null;
    int infoRowCount = 0;

    // Read all rows from info step before calling getRow() method, which returns first row from any
    //首次运行时执行,用来获取字段名
    // input rowset. As rowMeta for info and input steps varies getRow() can lead to errors.
    while((infoRow = getRowFrom(infoStream)) != null){

      // do something with info data
      infoRowCount++;
    }
    */
  }

  Object[] r = getRow();

  if (r == null) {
    setOutputDone();
    return false;
  }

  // It is always safest to call createOutputRow() to ensure that your output row's Object[] is large
  // enough to handle any new fields you are creating in this step. 创建新的字段
  r = createOutputRow(r, data.outputRowMeta.size());

  /* TODO: Your code here. (See Sample)

  // Get the value from an input field  获取输入字段,
  String foobar = get(Fields.In, "a_fieldname").getString(r);

  foobar += "bar";

  // Set a value in a new output field    设置输出字段的值
  get(Fields.Out, "output_fieldname").setValue(r, foobar);

  */
  // Send the row on to the next step.
  putRow(data.outputRowMeta, r);

  return true;
}

双击左侧字段即可生成 get、set代码

生成代码

6、变量

(1)双击空白处,设置参数名

image-20210522132217884

(2)使用变量

image-20210522132443653

(3)赋值

image-20210522132613498

7、作业(周期执行)

(1)新建作业

文件 – 新建 – 作业

image-20210522134824436

(2)配置执行时间

image-20210522135024770

然后在转换中配置 转换的文件 ,在成功中配置作业名

image-20210522135634397

停止按钮为启动旁边的

三、Kettle案例

1、数据库导出

导出到空表

表输入 -》 表输出

2、数据库更新

根据条件匹配相同的数据行,并判断非条件列是否一致,不一致则更新

表输入 -> 插入/更新

四、Linux 使用 Kettle

1、安装部署

1、整个文件夹传上去

2、测试能否运行

执行

./kitchen.sh

出现以下情况,因为没有赋予权限,ls -l查看是否有x的权限

-bash: ./spoon.sh: Permission denied

执行以下命令赋予权限

chmod +x *.sh

3、再次执行./kitchen.sh

如下,存在一个警告

[root@lx01 data-integration]# ./kitchen.sh 
#######################################################################
WARNING:  no libwebkitgtk-1.0 detected, some features will be unavailable
    Consider installing the package with apt-get or yum.
    e.g. 'sudo apt-get install libwebkitgtk-1.0-0'
#######################################################################
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=256m; support was removed in 8.0
Options:
  -rep            = Repository name
  -user           = Repository username
  -pass           = Repository password
  -job            = The name of the job to launch
  -dir            = The directory (dont forget the leading /)
  -file           = The filename (Job XML) to launch
  -level          = The logging level (Basic, Detailed, Debug, Rowlevel, Error, Minimal, Nothing)
  -logfile        = The logging file to write to
  -listdir        = List the directories in the repository
  -listjobs       = List the jobs in the specified directory
  -listrep        = List the available repositories
  -norep          = Do not log into the repository
  -version        = show the version, revision and build date
  -param          = Set a named parameter <NAME>=<VALUE>. For example -param:FILE=customers.csv
  -listparam      = List information concerning the defined parameters in the specified job.
  -export         = Exports all linked resources of the specified job. The argument is the name of a ZIP file.
  -custom         = Set a custom plugin specific option as a String value in the job using <NAME>=<Value>, for example: -custom:COLOR=Red
  -maxloglines    = The maximum number of log lines that are kept internally by Kettle. Set to 0 to keep all rows (default)
  -maxlogtimeout  = The maximum age (in minutes) of a log line while being kept internally by Kettle. Set to 0 to keep all rows indefinitely (default)

解决方法

wget ftp://ftp.pbone.net/mirror/ftp5.gwdg.de/pub/opensuse/repositories/home:/matthewdva:/build:/EPEL:/el7/RHEL_7/x86_64/webkitgtk-2.4.9-1.el7.x86_64.rpm 

yum install webkitgtk-2.4.9-1.el7.x86_64.rpm

安装成功

2、执行转换任务

1、设置输入输出路径参数

设置参数

输入参数

输出参数

2、使用 pan.sh 执行转换(在kettle主目录下)

image-20210523220952030

pan.sh -file 转换文件名 -level Basic -param:input=输入文件路径 -param:output=输出文件路径

-level :日志级别

2、执行作业任务

1、配置转换

image-20210523222927135

2、配置作业参数

image-20210523223001578

3、执行作业

image-20210523223334239

./kitchen.sh -file 作业文件路径 -level Basic -param:input=输入文件路径

3、后台运行、结束作业

nohup /usr/kettle/data-integration/kitchen.sh -file=/root/Downloads/kettle/pms.kjb -log=/root/Downloads/kettle/pms-20191016START.log &
ps aux|grep kettle|awk '{print $2}'|xargs kill -9

nohup ibus-daemon &

ctrl + c

命令 描述
-file job或trans文件路径
-norep 标明不是资源库里的文件
-param 参数设置
-logfile log输出文件名
-level log级别 (Basic, Detailed, Debug, Rowlevel, Error, Nothing)

  目录