Apache Hadoop如何支持读写OSS

本文详细介绍如何在Hadoop2.7.2版本中集成阿里云OSS,通过下载并部署支持包,修改配置文件,使Hadoop能够读写OSS。文章提供了具体的步骤和示例,包括teragen和distcp的运行示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

2017.12.13日Apache Hadoop 3.0.0正式版本发布,默认支持阿里云OSS对象存储系统,作为Hadoop兼容的文件系统,后续版本号大于等于Hadoop 2.9.x系列也支持OSS。然而,低版本的Apache Hadoop官方不再支持OSS,本文将描述如何通过支持包来使Hadoop 2.7.2能够读写OSS。

如何使用

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

下载支持包

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

解压这个支持包,里面的文件是:

[root@apache hadoop-oss-2.7.2]# ls -lh
总用量 3.1M
-rw-r--r-- 1 root root 3.1M 2月  28 17:01 hadoop-aliyun-2.7.2.jar

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

部署

首先将文件hadoop-aliyun-2.7.2.jar复制到$HADOOP_HOME/share/hadoop/tools/lib/目录下;

修改​​$HADOOP_HOME/libexec/hadoop-config.sh文件,在文件的327行加下代码:

CLASSPATH=$CLASSPATH:$TOOL_PATH

修改的目的就是将$HADOOP_HOME/share/hadoop/tools/lib/放到Hadoop的CLASSPATH里面;下面是修改前后,这个文件的diff供参考(hadoop-config.sh.bak是修改前的文件):

[root@apache hadoop-2.7.2]# diff -C 3 libexec/hadoop-config.sh.bak libexec/hadoop-config.sh
*** libexec/hadoop-config.sh.bak    2019-03-01 10:35:59.629136885 +0800
--- libexec/hadoop-config.sh    2019-02-28 16:33:39.661707800 +0800
***************
*** 325,330 ****
--- 325,332 ----
  CLASSPATH=${CLASSPATH}:$HADOOP_MAPRED_HOME/$MAPRED_DIR'/*'
fi

+ CLASSPATH=$CLASSPATH:$TOOL_PATH
+
# Add the user-specified CLASSPATH via HADOOP_CLASSPATH
# Add it first or last depending on if user has
# set env-var HADOOP_USER_CLASSPATH_FIRST

增加OSS的配置

修改core-site.xml文件,增加如下配置项:

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

相关参数的解释可以在这里找到

重启集群,验证读写OSS

增加配置后,重启集群,重启后,可以测试

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

运行teragen

[root@apache hadoop-2.7.2]# hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar teragen -Dmapred.map.tasks=100 10995116 oss://{your-bucket-name}/1G-input
19/02/28 16:38:59 INFO client.RMProxy: Connecting to ResourceManager at apache/192.168.0.176:8032
19/02/28 16:39:01 INFO terasort.TeraSort: Generating 10995116 using 100
19/02/28 16:39:01 INFO mapreduce.JobSubmitter: number of splits:100
19/02/28 16:39:01 INFO Configuration.deprecation: mapred.map.tasks is deprecated. Instead, use mapreduce.job.maps
19/02/28 16:39:01 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1551343125387_0001
19/02/28 16:39:02 INFO impl.YarnClientImpl: Submitted application application_1551343125387_0001
19/02/28 16:39:02 INFO mapreduce.Job: The url to track the job: http://apache:8088/proxy/application_1551343125387_0001/
19/02/28 16:39:02 INFO mapreduce.Job: Running job: job_1551343125387_0001
19/02/28 16:39:09 INFO mapreduce.Job: Job job_1551343125387_0001 running in uber mode : false
19/02/28 16:39:09 INFO mapreduce.Job:  map 0% reduce 0%
19/02/28 16:39:18 INFO mapreduce.Job:  map 1% reduce 0%
19/02/28 16:39:19 INFO mapreduce.Job:  map 2% reduce 0%
19/02/28 16:39:21 INFO mapreduce.Job:  map 4% reduce 0%
19/02/28 16:39:25 INFO mapreduce.Job:  map 5% reduce 0%
19/02/28 16:39:28 INFO mapreduce.Job:  map 6% reduce 0%
......
19/02/28 16:42:36 INFO mapreduce.Job:  map 94% reduce 0%
19/02/28 16:42:38 INFO mapreduce.Job:  map 95% reduce 0%
19/02/28 16:42:41 INFO mapreduce.Job:  map 96% reduce 0%
19/02/28 16:42:44 INFO mapreduce.Job:  map 97% reduce 0%
19/02/28 16:42:45 INFO mapreduce.Job:  map 98% reduce 0%
19/02/28 16:42:46 INFO mapreduce.Job:  map 99% reduce 0%
19/02/28 16:42:48 INFO mapreduce.Job:  map 100% reduce 0%
19/02/28 16:43:11 INFO mapreduce.Job: Job job_1551343125387_0001 completed successfully
19/02/28 16:43:12 INFO mapreduce.Job: Counters: 37
    File System Counters
        FILE: Number of bytes read=0
        FILE: Number of bytes written=11931190
        FILE: Number of read operations=0
        FILE: Number of large read operations=0
        FILE: Number of write operations=0
        HDFS: Number of bytes read=8497
        HDFS: Number of bytes written=0
        HDFS: Number of read operations=100
        HDFS: Number of large read operations=0
        HDFS: Number of write operations=0
        OSS: Number of bytes read=0
        OSS: Number of bytes written=1099511600
        OSS: Number of read operations=1100
        OSS: Number of large read operations=0
        OSS: Number of write operations=500
......

运行distcp

从OSS往HDFS拷贝数据

[root@apache hadoop-2.7.2]# hadoop distcp oss://{your-bucket-name}/data hdfs:/data/input
19/03/05 09:43:59 INFO tools.DistCp: Input Options: DistCpOptions{atomicCommit=false, syncFolder=false, deleteMissing=false, ignoreFailures=false, maxMaps=20, sslConfigurationFile='null', copyStrategy='uniformsize', sourceFileListing=null, sourcePaths=[oss://{your-bucket-name}/data], targetPath=hdfs:/data/input, targetPathExists=false, preserveRawXattrs=false}
19/03/05 09:43:59 INFO client.RMProxy: Connecting to ResourceManager at apache/192.168.0.176:8032
19/03/05 09:44:00 INFO Configuration.deprecation: io.sort.mb is deprecated. Instead, use mapreduce.task.io.sort.mb
19/03/05 09:44:00 INFO Configuration.deprecation: io.sort.factor is deprecated. Instead, use mapreduce.task.io.sort.factor
19/03/05 09:44:01 INFO client.RMProxy: Connecting to ResourceManager at apache/192.168.0.176:8032
19/03/05 09:44:01 INFO mapreduce.JobSubmitter: number of splits:24
19/03/05 09:44:01 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1551343125387_0008
19/03/05 09:44:01 INFO impl.YarnClientImpl: Submitted application application_1551343125387_0008
19/03/05 09:44:01 INFO mapreduce.Job: The url to track the job: http://apache:8088/proxy/application_1551343125387_0008/
19/03/05 09:44:01 INFO tools.DistCp: DistCp job-id: job_1551343125387_0008
19/03/05 09:44:01 INFO mapreduce.Job: Running job: job_1551343125387_0008
19/03/05 09:44:07 INFO mapreduce.Job: Job job_1551343125387_0008 running in uber mode : false
19/03/05 09:44:07 INFO mapreduce.Job:  map 0% reduce 0%
19/03/05 09:44:16 INFO mapreduce.Job:  map 4% reduce 0%
19/03/05 09:44:19 INFO mapreduce.Job:  map 8% reduce 0%
......
19/03/05 09:45:11 INFO mapreduce.Job:  map 96% reduce 0%
19/03/05 09:45:12 INFO mapreduce.Job:  map 100% reduce 0%
19/03/05 09:45:13 INFO mapreduce.Job: Job job_1551343125387_0008 completed successfully
19/03/05 09:45:13 INFO mapreduce.Job: Counters: 38
    File System Counters
        FILE: Number of bytes read=0
        FILE: Number of bytes written=2932262
        FILE: Number of read operations=0
        FILE: Number of large read operations=0
        FILE: Number of write operations=0
        HDFS: Number of bytes read=24152
        HDFS: Number of bytes written=1099511600
        HDFS: Number of read operations=898
        HDFS: Number of large read operations=0
        HDFS: Number of write operations=251
        OSS: Number of bytes read=1099511600
        OSS: Number of bytes written=0
        OSS: Number of read operations=2404
        OSS: Number of large read operations=0
        OSS: Number of write operations=0
......

[root@apache hadoop-2.7.2]# hadoop fs -ls hdfs:/data
Found 1 items
drwxr-xr-x   - root supergroup          0 2019-03-05 09:45 hdfs:///data/input

从HDFS往OSS拷贝数据

[root@apache hadoop-2.7.2]# hadoop distcp hdfs:/data/input oss://{your-bucket-name}/data/output
19/03/05 09:48:06 INFO tools.DistCp: Input Options: DistCpOptions{atomicCommit=false, syncFolder=false, deleteMissing=false, ignoreFailures=false, maxMaps=20, sslConfigurationFile='null', copyStrategy='uniformsize', sourceFileListing=null, sourcePaths=[hdfs:/data/input], targetPath=oss://{your-bucket-name}/data/output, targetPathExists=false, preserveRawXattrs=false}
19/03/05 09:48:06 INFO client.RMProxy: Connecting to ResourceManager at apache/192.168.0.176:8032
19/03/05 09:48:06 INFO Configuration.deprecation: io.sort.mb is deprecated. Instead, use mapreduce.task.io.sort.mb
19/03/05 09:48:06 INFO Configuration.deprecation: io.sort.factor is deprecated. Instead, use mapreduce.task.io.sort.factor
19/03/05 09:48:07 INFO client.RMProxy: Connecting to ResourceManager at apache/192.168.0.176:8032
19/03/05 09:48:07 INFO mapreduce.JobSubmitter: number of splits:24
19/03/05 09:48:08 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1551343125387_0009
19/03/05 09:48:08 INFO impl.YarnClientImpl: Submitted application application_1551343125387_0009
19/03/05 09:48:08 INFO mapreduce.Job: The url to track the job: http://apache:8088/proxy/application_1551343125387_0009/
19/03/05 09:48:08 INFO tools.DistCp: DistCp job-id: job_1551343125387_0009
19/03/05 09:48:08 INFO mapreduce.Job: Running job: job_1551343125387_0009
19/03/05 09:48:14 INFO mapreduce.Job: Job job_1551343125387_0009 running in uber mode : false
19/03/05 09:48:14 INFO mapreduce.Job:  map 0% reduce 0%
19/03/05 09:48:24 INFO mapreduce.Job:  map 4% reduce 0%
19/03/05 09:48:27 INFO mapreduce.Job:  map 8% reduce 0%
......
19/03/05 09:49:18 INFO mapreduce.Job:  map 92% reduce 0%
19/03/05 09:49:20 INFO mapreduce.Job:  map 96% reduce 0%
19/03/05 09:49:21 INFO mapreduce.Job:  map 100% reduce 0%
19/03/05 09:49:22 INFO mapreduce.Job: Job job_1551343125387_0009 completed successfully
19/03/05 09:49:22 INFO mapreduce.Job: Counters: 38
    File System Counters
        FILE: Number of bytes read=0
        FILE: Number of bytes written=2932910
        FILE: Number of read operations=0
        FILE: Number of large read operations=0
        FILE: Number of write operations=0
        HDFS: Number of bytes read=1099535478
        HDFS: Number of bytes written=0
        HDFS: Number of read operations=548
        HDFS: Number of large read operations=0
        HDFS: Number of write operations=48
        OSS: Number of bytes read=0
        OSS: Number of bytes written=1099511600
        OSS: Number of read operations=1262
        OSS: Number of large read operations=0
        OSS: Number of write operations=405
......

[root@apache hadoop-2.7.2]# hadoop fs -ls oss://{your-bucket-name}/data/output
Found 101 items
-rw-rw-rw-   1 root root          0 2019-03-05 09:48 oss://{your-bucket-name}/data/output/_SUCCESS
-rw-rw-rw-   1 root root   10995200 2019-03-05 09:48 oss://{your-bucket-name}/data/output/part-m-00000
-rw-rw-rw-   1 root root   10995100 2019-03-05 09:48 oss://{your-bucket-name}/data/output/part-m-00001
......

参考链接

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

 

 

 

 

 

 

背景

2017.12.13日Apache Hadoop3.0.0正式版本发布,默认支持阿里云OSS对象存储系统,作为Hadoop兼容的文件系统。

OSS是中国云计算厂商第一个也是目前唯一一个被Hadoop官方版本支持的云存储系统。这是继Docker支持阿里云存储以后,又一个更重大的里程碑。这是阿里云与社区、Intel等伙伴共同合作的成果。同时,也体现了主流开源社区对中国的技术生态,对中国云计算行业发展成果的认可。

这意味着全球用户在使用Hadoop这一开源软件时,都可以无缝连接阿里云的OSS对象存储文件系统。Hadoop生态的离线、交互、数据仓库、深度学习等程序,可以在不需要改代码的情况下,自由读写OSS的对象存储。

用户只需要简单的配置,就可以在Hadoop应用中使用OSS。下面举例介绍如何在Hadoop3.0中,使用OSS。

如何使用

Hadoop集群搭建

首先,我们需要搭建Hadoop集群,搭建步骤如下,具体可参考官方文档。如已经创建Hadoop集群,则可跳过。

配置hostname

配置各个机器的hostname,这个用户可以自由选择自己喜欢的名称。对于集群规模不大的情况,可以使用master, slave01, slave02…修改完成之后,可以使用hostname命令判断是否执行成功

修改/etc/hosts

修改各个机器上/etc/hosts文件, 在各个节点上打开文件:vim /etc/hosts
在文件最后添加如下内容,注意下面的IP地址要替换为实际环境的局域网IP地址, 例如:

192.168.1.1    master
192.168.1.2    slave01
192.168.1.3    slave02

SSH免密登录

Hadoop集群需要机器之间实现ssh直连,既不需要密码。实现方式通过将各个机器上的密钥(~/.ssh/id_rsa.pub)分到给对方机器的~/.ssh/authorized_keys文件中去

安装Java(所有节点)

下载JDK(以jdk1.8.0_15为例), 解压至/usr/lib/(以安装至该目录为例)
修改环境变量, 打开文件 vim ~/.bashrc

export JAVA_HOME=/usr/lib/jdk1.8.0_15/
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin

使配置生效 : source ~/.bashrc
验证配置是否生效 : 
执行命令java -version,返回正确版本。

集群安装配置

可以参考Hadoop Cluster Setup进行Hadoop集群安装配置

阿里云OSS支持

Hadoop集群搭建好之后,为了能使Hadoop读写阿里云OSS,只需要修改极少的配置文件即可。

core_site.xml配置修改

$HADOOP_HOME/etc/hadoop/core_site.xml文件的配置内容,须增加的配置如下:
configuration标签中加入如下内容:
注意把fs.oss.endpoint、fs.oss.accessKeyId、fs.oss.accessKeySecret属性对应的的值设置为您自己的OSS Bucket的Endpoint和AK内容

<property>
      <name>fs.oss.endpoint</name>
      <value>YourEndpoint</value>
      <description>Aliyun OSS endpoint to connect to. </description>
    </property>
    <property>
      <name>fs.oss.accessKeyId</name>
      <value>YourAccessKeyId</value>
      <description>Aliyun access key ID</description>
    </property>

    <property>
      <name>fs.oss.accessKeySecret</name>
      <value>YourAccessKeySecret</value>
      <description>Aliyun access key secret</description>
    </property>
    <property>
      <name>fs.oss.impl</name>
      <value>org.apache.hadoop.fs.aliyun.oss.AliyunOSSFileSystem</value>
    </property>
    <property>
      <name>fs.oss.buffer.dir</name>
      <value>/tmp/oss</value>
    </property>

hadoop-env.sh配置修改

打开文件: vim $HADOOP_HOME/etc/hadoop/hadoop-env.sh
在相应位置增加如下内容:

export HADOOP_OPTIONAL_TOOLS="hadoop-aliyun"

修改完成之后,重启Hadoop集群。

Hadoop读写OSS验证

完成上面的设置后,就可以在Hadoop中读写OSS了,享受到OSS的海量、弹性、自动扩容伸缩等优势。为了测试Hadoop能否从OSS读写文件,可以做如下的测试:

# 测试写
$HADOOP_HOME/bin/hadoop fs -mkdir oss://{your-bucket-name}/hadoop-test
# 测试读
$HADOOP_HOME/bin/hadoop fs -ls oss://${your-bucket-name}/
<think>好的,我现在需要回答用户的问题:“安装Hive之前必须先安装Hadoop吗?” 首先,我需要回顾Hive的基本架构和依赖关系。Hive是基于Hadoop构建的数据仓库工具,它使用HDFS作为存储,并依赖MapReduce、Tez或Spark作为计算引擎。因此,理论上Hive需要Hadoop环境才能运行。 不过,用户可能想知道是否存在例外情况,比如是否可以在没有完整Hadoop安装的情况下使用Hive。比如,是否可以使用其他存储系统替代HDFS,或者使用本地模式运行Hive而无需Hadoop集群。我需要查阅Hive的官方文档或可靠资料,确认这些可能性。 根据Apache Hive官方文档,Hive确实需要Hadoop支持,因为它的元数据存储和数据处理都依赖于Hadoop组件。尤其是在生产环境中,Hive必须与Hadoop集成。但可能存在本地模式(Local Mode)的配置,允许在单机上运行而不需要启动完整的Hadoop集群,这种情况下可能只需要Hadoop库文件,而不需要Hadoop服务运行。这通常用于开发和测试,而不是生产环境。 另外,用户可能关心安装Hive的具体步骤是否需要先配置Hadoop,或者是否可以同时安装。需要明确Hive的安装流程,是否在安装过程中会检查Hadoop的存在。比如,Hive的配置文件需要指向Hadoop的安装目录,因此在安装Hive之前,Hadoop必须已经安装并配置好。 可能还需要提到Hive的不同版本对Hadoop版本的兼容性要求,比如某些Hive版本可能需要特定版本的Hadoop。这也是安装前需要考虑的因素。 总结:虽然Hive设计上依赖Hadoop,但可能存在本地模式的特殊情况,不过通常来说,安装Hive前必须先安装并配置好Hadoop。需要明确说明这一点,并解释原因,同时提到可能的例外情况及其适用场景。</think>--- ### **安装 Hive 前必须安装 Hadoop 吗?** 是的,**安装 Hive 前必须安装 Hadoop**,但需根据具体使用场景区分以下两种情况: --- #### **一、生产环境:必须依赖 Hadoop** 1. **核心依赖关系** - **HDFS**:Hive 默认将数据存储在 HDFS(Hadoop 分布式文件系统)中,表数据文件实际保存在 HDFS 路径下。 - **计算引擎**:Hive 的查询任务需要通过 MapReduce、Tez 或 Spark 执行,而这些引擎依赖 Hadoop 集群的资源调度(YARN)和分布式计算能力。 - **元数据存储**:Hive 的元数据(如表名、列类型)通常存储在外部数据库(如 MySQL),但数据本身的读写和计算离不开 Hadoop。 2. **典型安装流程** ```plaintext 安装 JDK → 安装 Hadoop → 配置 Hadoop 集群 → 安装 Hive → 配置 Hive 连接 Hadoop ``` --- #### **二、本地测试模式(无需 Hadoop 集群)** 1. **适用场景** - 仅用于学习或简单测试,无需处理大规模数据。 - 支持在单机环境下运行,但功能受限。 2. **限制条件** - **依赖 Hadoop 库文件**:即使不启动 Hadoop 集群,Hive 仍需调用 Hadoop 的 JAR 包(如 `hadoop-common.jar`)来解析 HDFS 路径和本地文件系统操作。 - **数据存储本地化**:数据可保存在本地文件系统(而非 HDFS),但无法使用分布式计算能力,性能极低。 - **不支持完整功能**:分区、分桶等依赖分布式存储的特性可能无法正常使用。 3. **本地模式安装示例** - 安装 Hadoop 库文件(无需启动集群): ```bash # 从 Apache Hadoop 官网下载二进制包并解压 tar -xzf hadoop-3.x.x.tar.gz # 设置环境变量 export HADOOP_HOME=/path/to/hadoop-3.x.x ``` - 安装 Hive 并配置使用本地模式: ```bash # 从 Apache Hive 官网下载二进制包并解压 tar -xzf apache-hive-3.x.x-bin.tar.gz # 设置环境变量 export HIVE_HOME=/path/to/apache-hive-3.x.x-bin ``` --- #### **三、特殊情况:使用其他存储系统** - **替代 HDFS 的存储系统**(如 Amazon S3、阿里云 OSS) 若 Hadoop 配置为对接云存储(需启用 `hadoop-aws` 等模块),Hive 可直接读写云存储数据,但底层仍需依赖 Hadoop 的兼容性接口。 **注意**:这仍属于 Hadoop 生态的扩展使用,并非完全脱离 Hadoop。 --- #### **四、总结** | **场景** | **是否需安装 Hadoop** | **说明** | |-------------------|-----------------------|---------------------------------------| | 生产环境 | ✅ 必须 | 依赖 HDFS、YARN、计算引擎等核心组件 | | 本地测试模式 | ✅ 需 Hadoop 库文件 | 无需启动集群,但需 JAR 包支持 | | 替代存储(如 S3) | ✅ 需 Hadoop 配置 | 依赖 Hadoop 的存储接口实现 | **结论**: - **Hive 的设计初衷是作为 Hadoop 生态的查询工具**,因此安装前必须确保 Hadoop 环境可用(生产环境需完整集群,本地模式需库文件)。 - 若仅想体验 Hive 的 SQL 语法,可尝试 **Docker 快速部署** 或 **云托管服务**(如 Amazon EMR),避免手动安装 Hadoop
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值