CDH5 Hadoop如何支持读写OSS

本文涉及的产品
对象存储 OSS,20GB 3个月
日志服务 SLS,月写入数据量 50GB 1个月
对象存储 OSS,恶意文件检测 1000次 1年
简介: 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为例);
_2018_10_28_2_02_37


下面的步骤需要在所有的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目录, 执行如下命令 ```sh [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目录,执行 ```sh [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为例,需要增加如下配置: ![_2018_10_28_2_41_06](https://yqfile.alicdn.com/fa0b51e97a7eb3ec2b76f8547053bef773b37996.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的连接数,根据需要设置 相关参数的解释可以在[**这里**](https://github.com/apache/hadoop/blob/trunk/hadoop-tools/hadoop-aliyun/src/site/markdown/tools/hadoop-aliyun/index.md)找到 ##重启集群,验证读写OSS 增加配置后,根据CM提示重启集群,重启后,可以测试 ```sh # 测试写 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分组分别有多少条记录
```sql
[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

相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
目录
相关文章
|
6月前
|
敏捷开发 测试技术 持续交付
云效产品使用常见问题之账号授权就能对当前主账号下所有 OSS 进行读写权限如何解决
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
JavaScript 对象存储
JS - 阿里云 OSS 文件下载通用办法(支持跨域)
JS - 阿里云 OSS 文件下载通用办法(支持跨域)
4183 0
JS - 阿里云 OSS 文件下载通用办法(支持跨域)
|
1月前
|
分布式计算 Hadoop 网络安全
Hadoop-08-HDFS集群 基础知识 命令行上机实操 hadoop fs 分布式文件系统 读写原理 读流程与写流程 基本语法上传下载拷贝移动文件
Hadoop-08-HDFS集群 基础知识 命令行上机实操 hadoop fs 分布式文件系统 读写原理 读流程与写流程 基本语法上传下载拷贝移动文件
30 1
|
1月前
|
存储 机器学习/深度学习 缓存
Hadoop-07-HDFS集群 基础知识 分布式文件系统 读写原理 读流程与写流程 基本语法上传下载拷贝移动文件
Hadoop-07-HDFS集群 基础知识 分布式文件系统 读写原理 读流程与写流程 基本语法上传下载拷贝移动文件
44 1
|
3月前
|
存储 分布式计算 Hadoop
【揭秘Hadoop背后的秘密!】HDFS读写流程大曝光:从理论到实践,带你深入了解Hadoop分布式文件系统!
【8月更文挑战第24天】Hadoop分布式文件系统(HDFS)是Hadoop生态系统的关键组件,专为大规模数据集提供高效率存储及访问。本文深入解析HDFS数据读写流程并附带示例代码。HDFS采用NameNode和DataNode架构,前者负责元数据管理,后者承担数据块存储任务。文章通过Java示例演示了如何利用Hadoop API实现数据的写入与读取,有助于理解HDFS的工作原理及其在大数据处理中的应用价值。
92 1
|
6月前
|
存储 分布式计算 Hadoop
【Hadoop】HDFS 读写流程
【4月更文挑战第9天】【Hadoop】HDFS 读写流程
|
存储 SQL 弹性计算
手把手教你使用自建Hadoop访问全托管服务化HDFS(OSS-HDFS服务)
1. 服务介绍OSS-HDFS服务(JindoFS 服务)是一款云原生数据湖3.0存储产品,基于统一的元数据管理能力,在完全兼容 HDFS 文件系统接口的同时,提供充分的 POSIX 能力支持,能更好的满足大数据和 AI 领域丰富多样的数据湖计算场景。通过OSS-HDFS服务,无需对现有的 Hadoop/Spark 大数据分析应用做任何修改,通过简单的配置就可以像在原生HDFS中那样管理和访问数据
手把手教你使用自建Hadoop访问全托管服务化HDFS(OSS-HDFS服务)
|
分布式计算 Hadoop Java
Hadoop/Spark 访问 OSS 加速 | 学习笔记
快速学习Hadoop/Spark 访问 OSS 加速。
468 0
|
存储 缓存 分布式计算
Hadoop中HDFS的读写流程(面试重点)、为什么搜不到BlockPlacementPolicyDefault、网络拓扑-节点距离计算、机架感知(副本存储节点选择)
Hadoop中HDFS的读写流程(面试重点)、为什么搜不到BlockPlacementPolicyDefault、网络拓扑-节点距离计算、机架感知(副本存储节点选择)
Hadoop中HDFS的读写流程(面试重点)、为什么搜不到BlockPlacementPolicyDefault、网络拓扑-节点距离计算、机架感知(副本存储节点选择)
|
对象存储
oss 追加上传支持excel文件使用吗
oss 追加上传支持excel文件使用吗

相关产品

  • 对象存储