33 字
1 分钟
Linux bash脚本练习
批量上传文件到HDFS
#!/bin/bash
LOCAL_SOURCE_DIR="/data/local_files" # 本地源文件目录HDFS_TARGET_DIR="/user/hadoop/batch_uploads" # hdfs目标目录FILE_FILTER="*.txt" # 文件过滤模式
LOG_FILE="./hdfs_upload_$(date +%Y%m%d).log" # 日志文件路径
echo "=== 批量上传开始于 $(date) ===" >> $LOG_FILE
if [ ! -d "LOCAL_SOURCE_DIR" ]; then echo "error: 本地目录 $LOCAL_SCOURCE_DIR 不存在!" | tee -a $LOG_FILE exit 1fi
if ! hdfs dfs -test -d "$HDFS_TARGET_DIR"; then echo "HDFS目录 $HDFS_TARGET_DIR 不存在,正在创建..." | tee -a $LOG_FILE hdfs dfs -mkdir -p "$HDFS_TARGET_DIR"; if [ $? -ne 0 ]; then echo "error: Failed to create HDFS directory." | tee -a $LOG_FILE exit 1 fifi
echo "开始上传文件(过滤条件:$FILE_FILTER)..." | tee -a $LOG_FILE
file_count=0success_count=0fail_count=0
for local_file in "$LOCAL_SCOURCE_DIR"/$FILE_FILTER; do if [ -f "$local_file" ]; then ((file_count++))
filename=$(base "local_file") echo "正在上传:$filename" | tee -a $LOG_FILE
hdfs dfs -put "$local_file" "$HDFS_TARGET_DIR/$filename"
if [ $? -eq 0 ]; then ((success_count++)) echo "Success: ${filename} uploaded succesfully" | tee -a $LOG_FILE else ((fail_count++)) echo "Failure: Failed to upload ${filename}" | tee -a $LOG_FILE fi fidone
echo "=== 批量上传结束于 $(date) ===" | tee -a $LOG_FILE## ${变量名} $(命令)echo "Total files: ${file_count}, succeed: ${success_count},failed: $fail_count" | tee -a $LOG_FILEecho "HDFS target directory: $(hdfs dfs -ls ${HDFS_TARGET_DIR})" | tee -a $LOG_FILEecho "Log file: ${LOG_FILE}" | tee -a $LOG_FILE批量下载文件到HDFS
#!/bin/bash
HDFS_SOURCE_DIR="/root/hadoop/batch_uploads"LOCAL_TARGET_DIR="/data/downloaded_files"LOG_FILE="./hdfs_download_$(date +%Y%m%d).log"
echo "=== Batch download started at $(date) ===" >> $LOG_FILE
mkdir -p "$LOCAL_TARGET_DIR"
if [ $? -ne 0 ]; then echo "error: failed to create local directory: ${LOCAL_TARGET_DOR}" | tee -a $LOG_FILE exit 1fi
if ! hdfs dfs -test -d "$HDFS_SOURCE_DIR"; then echo "error: HDFS directory does not exist: ${HDFS_SOURCE_DIR}" | tee -a $LOG_FILE exit 1fi
echo "Downloading files..." | tee -a $LOG_FILE
file_count=0success_count=0fail_count=0skip_count=0
while read hdfs_file; do filename=$(basename "$hdfs_file") local_file="$LOCAL_TARGET_DIR/$filename"
if [ -f "local_file" ]; then ((skip_count++)) echo "skipped: ${filename} already exists locally" | tee -a $LOG_FILE continue fi
if [ -z "$hdfs_file" ];then ((skip_count++)) echo "skipped: empty HDFS file detected: ${hdfs_file}" | tee -a $LOG_FILE continue fi ((file_count++))
echo "downloading: ${filename}" | tee -a $LOG_FILE hdfs dfs -get "$hdfs_file" "$local_file"
if [ $? -eq 0 ]; then ((success_count++)) echo "Success: ${filename} downloaded successful" | tee -a $LOG_FILE else ((fail_count++)) echo "Failure: ${filename} Failed to download" | tee -a $LOG_FILE fidone < <(hdfs dfs -ls "$HDFS_SOURCE_DIR" | grep -v "^d" | awk '{print $8}')
echo "=== batch download ended at $(date) ===" | tee -a $LOG_FILEecho "total: ${file_count},success: ${success_count},failure:${fail_count},skipped:${skip_count}" | tee -a $LOG_FILEecho "log file: $LOG_FILE" | tee -a $LOG_FILE批量清除HDFS中的文件
#!/bin/bash
HDFS_DIR="/user/root/batch_uploads"RETENTION_DAYS=7LOG_FILE="cleanup_log.txt"
echo "starting cleanup at $(date)" | tee -a $LOG_FILE
hdfs dfs -ls $HDFS_DIR | grep -v "^d" | awk -v days=$RETENTION_DAYS '{ date_str = $6 " " $7 file = $8
"date -d \"" date_str "\" +%s" | getline cutoff_ts
if(file_ts < cutoff_ts) {
print "Delete old file: " file system("hdfs dfs -rm " file " >> '${LOG_FILE}' 2>&1)
}}'
echo "Cleanup completed at $(date)" | tee -a $LOG_FILE随机生成测试文件
#!/bin/bash
LOCAL_SOURCE_DIR="/data/local_files"
if [ ! -d "$LOCAL_SOURCE_DIR" ]; then echo "warn: 本地目录 $LOCAL_SOURCE_DIR 不存在!" mkdir -p "LOCAL_SOURCE_DIR"fi
echo "HDFS commend line test" > local_test.txtmkdir -p local_datafor i in {1..5};do echo "Test file $i" > "${LOCAL_SOURCE_DIR}/file${i}.txt";done 分享
如果这篇文章对你有帮助,欢迎分享给更多人!
Linux bash脚本练习
https://blog.hydrodyio.xyz/posts/linux-bash脚本练习/ 部分信息可能已经过时
相关文章 智能推荐








