我创建了一个包含 3 个存储桶的表,并将一些数据加载到其中。
create table testBucket (id int,name String)
partitioned by (region String)
clustered by (id) into 3 buckets;
Run Code Online (Sandbox Code Playgroud)
我也设置了分桶属性。 $set hive.enforce.bucketing=true;
但是当我在 HDFS 中列出表文件时,我可以看到创建了 3 个文件,正如我提到的 3 个存储桶。但是数据仅加载到一个文件中,其余 2 个文件只是空的。所以我很困惑为什么我的数据被加载到唯一的文件中?
那么有人可以解释一下数据分布在分桶中是如何发生的吗?
[test@localhost user]$ hadoop fs -ls /user/hive/warehouse/database2.db/buckettab/region=USA
Found 3 items
-rw-r--r-- 1 user supergroup 38 2016-06-27 08:34 /user/hive/warehouse/database2.db/buckettab/region=USA/000000_0
-rw-r--r-- 1 user supergroup 0 2016-06-27 08:34 /user/hive/warehouse/database2.db/buckettab/region=USA/000001_0
-rw-r--r-- 1 user supergroup 0 2016-06-27 08:34 /user/hive/warehouse/database2.db/buckettab/region=USA/000002_0
Run Code Online (Sandbox Code Playgroud) 我使用以下命令在 hdfs 中创建了一个文件
hdfs dfs -touchz /hadoop/dir1/file1.txt
Run Code Online (Sandbox Code Playgroud)
我可以使用以下命令查看创建的文件
hdfs dfs -ls /hadoop/dir1/
Run Code Online (Sandbox Code Playgroud)
但是,我无法使用 linux 命令(使用 find 或 locate)找到位置本身。我在互联网上搜索并找到了以下链接。 如何访问 Hadoop HDFS 中的文件?. 它说,hdfs 是虚拟存储。在这种情况下,它如何划分哪个或需要使用多少,元数据存储在哪里
是否将我在 hdfs-site.xml 中提到的虚拟存储的 datanode 位置用于存储所有数据?
我查看了 datanode 位置,并且有可用的文件。但是我找不到与我创建的文件或文件夹相关的任何内容。
(我使用的是 hadoop 2.6.0)
我已经从http://docs.confluent.io/2.0.0/quickstart.html#quickstart下载了 kafka 连接
我正在尝试运行 hdfs 连接器。以下是设置:
连接standalone.properties:
bootstrap.servers=lvpi00658.s:9092,lvpi00659.s:9092,lvpi00660.s:9092
key.converter=org.apache.kafka.connect.storage.StringConverter
value.converter=org.apache.kafka.connect.storage.StringConverter
internal.key.converter=org.apache.kafka.connect.storage.StringConverter
internal.value.converter=org.apache.kafka.connect.storage.StringConverter
offset.storage.file.filename=/tmp/connect.offsets
# Flush much faster than normal, which is useful for testing/debugging
offset.flush.interval.ms=10000
key.deserializer=org.apache.kafka.common.serialization.StringDeserializer
value.deserializer=org.apache.kafka.common.serialization.StringDeserializer
Run Code Online (Sandbox Code Playgroud)
和
快速入门-hdfs.properties:
name=hdfs-sink
connector.class=io.confluent.connect.hdfs.HdfsSinkConnector
tasks.max=1
topics=eightball-stuff11
hdfs.url=hdfs://localhost:9000
flush.size=3
Run Code Online (Sandbox Code Playgroud)
我像这样运行 hdfs 连接器:
cd /home/fclvappi005561/confluent-3.0.0/bin
./connect-standalone ../etc/kafka-connect-hdfs/connect-standalone.properties ../etc/kafka-connect-hdfs/quickstart-hdfs.properties
但我收到一个错误:
[2016-09-12 17:19:28,039] 信息无法启动 HdfsSinkConnector: (io.confluent.connect.hdfs.HdfsSinkTask:72) org.apache.kafka.connect.errors.ConnectException: org.apache.hadoop。 security.AccessControlException: 权限被拒绝: user=lvpi005561, access=WRITE, inode="/topics":root:supergroup:drwxr-xr-x at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.check(FSPermissionChecker. java:319) 在 org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.check(FSPermissionChecker.java:292) 在 org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:213)在 org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:190) 在 org.apache.hadoop.hdfs.server.namenode.FSDirectory。checkPermission(FSDirectory.java:1698) at org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkPermission(FSDirectory.java:1682) at org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkAncestorAccess(FSDirectory. java:1665) 在 org.apache.hadoop.hdfs.server.namenode.FSDirMkdirOp.mkdirs(FSDirMkdirOp.java:71) 在 org.apache.hadoop.hdfs.server.namenode.FSNamesystem.mkdirs(FSNamesystem.java:3900)在 org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.mkdirs(NameNodeRpcServer.java:978) 在 org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.mkdirs(ClientNamenodeProtocolServerSideTranslatorPB.javaorg.apache.hadoop) …
如果我们有数百万个大小从几 KB 到几 MB 不等的小文本文件,那么 HDFS 和 HBASE 中的哪一个需要更少的处理时间?而且内存消耗更少?
我的 JSON 文件是一个时间戳字段,它采用 UNIX 上传时间戳格式,如1501580484655. 这将转换为格林威治标准时间:01-08-2017 9:41:24.655AM
我尝试将此时间戳转换为人类可读的时间格式,直到毫秒不起作用。
到目前为止,我已经尝试过以下方法:
1- select TO_DATE(1501580484655) from (VALUES(1));
O/P 2017-08-01到目前为止还可以,但我想要到毫秒。
2- select TO_DATE(1501580484655,'yyyy-MM-dd HH:mm:ss.SSS') from (VALUES(1));
O/P 是: Error: SYSTEM ERROR: IllegalArgumentException: Invalid format: "1501580484655" is malformed at "4655"
3- select TO_DATE(1501580484,'yyyy-MM-dd HH:mm:ss.SSS') from (VALUES(1));
O/P 是: Error: SYSTEM ERROR: IllegalArgumentException: Invalid format: "1501580484" is malformed at "4"
4- select TO_DATE(150158048,'yyyy-MM-dd HH:mm:ss.SSS') from (VALUES(1));
O/P 是: Error: SYSTEM ERROR: IllegalArgumentException: Invalid format: "150158048" is too short
5- SELECT TO_TIMESTAMP(1501580484655) …
我使用dstream.saveAsObjectFiles("/temObj")它在 hdfs 中显示多个文件的方法在火花流中保留了对象文件。
temObj-1506338844000
temObj-1506338848000
temObj-1506338852000
temObj-1506338856000
temObj-1506338860000
Run Code Online (Sandbox Code Playgroud)
阅读完所有文件后,我想删除所有 temObj 文件。在火花中做到这一点的最佳方式是什么?我试过
val hdfs = org.apache.hadoop.fs.FileSystem.get(new java.net.URI("hdfs://localhost:9000"), hadoopConf)
hdfs.delete(new org.apache.hadoop.fs.Path(Path), true)
Run Code Online (Sandbox Code Playgroud)
但它一次只能删除一个文件夹
我一直在本地集群上运行我的 Spark 作业,该集群具有从中读取输入和写入输出的 hdfs。现在我已经设置了一个 AWS EMR 和一个 S3 存储桶,我可以在其中输入我的输入,并且我希望我的输出也写入 S3。
错误:
用户类抛出异常:java.lang.IllegalArgumentException:错误 FS:s3://something/input,预期:hdfs://ip-some-numbers.eu-west-1.compute.internal:8020
我尝试搜索相同的问题,并且有几个关于此问题的问题。有人建议它仅用于输出,但即使我禁用输出,也会出现相同的错误。
另一个建议是有问题 FileSystem我的代码有问题。以下是我的程序中出现的所有输入/输出:
第一次发生在我的 customFileInputFormat中getSplits(JobContext job),我实际上并没有修改自己,但我可以:
FileSystem fs = path.getFileSystem(job.getConfiguration());
Run Code Online (Sandbox Code Playgroud)
类似的情况在我的自定义中RecordReader,我自己也没有修改过:
final FileSystem fs = file.getFileSystem(job);
Run Code Online (Sandbox Code Playgroud)
在nextKeyValue()我RecordReader自己写的习惯中,我使用:
FileSystem fs = FileSystem.get(jc);
Run Code Online (Sandbox Code Playgroud)
最后,当我想检测我使用的文件夹中的文件数时:
val fs = FileSystem.get(sc.hadoopConfiguration)
val status = fs.listStatus(new Path(path))
Run Code Online (Sandbox Code Playgroud)
我认为问题出在我的代码上,但是如何修改FileSystem调用以支持来自 S3 的输入/输出?
请帮助我理解 HDFS 的数据块和 Spark 中的 RDD 之间的区别。HDFS 将数据集分发到集群中的多个节点,因为具有相同大小的块和数据块将被多次复制并存储。RDD 被创建为并行化集合。Parallelized 集合的元素是跨节点分布还是存储在内存中进行处理?与 HDFS 的数据块有任何关系吗?
当我在 Zeppelin 中针对 AWS 中的 EMR 集群运行一些 PySpark 查询时,出现以下错误:
org.apache.hadoop.security.AccessControlException: Permission denied: user=zeppelin, access=WRITE, inode="/":hdfs:hadoop:drwxr-xr-x
Run Code Online (Sandbox Code Playgroud)
我想我可以给这个用户 (Zeppelin) 写权限,但用户已经在 HDFS (/user/zeppelin) 中有自己的主目录。为什么它试图写入根目录(“/”)。不过,我不太确定我是否正确解释了错误消息。
我有一个包含呼叫数据记录(CDR)的配置单元表。我在电话号码上对表进行了分区,并在 call_date 上进行了存储。现在,当我将数据插入配置单元时,过时的 call_date 正在我的存储桶中创建小文件,这导致名称节点元数据增加和性能下降。有没有办法将这些小文件合并成一个。
hdfs ×10
hadoop ×6
apache-spark ×2
hadoop2 ×2
hive ×2
amazon-emr ×1
amazon-s3 ×1
apache-drill ×1
apache-kafka ×1
bigdata ×1
filesystems ×1
hbase ×1
mapreduce ×1
performance ×1
rdd ×1
scala ×1