hadoop 之 libhdfs

Hadoop 3.2.2

libhdfs/hdfs.c

struct hdfsFile_internal {void* file;enum hdfsStreamType type;int flags;
};

以上数据结构中的 flags 是由以下接口赋值

hdfsFile hdfsOpenFile(hdfsFS fs, const char *path, int flags,int bufferSize, short replication, tSize blockSize)
{struct hdfsStreamBuilder *bld = hdfsStreamBuilderAlloc(fs, path, flags);if (bufferSize != 0) {hdfsStreamBuilderSetBufferSize(bld, bufferSize);}if (replication != 0) {hdfsStreamBuilderSetReplication(bld, replication);}if (blockSize != 0) {hdfsStreamBuilderSetDefaultBlockSize(bld, blockSize);}return hdfsStreamBuilderBuild(bld);
}
int hdfsFileUsesDirectRead(hdfsFile file)
{return !!(file->flags & HDFS_FILE_SUPPORTS_DIRECT_READ);
}void hdfsFileDisableDirectRead(hdfsFile file)
{file->flags &= ~HDFS_FILE_SUPPORTS_DIRECT_READ;
}
static hdfsFile hdfsOpenFileImpl(hdfsFS fs, const char *path, int flags,int32_t bufferSize, int16_t replication, int64_t blockSize)
{
...
if ((flags & O_WRONLY) == 0) {// Try a test read to see if we can do direct readschar buf;if (readDirect(fs, file, &buf, 0) == 0) {// Success - 0-byte read should return 0file->flags |= HDFS_FILE_SUPPORTS_DIRECT_READ;} else if (errno != ENOTSUP) {// Unexpected error. Clear it, don't set the direct flag.fprintf(stderr,"hdfsOpenFile(%s): WARN: Unexpected error %d when testing ""for direct read compatibility\n", path, errno);}}
...
}

hadoop 3.3.1

hadoop 3.3.1 版本该接口实现代码已经修改,
相关commit: https://github.com/apache/hadoop/pull/597/files#diff-c1385f6f8f4422f3f22bd28edd3123209d551e513b73429e58dd7c3d3350f59d

if ((flags & O_WRONLY) == 0) {// Check the StreamCapabilities of jFile to see if we can do direct// readsif (hdfsHasStreamCapability(jFile, "in:readbytebuffer")) {file->flags |= HDFS_FILE_SUPPORTS_DIRECT_READ;}// Check the StreamCapabilities of jFile to see if we can do direct// preadsif (hdfsHasStreamCapability(jFile, "in:preadbytebuffer")) {file->flags |= HDFS_FILE_SUPPORTS_DIRECT_PREAD;}}
判断一个数据流是否具备某个接口的能力

org.apache.hadoop.fs.FSDataInputStream.java

  @Overridepublic boolean hasCapability(String capability) {return StoreImplementationUtils.hasCapability(in, capability);}

org.apache.hadoop.fs.impl.StoreImplementationUtils.java

  /*** Probe for an input stream having a capability; returns true* if the stream implements {@link StreamCapabilities} and its* {@code hasCapabilities()} method returns true for the capability.* @param in input stream* @param capability capability to probe for* @return true if the stream declares that it supports the capability.*/public static boolean hasCapability(InputStream in, String capability) {return objectHasCapability(in, capability);}

这里 子 流 不是 StreamCapabilities, 直接返回的是 false

  /*** Probe for an object having a capability; returns true* if the stream implements {@link StreamCapabilities} and its* {@code hasCapabilities()} method returns true for the capability.* This is a package private method intended to provided a common* implementation for input and output streams.* {@link StreamCapabilities#hasCapability(String)} call is for public use.* @param object object to probe.* @param capability capability to probe for* @return true if the object implements stream capabilities and* declares that it supports the capability.*/static boolean objectHasCapability(Object object, String capability) {if (object instanceof StreamCapabilities) {return ((StreamCapabilities) object).hasCapability(capability);}return false;}
Demo 测试
$ cat test_libhdfs_read.c#include "hdfs.h" #include <stdio.h>
#include <stdlib.h>
#include <iostream>int main(int argc, char **argv) {hdfsFS fs;const char *rfile = argv[1];tSize bufferSize = strtoul(argv[3], NULL, 10);hdfsFile readFile;char* buffer;tSize curSize;if (argc != 4) {fprintf(stderr, "Usage: hdfs_read <filename> <filesize> <buffersize>\n");exit(-1);}//fs = hdfsConnect("default", 0);fs = hdfsConnect("cosn://xiangx-guigu-1258469122", 0);if (!fs) {fprintf(stderr, "Oops! Failed to connect to hdfs!\n");exit(-1);} readFile = hdfsOpenFile(fs, rfile, O_RDONLY, bufferSize, 0, 0);std::cout << "readFile: " << readFile << std::endl;if (!readFile) {std::cout << "Failed to open: "  << std::endl;fprintf(stdout, "Failed to open %s for writing!\n", rfile);fprintf(stderr, "Failed to open %s for writing!\n", rfile);exit(-2);}buffer = (char*)malloc(sizeof(char) * bufferSize);if(buffer == NULL) {return -2;}curSize = bufferSize;for (; curSize == bufferSize;) {curSize = hdfsRead(fs, readFile, (void*)buffer, curSize);}free(buffer);hdfsCloseFile(fs, readFile);hdfsDisconnect(fs);std::cout << "curSize: " << curSize << std::endl;return 0;
}
  • 编译命令
g++ test_libhdfs_read.c -I$HADOOP_HOME/include -L$HADOOP_HOME/lib/native -L/usr/local/jdk/jre/lib/amd64/server/ -lhdfs -ljvm -o test_libhdfs_read -Wl,-rpath,/usr/local/jdk/jre/lib/amd64/server/
  • 运行命令
export CLASSPATH=`hadoop classpath --glob`
./test_libhdfs_read cosn://xxx/testdata/testparquet/part-00000-4a31a445-8104-402e-ad60-486fba4ae5f6-c000-f8f4776d-5003-4888-872f-c9567471b5f5.snappy.parquet 100 100
readDirect: FSDataInputStream#read error:
UnsupportedOperationException: Byte-buffer read unsupported by input streamjava.lang.UnsupportedOperationException: Byte-buffer read unsupported by input streamat org.apache.hadoop.fs.FSDataInputStream.read(FSDataInputStream.java:150)
readFile: 0x33cd8b0
curSize: 99

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/21567.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue3+vant4 二次封装IndexBar城市列表组件以及性能优化

前言 二次封装城市列表以及对静态资源的引入做异步引入优化。 版本号: vue3.3 vant4 效果图 数据源 城市列表 city.json 永久网盘链接 链接&#xff1a;https://pan.baidu.com/s/10E-b441-4P7mjvomlJhm0g 提取码&#xff1a;m92c 字段大致讲解 indexList &#xff1a;每个字…

开窗函数!

开窗函数&#xff08;Window Function&#xff09;是SQL中的一种高级功能&#xff0c;允许你在一组相关行&#xff08;一个“窗口”&#xff09;上执行聚合操作&#xff0c;而不像传统聚合函数&#xff08;如SUM(), AVG(), COUNT()&#xff09;那样将所有匹配行合并成单个汇总行…

数据库的设计,为什么那么重要?#PostgreSQL培训

良好的数据库设计能够确保数据的完整性和准确性。 通过减少冗余、优化查询和确保数据一致性&#xff0c;可以降低系统出现故障的可能性&#xff0c;从而减少修复和维护的时间和成本。 良好的数据库设计可以确保数据的合规性&#xff0c;并降低因违反法规而面临的罚款和诉讼风险…

人机交互中的阴差阳错

人机交互是一门研究系统与用户之间的交互关系的学问。它旨在设计和实现使人们能够与计算机系统进行有效交互的方法和技术。人机交互领域研究的热门话题之一就是人工智能。另一个热门话题就是增强现实&#xff08;Augmented Reality&#xff09;和虚拟现实&#xff08;Virtual R…

算法训练 | 回溯算法Part3 | 39.组合总和、40.组合总和II、131.分割回文串

目录 39.组合总和 回溯法 40.组合总和II 回溯法 131.分割回文串 回溯法 39.组合总和 题目链接&#xff1a;39. 组合总和 - 力扣&#xff08;LeetCode&#xff09; 文章讲解&#xff1a;programmercarl.com 回溯法 解题思路 本题没有数量要求&#xff0c;可以无限重复…

【java11】java11新特性之局部变量类型推断升级

局部变量类型推断是java10开始新增的新特性&#xff0c;java11中对局部变量推断进行了升级&#xff0c;var支持添加注解的语法格式&#xff0c;Java10中是无法实现的&#xff0c;在Java11中加入了这样的语法。 Lambda中使用var修饰符 Java11允许在lambda表达式中使用var&…

大数据的数据采集

大数据采集是指从各种来源收集大量数据的过程&#xff0c;这些数据通常是结构化或非结构化的&#xff0c;并且可能来自不同的平台、设备或应用程序。大数据采集是大数据分析和处理的第一步&#xff0c;对于企业决策、市场分析、产品改进等方面具有重要意义。以下是大数据采集的…

Vue3项目炫酷实战,检测密码强度值

在前端项目开发中&#xff0c;确保用户密码的强度是保护账户安全的重要措施。本文将演示如何使用Vue 3实现一个简单的密码强度检测功能。通过实时反馈&#xff0c;帮助用户创建更安全的密码&#xff0c;从而提升整体系统的安全性。无论您是前端开发新手还是经验丰富的开发者&am…

从GPT-4到GPT-4o:人工智能的进化与革命

从GPT-4到GPT-4o&#xff1a;人工智能的进化与革命 活动介绍 近期&#xff0c;OpenAI推出了最新版本的人工智能模型——GPT-4o&#xff0c;引发了广泛的关注和讨论。在这篇文章中&#xff0c;我们将对GPT-4o进行全面评价&#xff0c;包括与前一版本GPT-4的对比分析&#xff0…

横空出世GPT-4o究竟有什么魅力吸引我们?

目录 如何评价GPT-4o? 方向一&#xff1a;对比分析 GPT-4o是OpenAI最新发布的语言模型&#xff0c;相较于其前身GPT-4&#xff0c;具有以下显著区别和提升&#xff1a; 方向二&#xff1a;技术能力 GPT-4o在语言生成和理解方面展示了卓越的技术能力&#xff1a; 方向三&…

与5月汽车销量共舞:MK米客方德SD NAND助力车载T-box

上周末&#xff0c;各家车企集体公布5月销量数据&#xff0c;新能源车龙头比亚迪单月销量遥遥领先&#xff0c;数据显示&#xff0c;比亚迪5月新能源汽车销量33.18万辆&#xff0c;上年同期销量24.02万辆。1至5月&#xff0c;比亚迪新能源汽车销量累计127.13万辆&#xff0c;同…

重生之 SpringBoot3 入门保姆级学习(17、整合SSM)

重生之 SpringBoot3 入门保姆级学习&#xff08;17、整合SSM&#xff09; 4、数据访问4.1 整合 ssm 4、数据访问 4.1 整合 ssm pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" …

指针的认识(指针变量类型意义、指针运算)

目录 一、指针变量类型的意义 a.通过指针的解引用理解类型意义 b.void* 类型指针 c.const修饰的指针变量 c.1 const放在*号左边​编辑 c.2 const放在*号右边 二、指针运算 a.指针-整数 ​编辑 b.指针 - 指针 ​编辑 c.指针的关系运算 一、指针变量类型的意义 指针变…

【Python】pandas的loc使用方法

缘分让我们相遇乱世以外 命运却要我们危难中相爱 也许未来遥远在光年之外 我愿守候未知里为你等待 我没想到为了你我能疯狂到 山崩海啸没有你根本不想逃 我的大脑为了你已经疯狂到 脉搏心跳没有你根本不重要 &#x1f3b5; 邓紫棋《光年之外》 当你处理数…

【学习】软件测试中如何进行Web网页兼容性测试

在数字时代&#xff0c;Web网页作为信息传递和交流的重要平台&#xff0c;其稳定性和用户体验至关重要。如同一位匠人细致打磨他的工艺品&#xff0c;开发者亦需精心测试网页的兼容性&#xff0c;确保其在各种设备和浏览器上的表现无懈可击。今天&#xff0c;我们就来探讨如何对…

SpringBoot+百度地图+Mysql实现中国地图可视化

通过SpringBoot百度地图Mysql实现中国地图可视化 一、申请百度地图的ak值 进入百度开发者平台 编辑以下内容 然后申请成功 二、Springboot写一个接口 确保数据库里有数据 文件目录如下 1、配置application.properties文件 #访问端口号 server.port9090 # 数据库连接信息 spr…

如何高效管理自己的时间,可以从这几个方向着手

如果你是上班族&#xff0c;天选打工人&#xff0c;你的绝大多数时间都属于老板&#xff0c;能够自己支配的时间其实并不多&#xff0c;所以你可能察觉不到时间管理的重要性。 但如果你是自由职业者或者创业者&#xff0c;想要做出点成绩&#xff0c;那你就需要做好时间管理&am…

ImageButton src图片会照成内存泄露吗 会使native内存增加吗?

在Android开发中&#xff0c;ImageButton 是用来显示按钮的视图组件&#xff0c;它通常用于显示图标或图片。对于ImageButton使用的src属性&#xff08;即按钮上的图片&#xff09;通常不会导致内存泄漏&#xff0c;但是有几种情况可能会导致内存问题&#xff1a; 1. **不正确…

NVIDIA发布重磅AI创新,黄仁勋在COMPUTEX大会预示计算未来

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Facebook开户|Facebook广告投放指南

家人们中午好~今天的文章由我们帅气逼人的大帅哥Zoey为大家分享&#xff08;狗头&#xff09;~有想要通过Facebook广告掘金的家人们&#xff01;今天就跟大家分享一下Facebook广告投放的底层逻辑和实用技巧&#xff0c;帮助大家少走弯路&#xff0c;快速入门~ 基础知识&#x…