CDH Hadoop 3.0 使用OSS作为储存 2021-09-07

简介: CDH和CM(Cloudera Manager) CDH (Cloudera’s Distribution, including Apache Hadoop)是众多Hadoop发行版本中的一种,由Cloudera维护,目前有不少用户使用这个发行版本。

CDH和CM(Cloudera Manager)

CDH (Cloudera’s Distribution, including Apache Hadoop)是众多Hadoop发行版本中的一种,由Cloudera维护,目前有不少用户使用这个发行版本。CM是管理集群的工具,使用它可以很方便地部署、安装、运维包括Hadoop、Spark、Hive在内的大数据开源组件。 目前,CDH的最新发布的版本是CDH6.0.1,这个发行版本中,Hadoop的版本是3.0.0,天然支持OSS;而CDH5中的Hadoop是2.6,还不支持OSS(目前Apache Hadoop支持OSS的最低版本是2.9.1)。下面将介绍如何使CDH5支持OSS读写。

CDH5支持读写OSS

问题

由于CDH5的httpclient和httpcore这两个组件版本较低(4.2.5),而OSS SDK要求这两个组件的版本较高。然而Resource Manager要求的httpclient和httpcore必须是低版本。因此,下面提供了一个workaround方案。

搭建CDH集群

首先,我们根据官方文档搭建好CDH集群(这里以CDH 5.14.4为例);


image.png

下面的步骤需要在所有的CDH节点执行

下载支持包

http://gosspublic.alicdn.com/hadoop-spark/hadoop-oss-cdh-5.14.4.tar.gz

下载这个版本的CDH支持OSS的支持包并解压,里面的文件是:

[root@cdh-master ~]# ls -lh hadoop-oss-cdh-5.14.4/
总用量 2.7M
-rw-r--r-- 1 root root 114K 10月  8 17:36 aliyun-java-sdk-core-3.4.0.jar
-rw-r--r-- 1 root root 770K 10月  8 17:36 aliyun-java-sdk-ecs-4.2.0.jar
-rw-r--r-- 1 root root 211K 10月  8 17:36 aliyun-java-sdk-ram-3.0.0.jar
-rw-r--r-- 1 root root  13K 10月  8 17:36 aliyun-java-sdk-sts-3.0.0.jar
-rw-r--r-- 1 root root 550K 10月  8 17:36 aliyun-sdk-oss-3.4.1.jar
-rw-r--r-- 1 root root  70K 10月  8 17:36 hadoop-aliyun-2.6.0-cdh5.14.4.jar
-rw-r--r-- 1 root root 720K 10月  8 18:16 httpclient-4.5.2.jar
-rw-r--r-- 1 root root 320K 10月  8 18:16 httpcore-4.4.4.jar

这个支持包是根据CDH5.14.4中Hadoop的版本,并打了Apache Hadoop对OSS支持的patch后编译得到,其他CDH5的小版本对OSS的支持后续也将陆续提供。

部署

将解压后的文件复制到CDH5的安装目录中的jars文件夹中,CDH5的安装目录CDH_HOME(以在/opt/cloudera/parcels/CDH-5.14.4-1.cdh5.14.4.p0.3为例)结构是

[root@cdh-master CDH-5.14.4-1.cdh5.14.4.p0.3]# ls -lh
总用量 100K
drwxr-xr-x  2 root root 4.0K 6月  12 21:03 bin
drwxr-xr-x 27 root root 4.0K 6月  12 20:57 etc
drwxr-xr-x  5 root root 4.0K 6月  12 20:57 include
drwxr-xr-x  2 root root  68K 6月  12 21:09 jars
drwxr-xr-x 38 root root 4.0K 6月  12 21:03 lib
drwxr-xr-x  3 root root 4.0K 6月  12 20:57 lib64
drwxr-xr-x  3 root root 4.0K 6月  12 20:51 libexec
drwxr-xr-x  2 root root 4.0K 6月  12 21:02 meta
drwxr-xr-x  4 root root 4.0K 6月  12 21:03 share

[root@cdh-master CDH-5.14.4-1.cdh5.14.4.p0.3]# ls -ltrh jars/
总用量 1.4G
.......
-rw-r--r-- 1 root root  114K 10月 28 14:27 aliyun-java-sdk-core-3.4.0.jar
-rw-r--r-- 1 root root  770K 10月 28 14:27 aliyun-java-sdk-ecs-4.2.0.jar
-rw-r--r-- 1 root root   13K 10月 28 14:27 aliyun-java-sdk-sts-3.0.0.jar
-rw-r--r-- 1 root root  211K 10月 28 14:27 aliyun-java-sdk-ram-3.0.0.jar
-rw-r--r-- 1 root root  550K 10月 28 14:27 aliyun-sdk-oss-3.4.1.jar
-rw-r--r-- 1 root root   70K 10月 28 14:27 hadoop-aliyun-2.6.0-cdh5.14.4.jar
-rw-r--r-- 1 root root  720K 10月 28 14:27 httpclient-4.5.2.jar
-rw-r--r-- 1 root root  320K 10月 28 14:27 httpcore-4.4.4.jar

进入到$CDH_HOME/lib/hadoop目录, 执行如下命令

[root@cdh-master hadoop]# rm -f lib/httpclient-4.2.5.jar 
[root@cdh-master hadoop]# rm -f lib/httpcore-4.2.5.jar 
[root@cdh-master hadoop]# ln -s ../../jars/hadoop-aliyun-2.6.0-cdh5.14.4.jar hadoop-aliyun-2.6.0-cdh5.14.4.jar
[root@cdh-master hadoop]# ln -s hadoop-aliyun-2.6.0-cdh5.14.4.jar hadoop-aliyun.jar
[root@cdh-master hadoop]# cd lib
[root@cdh-master lib]# ln -s ../../../jars/aliyun-java-sdk-core-3.4.0.jar aliyun-java-sdk-core-3.4.0.jar
[root@cdh-master lib]# ln -s ../../../jars/aliyun-java-sdk-ecs-4.2.0.jar aliyun-java-sdk-ecs-4.2.0.jar
[root@cdh-master lib]# ln -s ../../../jars/aliyun-java-sdk-ram-3.0.0.jar aliyun-java-sdk-ram-3.0.0.jar 
[root@cdh-master lib]# ln -s ../../../jars/aliyun-java-sdk-sts-3.0.0.jar aliyun-java-sdk-sts-3.0.0.jar 
[root@cdh-master lib]# ln -s ../../../jars/aliyun-sdk-oss-3.4.1.jar aliyun-sdk-oss-3.4.1.jar 
[root@cdh-master lib]# ln -s ../../../jars/httpclient-4.5.2.jar httpclient-4.5.2.jar
[root@cdh-master lib]# ln -s ../../../jars/httpcore-4.4.4.jar httpcore-4.4.4.jar
[root@cdh-master lib]# ln -s ../../../jars/jdom-1.1.jar jdom-1.1.jar 

进入到Resurce Manager部署节点的$CDH_HOME/lib/hadoop-yarn/bin/目录,将yarn文件中的

CLASSPATH=${CLASSPATH}:$HADOOP_YARN_HOME/${YARN_DIR}/*
CLASSPATH=${CLASSPATH}:$HADOOP_YARN_HOME/${YARN_LIB_JARS_DIR}/*

替换为

CLASSPATH=$HADOOP_YARN_HOME/${YARN_DIR}/*:${CLASSPATH}
CLASSPATH=$HADOOP_YARN_HOME/${YARN_LIB_JARS_DIR}/*:${CLASSPATH}

进入到Resurce Manager部署节点的$CDH_HOME/lib/hadoop-yarn/lib目录,执行

[root@cdh-master lib]# ln -s ../../../jars/httpclient-4.2.5.jar httpclient-4.2.5.jar [root@cdh-master lib]# ln -s ../../../jars/httpcore-4.2.5.jar httpcore-4.2.5.jar 

增加OSS配置 通过CM来增加配置(对于没有CM管理的集群,可以通过修改core-site.xml来达到) 这里以CM为例,需要增加如下配置:

image.png
配置项 说明
fs.oss.endpoint oss-cn-zhangjiakou-internal.aliyuncs.com 要连接的endpoint
fs.oss.accessKeyId access key id
fs.oss.accessKeySecret access key secret
fs.oss.impl org.apache.hadoop.fs.aliyun.oss.AliyunOSSFileSystem hadoop oss文件系统实现类,目前固定为这个
fs.oss.buffer.dir /tmp/oss 临时文件目录
fs.oss.connection.secure.enabled false 是否enable https, 根据需要来设置,enable https会影响性能
fs.oss.connection.maximum 2048 与oss的连接数,根据需要设置

相关参数的解释可以在这里找到 ##重启集群,验证读写OSS 增加配置后,根据CM提示重启集群,重启后,可以测试

# 测试写 hadoop fs -mkdir oss://{your-bucket-name}/hadoop-test 
# 测试读 hadoop fs -ls oss://{your-bucket-name}/

Impala查询OSS中的数据 Impala可以直接查询存储在HDFS的数据,在CDH5支持OSS后,就可以直接查询存储在OSS的数据,由于上面所说的httpclient与httpcore的版本问题,需要在所有部署impala的节点上做如下步骤: 进入到$CDH_HOME/lib/impala/lib,执行如下命令

[root@cdh-master lib]# rm -f httpclient-4.2.5.jar httpcore-4.2.5.jar
[root@cdh-master lib]# ln -s ../../../jars/httpclient-4.5.2.jar httpclient-4.5.2.jar
[root@cdh-master lib]# ln -s ../../../jars/httpcore-4.4.4.jar httpcore-4.4.4.jar
[root@cdh-master lib]# ln -s ../../../jars/hadoop-aliyun-2.6.0-cdh5.14.4.jar hadoop-aliyun.jar
[root@cdh-master lib]# ln -s ../../../jars/aliyun-java-sdk-core-3.4.0.jar aliyun-java-sdk-core-3.4.0.jar
[root@cdh-master lib]# ln -s ../../../jars/aliyun-java-sdk-ecs-4.2.0.jar aliyun-java-sdk-ecs-4.2.0.jar
[root@cdh-master lib]# ln -s ../../../jars/aliyun-java-sdk-ram-3.0.0.jar aliyun-java-sdk-ram-3.0.0.jar
[root@cdh-master lib]# ln -s ../../../jars/aliyun-java-sdk-sts-3.0.0.jar aliyun-java-sdk-sts-3.0.0.jar
[root@cdh-master lib]# ln -s ../../../jars/aliyun-sdk-oss-3.4.1.jar aliyun-sdk-oss-3.4.1.jar
[root@cdh-master lib]# ln -s ../../../jars/jdom-1.1.jar jdom-1.1.jar

进入到$CDH_HOME/bin目录,修改impalad/statestored/catalogd这三个文件,在文件最后一行exec命令前,增加如下一行

export CLASSPATH=$CLASSPATH:${IMPALA_HOME}/lib/httpclient-4.5.2.jar:${IMPALA_HOME}/lib/httpcore-4.4.4.jar:${IMPALA_HOME}/lib/hadoop-aliyun.jar:${IMPALA_HOME}/lib/aliyun-java-sdk-core-3.4.0.jar:${IMPALA_HOME}/lib/aliyun-java-sdk-ecs-4.2.0.jar:${IMPALA_HOME}/lib/aliyun-java-sdk-ram-3.0.0.jar:${IMPALA_HOME}/lib/aliyun-java-sdk-sts-3.0.0.jar:${IMPALA_HOME}/lib/aliyun-sdk-oss-3.4.1.jar:${IMPALA_HOME}/lib/jdom-1.1.jar

重启所有节点的impala相关进程,这样impala就可以查询OSS的数据。 示例:TPC-DS的benchmark有一张表为call_center,目前假设存储在OSS中,为此,我们可以创建一个外部表指向它,并且查询这张表根据cc_country分组分别有多少条记录

[root@cdh-master ~]# impala-shell -i cdh-slave01:21000
Starting Impala Shell without Kerberos authentication
Connected to cdh-slave01:21000
Server version: impalad version 2.11.0-cdh5.14.4 RELEASE (build 20e635646a13347800fad36a7d0b1da25ab32404)
***********************************************************************************
Welcome to the Impala shell.
(Impala Shell v2.11.0-cdh5.14.4 (20e6356) built on Tue Jun 12 03:43:08 PDT 2018)

The HISTORY command lists all shell commands in chronological order.
***********************************************************************************
[cdh-slave01:21000] > drop table if exists call_center;
Query: drop table if exists call_center
[cdh-slave01:21000] >
[cdh-slave01:21000] > create external table call_center(
                    >       cc_call_center_sk         bigint
                    > ,     cc_call_center_id         string
                    > ,     cc_rec_start_date        string
                    > ,     cc_rec_end_date          string
                    > ,     cc_closed_date_sk         bigint
                    > ,     cc_open_date_sk           bigint
                    > ,     cc_name                   string
                    > ,     cc_class                  string
                    > ,     cc_employees              int
                    > ,     cc_sq_ft                  int
                    > ,     cc_hours                  string
                    > ,     cc_manager                string
                    > ,     cc_mkt_id                 int
                    > ,     cc_mkt_class              string
                    > ,     cc_mkt_desc               string
                    > ,     cc_market_manager         string
                    > ,     cc_division               int
                    > ,     cc_division_name          string
                    > ,     cc_company                int
                    > ,     cc_company_name           string
                    > ,     cc_street_number          string
                    > ,     cc_street_name            string
                    > ,     cc_street_type            string
                    > ,     cc_suite_number           string
                    > ,     cc_city                   string
                    > ,     cc_county                 string
                    > ,     cc_state                  string
                    > ,     cc_zip                    string
                    > ,     cc_country                string
                    > ,     cc_gmt_offset             double
                    > ,     cc_tax_percentage         double
                    > )
                    > row format delimited fields terminated by '|'
                    > location 'oss://{bucket}/call_center';

Query: create external table call_center(
      cc_call_center_sk         bigint
,     cc_call_center_id         string
,     cc_rec_start_date        string
,     cc_rec_end_date          string
,     cc_closed_date_sk         bigint
,     cc_open_date_sk           bigint
,     cc_name                   string
,     cc_class                  string
,     cc_employees              int
,     cc_sq_ft                  int
,     cc_hours                  string
,     cc_manager                string
,     cc_mkt_id                 int
,     cc_mkt_class              string
,     cc_mkt_desc               string
,     cc_market_manager         string
,     cc_division               int
,     cc_division_name          string
,     cc_company                int
,     cc_company_name           string
,     cc_street_number          string
,     cc_street_name            string
,     cc_street_type            string
,     cc_suite_number           string
,     cc_city                   string
,     cc_county                 string
,     cc_state                  string
,     cc_zip                    string
,     cc_country                string
,     cc_gmt_offset             double
,     cc_tax_percentage         double
)
row format delimited fields terminated by '|'
location 'oss://{bucket}/call_center'
Fetched 0 row(s) in 0.07s

[cdh-slave01:21000] > select cc_country, count(*) from call_center group by cc_country;
Query: select cc_country, count(*) from call_center group by cc_country
Query submitted at: 2018-10-28 16:21:13 (Coordinator: http://cdh-slave01:25000)
Query progress can be monitored at: http://cdh-slave01:25000/query_plan?query_id=fb4e09977145f367:3bdfe4d600000000
+---------------+----------+
| cc_country    | count(*) |
+---------------+----------+
| United States | 30       |
+---------------+----------+
Fetched 1 row(s) in 4.71s

其他版本的支持包

CDH5.8.5

http://gosspublic.alicdn.com/hadoop-spark/hadoop-oss-cdh-5.8.5.tar.gz

CDH5.4.4

http://gosspublic.alicdn.com/hadoop-spark/hadoop-oss-cdh-5.4.4.tar.gz

CDH6.3.2

http://gosspublic.alicdn.com/hadoop-spark/hadoop-oss-cdh-6.3.2.tar.gz 注:CDH6目前已经支持OSS,但CDH6支持的版本过低,很多优化没有包含在里面,这个支持包会及时包含OSS的优化。将优化包的内容复制到CDH6的安装目录中的jars文件夹中,然后参考CDH5的部署步骤执行即可(主要是更新aliyun-sdk-oss-3.4.1.jar以及将aliyun-java-sdk-*.jar符号链接到对应的位置)。

参考文章

https://yq.aliyun.com/articles/292792?spm=a2c4e.11155435.0.0.7ccba82fbDwfhK https://github.com/apache/hadoop/blob/trunk/hadoop-tools/hadoop-aliyun/src/site/markdown/tools/hadoop-aliyun/index.md

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351

推荐阅读更多精彩内容

  • Apache Hadoop _狭义上说,Hadoop指Apache一款java语言开发的开源框架,它的核心组件有:...
    VincentLeon阅读 247评论 0 0
  • [if !supportLists]第1章[endif]Cloudera Manager 1.1 CM简介 1.1...
    香锅麻辣四季豆阅读 1,214评论 0 1
  • CDH5 Hadoop集群完全离线安装说明 系统环境:CentOS6.5 64位 用到的文件 JDK1.8.0.1...
    钟敏_1788阅读 1,075评论 0 0
  • 概述 4V特征 Volume:数据量Variety:多样性、复杂性Velocity:速度Value:基于高度分析的...
    异同阅读 643评论 0 0
  • 16宿命:用概率思维提高你的胜算 以前的我是风险厌恶者,不喜欢去冒险,但是人生放弃了冒险,也就放弃了无数的可能。 ...
    yichen大刀阅读 6,042评论 0 4